본문 바로가기

c c++ mfc

[Git] Merge vs Rebase, 그 차이점 알아보기

반응형

안녕하세요. 오늘은 Git에서 자주 사용되는 두 가지 브랜치 통합 방법, 'Merge'와 'Rebase'에 대해 알아보겠습니다. 이 두 가지 방법은 각각 서로 다른 목적과 상황에 따라 사용되며, 그 결과물도 조금씩 다릅니다.

 

다음과 같이 A라는 Master에서 B라는 Branch를 생성해서 작업했다고 가정합니다.

작업예시

1. Merge

  • Git의 Merge는 두 개의 브랜치를 합칠 때 사용하는 가장 기본적인 도구입니다.
  • Merge 작업을 수행하면, 병합하려는 두 브랜치의 변경 사항을 모두 포함하는 새로운 커밋(아래그림의 C3)이 생성됩니다.
  • 이 과정에서 원래의 커밋 히스토리(커밋 순서)가 유지됩니다.
  • 하지만 이런 방식은 여러 사람이 동시에 작업할 경우 커밋 히스토리가 복잡해질 수 있습니다.

Merge 예시

저는 Git gui tool로 Fork와 Source Tree를 사용중입니다.

Fork툴에서 merge, rebase 예시

위 그림과 같이 신규 작업을 하는 경우 master에서 branch 를 생성해서 작업을 합니다. 그리고 중간중간 다른 사람들이 작업한 내용들이 master에 들어가 있겠죠? 그 내용들을 내가 작업중인 branch로 가져오는 작업을 merge 또는 rebase로 진행합니다. 이렇게 최신 master의 내용을 가져와 놔야 내 branch의 작업이 끝나고 master로 들어갈때 Conflict없이 들어갈 수 있게 됩니다.

2. Rebase

  • Rebase는 현재 작업 중인 브랜치를 기준으로 다른 브랜치의 변경 사항을 순차적으로 적용하는 방식입니다.
  • Rebase를 사용하면 커밋 히스토리를 깔끔하게 유지할 수 있습니다. 왜냐하면 기존의 커밋들 위에 새로운 커밋들이 순서대로 적용되기 때문입니다.
  • 하지만 이런 접근법은 공개 저장소에서 작업할 때 주의가 필요합니다. 왜냐하면 Rebase는 기존의 커밋 히스토리를 재작성하기 때문에, 다른 사람들과 공유된 커밋들을 변경할 수 있기 때문입니다.

Rebase는 두가지 경우가 있습니다. 위의 그림에서와 같이 rebase하게 되면 master -> branch 의 방향이 되죠.

master -> branch 로 rebase

branch(B) 를 master(A)로 커밋 이력이 정렬되는 것을 알 수 있죠⁉️

 

반대로 checkout을 master로 하고 branch에서 rebase를 하는 경우, master <- branch의 방향

master <- branch 로 rebase

이때는 branch를 master로 커밋 이력이 정렬되는데, master의 커밋이력이 변하게 됩니다. 즉 공동작업시에는 master에서 다른 branch를 기준으로 rebase를 하는 경우는 피하는게 좋을 것 같습니다.

3. Merge와 Rebase 어느 것을 선택해야 할까?

  • 선택은 당신이 어떻게 프로젝트 히스토리를 관리하고 싶어하는지에 따라 달라집니다
    만약 프로젝트 히스토리를 그대로 유지한 상태로 브랜치를 합치고 싶다면, 'Merge'를 사용하세요.
    반면에 프로젝트 히스토리를 단순하고 깔끔하게 유지하고 싶다면, 'Rebase'를 사용하세요.

저나 많은 분들은 다음과 같은 방법으로 개발하고 있지 않을까 싶어요.

  1. master에서 branch를 따서 작업합니다.
  2. branch에서 작업중 다른 사람들이 master로 merge한 내용들이 있을 경우, master -> branch 방향으로 rebase합니다.
    1. master를 기준으로 branch의 이력들이 정리됩니다.
  3. branch에서 작업이 끝났으면 master로 merge합니다.
    1. master <- branch 방향으로 merge합니다.

 

Git의 Merge와 Rebase는 각각의 장단점이 있으며, 상황에 따라 적절한 도구를 선택하여 사용하는 것이 중요합니다. 어떤 방식을 선택하든지 간에 중요한 것은 협업하는 팀원들과 일관된 방식을 유지하는 것입니다.
감사합니다.

반응형