Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

Git conflict 해결 경험

GIT, 20225 min read

배경

github 에서 main 을 pull 받았을 때 충돌이 발생했다 변화된 내용이 만아 branch 에서 git pull origin main을 하고 코드를 병합했다. (merge) 모든 코드를 변경했는데 에러가 끝나지 않았다 병합을 끝내는 방법은 뭐지? 또한 업무에서는 gitLab 을 사용하고 있다. 그리고 conflict 가 발생하면 rebase 하고 있다 각각의 차의를 알아보고 gitLab 과 github 에서 왜 다르게 충돌을 해결하는지 궁금했다

병합을 끝내려면?

With Git 2.12 (Q1 2017), you will have the more natural command: How do I finish the merge after resolving my merge conflicts

글에서는 git merge --continue 를 실행하라고 했다 문제를 해결해서 다시 origin branch 로 push 하고 main 으로 머지했다.

conflict 은 뭐지?

특정 branch 에서 다른 branch 를 pull 받을때

지금까지 git rebase 는 언제 사용헸지?

git rebase -i HEAD~2

  1. 직전 커밋 2개를 합쳐준다
  2. 충돌 후 해결

어떤 것을 pick 하고 어떤걸 squash

  • git log 를 통해 확인 가장 위쪽에 위치한 커밋이 가장 오래된 커밋 가장 아래쪽에 위치한 커밋이 가장 최근의 커밋
pick 1234567 Oldest commit
pick 2345678
pick 3456789
pick 4567890
pick 5678901
pick 6789012
pick 7890123
pick 8901234 Most recent commit
  • git rebase -i HEAD~2

가장 최근 커밋을 pick 남기고나머지 커밋들을 squash 변경 -> pick 한 커밋에 나머지 커밋들을 합친다 (맨 위 커밋이 최신 커밋) 가장 최근 커밋이 기준이 되어 모든 이전 커밋이 이 커밋에 통합

pick 8901234 Most recent commit
s 7890123
s 6789012
s 5678901
s 4567890
s 3456789
s 2345678
s 1234567 Oldest commit

***tip: git 에서는 pull의 기본 설정이 rebase가 false로 되어있다. 이 부분에 대해 rebase가 true가 되도록 바꿔주는 설정작업이 필요하다

힌트: You have divergent branches and need to specify how to reconcile them.
힌트: You can do so by running one of the following commands sometime before
힌트: your next pull:
힌트:
힌트: git config pull.rebase false # merge
힌트: git config pull.rebase true # rebase
힌트: git config pull.ff only # fast-forward only
힌트:
힌트: You can replace "git config" with "git config --global" to set a default
힌트: preference for all repositories. You can also pass --rebase, --no-rebase,
힌트: or --ff-only on the command line to override the configured default per
힌트: invocation.
fatal: Need to specify how to reconcile divergent branches.

-> git config --global pull.rebase true 명령어로 config 설정함

github,gitLab 상관없이 이 git config 설정에 따라서 pull 했을 때 rebase 할지 merge 할지 선택 가능하다.

git conflict 이후에도 rebase --continue or merge --continue 를 해준다 왜?

rebase 를 통한 conflict 해결 방법Permalink

rebase vs merge 차이 정리

  • Git에서 한 브랜치에서 다른 브랜치로 합치는 방법에는 merge 와 rebase 가 있다
  • merge

    • master 브랜치에서 갈라져 나온 특정 브랜치를 master 브랜치에 합칠때 merge 사용
    • 3-way-merge 로 커밋 두 개(C3, C4)와 공통 조상(C2)을 사용하는 3-way Merge로 새로운 커밋을 만든다
    • Merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다.
  • rebase

    • rebase 명령으로 한 브랜치에서 변경된 사항을 다른 브랜치에 적용할 수 있다
    • Rebase는 보통 리모트 브랜치에 커밋을 깔끔하게 적용하고 싶을 때 사용
    • Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합친다
    • 로컬 브랜치에서 작업할 때는 히스토리를 정리하기 위해서 Rebase 할 수도 있지만, 리모트 등 어딘가에 Push로 내보낸 커밋에 대해서는 절대 Rebase 하지 말아야 한다
© 2024 by GwiyeomGo Tech Blog. All rights reserved.