Git
Git merge와 rebase의 차이
차가운개발
2024. 9. 9. 14:40
merge와 rebase는 git에서 브랜치를 병합할 때 사용하는 두 가지 방법이다. 둘 다 코드베이스를 동기화하는데 사용되지만, 처리 방식과 결과가 다르다.
ㅇ Merge(병합)
merge는 두 개의 브랜치를 결합하여 하나의 커밋을 만들어낸다. 커밋 히스토리를 그대로 유지하면서 새로운 병합 커밋이 추가된다.
특징:
- 커밋 히스토리 보존: 양쪽 브랜치의 커밋 기록이 그대로 유지된다.
- 병합 커밋 생성: 두 브랜치를 병합할 때 별도의 커밋이 생성된다.
- 협업 중 충돌 처리: 충돌이 발생할 경우, merge 시점에 해결하고 병합 커밋으로 기록된다.
A--B--C(main)
D--E(기능 브랜치)
병합시
A--B--C--F(브랜치가 합쳐진 시점의 새로운 커밋생성)
D--E(기능브랜치)
main 브랜치에 A,B,C 와 기능브랜치 D,E가 모두 합처진 F 커밋(main)을 생성
main과 기능브랜치의 커밋 히스토리가 모두 유지된다.
ㅇ rebase
rebase는 한 브랜치의 변경 사항을 다른 브랜치 위로 재배열한다. 기존 커밋을 새로이 재작성하여 다른 브랜치의 마지막 커밋 위로 붙인다. 커밋 히스토리가 직선으로 이어진다.
특징:
- 커밋 히스토리 변경: 기존 커밋을 새로운 베이스 위로 다시 쓰기 때문에 커밋 히스토리가 변경된다.
- 병합 커밋 x : 병합 커밋이 없는 직선 커밋 히스토리로 깔끔한 커밋 히스토리를 유지할 수 있다.
- 협업 중 주의: 이미 다른 사람과 공유된 커밋을 리베이스하면 충돌이 발생할 수 있다.
- 기존의 커밋을 그대로 사용하지 않고, 각 커밋을 새로운 베이스로 적용하여 새로운 커밋을 생성하기 때문에 커밋해시가 변경된다.
중요한 점:
rebase는 커밋을 단순히 덧붙이는 것이 아닌 다시 쓰는 과정이다.
A--B--C (main)
D--E(기능 브랜치)
D와 E가 메인 브랜치의 최신 커밋 뒤에 D'와 E' 새로운 커밋으로 작성된다.
새로운 커밋이 작성되면서
A--B--C--D'--E'(기능 브랜치)의 커밋히스토리로 재작성된다.(main 브랜치의 변화는 없다)
ㅇ merge와 rebase의 차이
merge | rebase | |
히스토리 | 기존 커밋 히스토리를 유지하며 병합 커밋을 생성 | 커밋 히스토리를 재작성하여 직선 히스토리를 유지 |
커밋 기록 | 병합 커밋 추가 | 병합 커밋 없이 깔끔한 히스토리 |
충돌 해결 | 병합 시점에서 해결 | 각 커밋에 대해 순차적으로 해결 |
협업 시 | 이미 공유된 커밋도 병합 가능 | 공유된 커밋에 대한 리베이스는 충돌 및 복잡성을 유발 할 수 있음 |