본문 바로가기

Git

Git - branch merge 방법

 

1. Merge Commit

  • 가장 기본적인 브랜치 병합 방법.
  • 각 브랜치의 변경사항이 과거의 커밋으로 보존되고, 새로운 커밋이 추가되어 최종 병합이 완료.
  • 기본적으로 Fast-forward 또는 3-way merge 방식으로 병합된다. (맨 아래에서 설명)
  • 장점 :
    • 브랜치의 히스토리를 모두 유지하면서 변경사항 병합 가능.
    • 프로젝트의 진행상황 이해/추적 쉬움.
    • 커밋아이디가 바뀌는 경우가 없어 squash, rebase에 비해 사용이 쉽다.
  • 단점 :
    • 커밋히스토리가 복잡해질 수 있다. 
    • 팀이 커질수록 복잡성을 빠르게 증가한다.
  • 사용 : 주로 안정적인 작업 플로우에서 사용하며, 빠른 병합이 가능한 경우에 유용하다.

 

2. Squash and Merge

  • 각각의 커밋에서 발생한 모든 변경 사항을 병합 후 하나의 새로운 커밋을 생성한다.
  • 주로 Pull Request나 Merge Request에서 사용되며, 히스토리를 깔끔하게 유지하면서도 다수의 커밋을 하나로 묶을 수 있다.
  • 장점 :
    • 커밋히스토리를 간단하게 유지할 수 있다.
    • 각 커밋이 특정 Pull Request를 대변하게되어, 커밋 하나하나가 완성된 기능을 의미하게 된다.
    • PR에서 발생한 자잘한 문제를 숨기고 중요한 내용들만 압축할 수 있다.
  • 단점 :
    • 상세한 이력을 볼 수 없다.
    • 각 커밋의 개별 맥락, 작업자의 정보등을 확인할 수 없다.
    • (하지만 github에는 커밋기록이 남아있기때문에 작업 히스토리 확인 가능)
  • 사용 : 작업 히스토리를 깔끔하게 유지하거나 다수의 작은 커밋을 하나로 통합할 때 사용된다.

 

3. Rebase and Merge

  • 현재 브랜치의 커밋을 다른 브랜치의 마지막 커밋 위에 적용하여 히스토리를 깔끔하게 유지한다.
  • 커밋의 시관에 관계없이 가장 뒤에 붙여서 새로운 커밋 히스토리를 만든다.
  • 장점 :
    • 깨끗하고 선형적인 커밋 히스토리를 만든다.
    • 히스토리 파악 및 코드 변화의 이해가 쉽다.
  • 단점 :
    • 관련 커밋의 ID들이 모두 바뀌어 혼란을 초래할 수 있다.
    • 브랜치가 크게 분기된 경우 더 복잡하고 어려울 수 있다.
    • 여러 개발자가 동시에 작업을 수행한 경우 복잡한 충돌을 일으킬 수 있다.
    • 다른 기능으로 나뉘어 있던 작업이력이 합져지므로, 특정 기능이 어디부터 어디까지의 커밋으로 구현되어있는지 알기 어렵다.
  • 사용 : 작업 히스토리를 정리하고 선형적으로 보이게 만들 때 또는 다른 브랜치의 변경사항을 현재 브랜치에 적용하려고 할 때 사용된다.

 

4. Cherry-Pick

  • 특정 커밋을 다른 브랜치로 가져오는 방법.
  • 선택적으로 원하는 변경사항만을 가져올 수 있다.
  • 사용 : 특정 커밋을 다른 브랜치로 병합하거나 특정 변경사항만을 다른 브랜치로 이동시키려고 할 때 사용된다.

 

 


Fast-forward

  • 두 브랜치가 공통으로 가지고 있는 commit을 Base 라고 한다.
  • master와 dev1이 각각 참조하는 commit이 동일선상에 위치해 있을 때, 두 브랜치가 fast-forward 상태에 있다고 한다.
  • 두 브랜치가 fast-forward관계일 때 git merge 명령을 입력하면 새로운 commit이 생기지 않는다.
  • 뒤쳐진 브랜치(master)의 참조개체가 앞서있는 브랜치가 가리키는 커밋을 참조하도록 이동할 뿐이다.
  • 브랜치를 빨리감기하듯 이동시키는 모습을 본따 fast-forward(빨리감기)라고 부른다.

 

3-way merge 

  • 두 브랜치가 base로부터 commit을 진행해서 분기해나간 상태가 되었다.
  • 두 브랜치 중 어느 것도 base에 위치해있지 않다.
  • 이 때 git merge명령을 실행하면 새로운 commit이 생성된다.
  • base커밋, master 커밋, dev1커밋 총 3개의 커밋을 보고 merge하기때문에 3-way merge라고 한다.

  • 변경사항을 기준으로 자동병합을 진행하는데, 두 커밋 모두에서 변경사항이 발생한경우 conflict가 발생한다.

 

참조:

https://wikidocs.net/153693

https://sabarada.tistory.com/196

'Git' 카테고리의 다른 글

Git/GitHub Flow 브랜치 전략  (1) 2023.09.15
Git / GitHub (정의, 시작하기)  (0) 2023.09.13
크라켄, 이클립스 관련  (0) 2023.03.13
Git/ Github  (0) 2023.03.13