Git
Merge vs Rebase
J1Eun
2023. 6. 1. 19:05
Merge
branch를 통합하는 것
- 병합하고자 하는 브랜치의 모든 commit이 master의 commit으로 기록된다.
- -> 변경 내용 이력이 모두 그대로 남아 이력이 복잡함.
- pull을 실행한 뒤 다른 사람이 push를 하여 원격 저장소를 업데이트한 경우 내가 push 요청 시 거부됨.-> merge작업을 통해 다른 사람의 업데이트 이력을 내 저장소에도 갱신 필요.
- -> merge작업 없이 이력을 덮어쓰면 다른 사람이 push한 업데이트 내역이 사라짐.
Merge 종류
fast-forward
master 브랜치로 병합 시 master 브랜치에 변경이 없는 경우, master 브랜치의 이동 만으로 병합하고자 하는 브랜치 내용 적용 가능.
non fast-foward
master 브랜치로 병합 시 master 브랜치에 변경이 있는 경우,
master 브랜치 내의 변경 내용과 병합하고자 하는 브랜치 내의 변경 내용의 통합이 필요.
양쪽 변경을 가져온 merge commit 실행.
*fast-foward가 가능한 경우이더라도 브랜치로 실행한 작업 확인 및 관리를 위해 non fast-foward 옵션을 지정하여 병합 가능.
Merge 방식
3way merge
- git이 주로 처리하는 merge 방법
- base의 내용을 참고해 변경된 두 개의 branch의 내용을 비교하는 방식
- base의 내용과 비교해 수정된 쪽의 내용을 채택
- 두 branch 모두 변경된 경우 conflict 발생 (두 branch가 같은 부분을 다르게 수정했을 때)
2 way merge
- 변경된 두 개의 branch의 변경 내용만 비교하는 방식
- 두 branch의 내용 중 다른 부분의 경우 conflict 발생
- (한쪽은 수정, 다른 한 쪽은 수정하지 않은 경우 / 두 branch가 같은 부분을 다르게 수정했을 때)
Rebase
branch에 대한 base를 재설정한다.
- branch는 base 지점을 가지고 있어 base에서부터 코드를 수정한다.
- Git History가 깔끔해진다. - 개발자간의 배려
- 로그 관리에 효과적이다.
- 이력은 단순해지지만, 원래의 커밋 이력이 변경되기 때문에 정확한 이력을 남겨야 하는 경우 사용하면 안된다.
- rebase를 하는 경우, 병합하고자 하는 브랜치의 불필요한 commit은 생략하고, 필요한 commit만 남겨 master 브랜치에 병합하기 때문에 깔끔한 commit을 유지할 수 있다.
- 다른 사람과 공유하고 있는 branch에 push를 한 경우에는 사용하지 않는 것이 좋다.-> local에서 작업 후 push하기 전 commit 정리를 위해 사용하자! -> 내가 rebase한 내용을 다른 사람이 pull로 받는 경우 conflict가 발생할 수 있다.
rebase 진행방식
non fast-foward 방식의 경우,
병합하고자 하는 브랜치의 변경 내용을 master 브랜치의 base에 적용. ($ git checkout bugfix / $ git rebase master bugfix)
master 브랜치 base가 병합하고자하는 브랜치를 가리킬 수 있도록 merge ($ git checkout master / $ git merge bufix)