Git

Git merge와 rebase의 차이

차가운개발 2024. 9. 9. 14:40

merge와 rebase는 git에서 브랜치를 병합할 때 사용하는 두 가지 방법이다. 둘 다 코드베이스를 동기화하는데 사용되지만, 처리 방식과 결과가 다르다.

 

출처: https://velog.io/@sweet_sumin/Git%EC%9D%98-Merge%EC%99%80-Rebase%EC%9D%98-%EC%B0%A8%EC%9D%B4

ㅇ 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
히스토리 기존 커밋 히스토리를 유지하며 병합 커밋을 생성 커밋 히스토리를 재작성하여 직선 히스토리를 유지
커밋 기록 병합 커밋 추가 병합 커밋 없이 깔끔한 히스토리
충돌 해결 병합 시점에서 해결 각 커밋에 대해 순차적으로 해결
협업 시 이미 공유된 커밋도 병합 가능 공유된 커밋에 대한 리베이스는 충돌 및 복잡성을 유발 할 수 있음