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 commitgit 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 하지 말아야 한다