Hayden's Archive

[Git] Git CLI 심화 (2) - Merge 본문

Study/DevOps

[Git] Git CLI 심화 (2) - Merge

_hayden 2020. 6. 20. 15:04

자료 출처 : 플레이데이터 Git 입문 강의 (변영인 강사님)

 

* 브랜치들을 합치는 방법

  1) 브랜치의 기록을 남기면서 합치는 방법(자동/수동)

  2) 브랜치의 기록 없이 한 줄로 합치는 방법

 

* 기록을 남기는 방식을 선택했을 때 충돌이 발생하지 않는다면 Fast-forward나 Recursive 방식으로 자동으로 깃이 합쳐줌.

  1) Fast-forward : 이력을 공유하며 분기하지 않은 브랜치를 병합할 때 추가적인 커밋 없이 합치는 방법

  2) Recursive : 특정 지점에서 분기한 브랜치를 병합할 때의 상황이며 추가적 커밋이 자동으로 생성

 


* 기록을 남기면서 합치는 방법

1) 커밋 이력을 공유하는 브랜치 합치기


(브랜치를 합쳐주려면, 다른 브랜치 내용을 추가하여 합쳐주려는 브랜치로 이동해야 한다.)

(git checkout을 통해 master 브랜치로 이동하겠음. 이 과정을 HEAD를 이동한다고 함)

(같은 커밋 이력을 공유하면 충돌 없이 바로 합쳐짐)

 

 

2) 커밋 이력이 분기한 브랜치 합치기

 

(두 브랜치는 master라는 브랜치의 최종 커밋을 기준으로 분기되었음.)

 

(아래는 두 브랜치가 분기되었기 때문에 중간에 합쳐주는 커밋 이력을 새롭게 추가해줬다는 의미. 커밋 이력이 분기되지 않았다면 fast-forward를 사용하게 되어 새로운 커밋이 필요 없이 최근 커밋을 그대로 적용해줌)

 

3) 충돌 발생한 브랜치 합치기

- 두 브랜치 간의 커밋 간 겹치는 수정사항 -> 즉, 충돌 발생시 자동 병합 불가능 (충돌은 Git이 알아서 해주는 영역이 아님. 이런 경우는 수동으로 병합해야 함.)

 


* 브랜치를 병합하다 보면 각 커밋이 어떤 것을 의미하는지 파악하기가 어려워짐.

-> 이것을 막기 위해 브랜치 기록을 정리하며 병합하는 방법 : rebase를 통한 브랜치 병합

=> 위로 인해 브랜치 병합 기록이 한층 단순해짐

 

 

rb2를 master와 병합해주면 rb1과 rb2 모두 가지고 있는 cm.txt 파일에 충돌이 생김.

 

확인해보면 현재 HEAD로 되어 있는 부분은 checkout 되어 있던 master가 아니라 브랜치 rb2임을 알 수 있음. 리베이스는 공통 조상까지 git reset을 시켜주고, 리베이스 하려는 브랜치를 삽입한 다음 rb2까지 HEAD에 반영된 상태로, 기존에 있던 rb1을 반영한 master 브랜치를 비교해서 추가해주기 때문.

 

git rebase --continue가 일종의 commit 역할을 한다.(commit 하면 안 됨)