git merge vs git rebase
git merge와 git rebase의 기능은 비슷하지만 다르다고 한다.
git merge 의 문제점
불필요한 merge commit 생성
모든 feature branch마다 "merge commit" 이 남습니다. 만약 main branch를 공유하는 개발자가 많고, 프로젝트의 규모가 크다면, branch history를 관리하기 어렵습니다.
복잡한 프로젝트 history
독립된 branch에서 로직 하나를 작성하고 수정하더라도, 다른 작업과 그 내역이 겹쳐 구분하기 어려워집니다.
git rebase 사용
Rebase는 내 commit의 base를 변경하여 commmit history를 일렬로 잘 정리해줍니다.
새로운 작업 완료 후 push 전
- main branch로 이동하여 remote main을 pull 한다.
- push 할 feature branch로 이동
git rebase -i main
을 진행
rebase하는 동안 squash 진행할 때에는
- 가장 오래된 commit을 pick 한다.
- 다른 commit message는 가장 오래된 commit 기준으로 squash 한다.(다른 커밋의 작업 내역이 없어지는 것이 아님)
- esc -> :wq! 로 창에서 빠져나온다.
수정용 에디터 추가
- 최종적으로 rebase된 commit의 내용을 작성하는 부분
- 현재까지 적은 commit message 전부 나타난다.
- 불필요한 내용을 제거하고 현재 수정 내역에 대한 commit message를 정성껏 작성
- esc -> :wq! 저장하고 에디터에서 빠져나온다.
(git log로 커밋 메시지 확인 가능하며 이후 push를 진행한다.)
rebase 후 push 하기
- rebase는 commit history를 정리하는 역할을 한다.
- 같은 branch에서 rebase를 할 때마다 history가 달라질 수 있다.
- 수정 사항이 추가로 생긴 후 다시 rebase하면 history가 무조건 달라진다.
- git은 history가 다른 branch의 push를 허용하지 않는다.
git push origin "branch name" -f
-f 옵션을 사용하여 force push를 진행한다.
rebase 중 충돌 해결하기
- 충돌이 일어난 경우 rebase가 도중에 멈춰 있다.
- 충돌이 일어난 코드를 수정 후
git add .
- git commit은 수정사항이 없으므로 진행하지 않는다.
git rebase --continue
- 중단된 rebase 진행된다.
- 충돌이 여러번 나면 그 때마다 충돌을 해결하고
git add .
git rebase --continue
반복
- 해결이 되지 않는다면
git rebase --abort
로 rebase 진행 전 상황으로 돌아간다.
최종 git rebase 순서
git add .
git commit -m "남길 메시지"
git rebase -i master
i 버튼 누른 후 squash 진행 -> esc -> :wq
i 버튼 누른 후 commit 하나로 합친다. -> esc -> :wq
git push origin "branch name"
참고 및 출처
위코드 강의
https://docs.microsoft.com/ko-kr/azure/devops/repos/git/merging?view=azure-devops&tabs=visual-studio-2019