Git conflict 해결 경험
배경
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
- 직전 커밋 2개를 합쳐준다
- 충돌 후 해결
어떤 것을 pick 하고 어떤걸 squash
git log
를 통해 확인 가장 위쪽에 위치한 커밋이 가장 오래된 커밋 가장 아래쪽에 위치한 커밋이 가장 최근의 커밋
pick 1234567 Oldest commitpick 2345678pick 3456789pick 4567890pick 5678901pick 6789012pick 7890123pick 8901234 Most recent commit
git rebase -i HEAD~2
가장 최근 커밋을 pick 남기고나머지 커밋들을 squash 변경 -> pick 한 커밋에 나머지 커밋들을 합친다 (맨 위 커밋이 최신 커밋) 가장 최근 커밋이 기준이 되어 모든 이전 커밋이 이 커밋에 통합
pick 8901234 Most recent commits 7890123s 6789012s 5678901s 4567890s 3456789s 2345678s 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 하지 말아야 한다