들어가기 전

PR(Pull Request)을 써보고 싶어서 실습해 보던 중 아래와 같은 사진을 맞닥뜨리게 되었고 나의 호기심을 자극하여 새로운 명령어도 터득해볼 겸 실습하면서 공부해보기로 하였다.

mergeKinds

Merge의 종류 및 설명

  1. Merge
  2. Squash and merge
  3. Rebase and merge

Merge

git merge <분기된 브랜치명>

일반적으로 많이 사용되는 병합 방식이며, 커밋 내역을 모두 남길 때에 사용된다. merge는 Fast-forward, Recursive로 두 가지의 병합 방식으로 나눌 수 있다.

Fast-forward

$ git merge develop
Updating c77ebbe..dff05fa
Fast-forward
 develop.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

fast-forward

병합하게 되면 Fast-forward 라고 나오며 병합이 완료된다. master에서 분기되어 develop이 나왔다면 developmaster가 가지고 있는 모든 내용을 포함하고 있으므로 추가로 커밋이 이루어진다면 developmaster보다 최신 버전이라고 할 수 있다. 여기서 master에서 추가로 커밋이 이루어지지 않고 병합이 이루어진다면 developmaster 내용을 모두 포함하며 추가적인 내용을 담고 있으므로 그대로 master와 분기된 시점 이후로 추가된 내용이 그대로 붙게 된다.

fast-forward2

따로 병합할 때 커밋 메시지가 발생하지 않고 커밋 순서대로 기록된 것을 확인할 수 있다.

Recursive Merge

$ git merge develop
Merge made by the 'recursive' strategy.
 develop.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

recursive-merge

병합할 때 recursive 라고 나오며 병합이 완료된다. 이 경우도 마찬가지로 master에서 develop이 분기되어 나왔고 추가적인 기능이 develop에서 개발되어 커밋 되었다고 보자. 여기까진 같지만 만약에 master에서 hotfix와 같은 새로운 문제가 발생해 내용 고쳐서 커밋을 했다고 생각한다면 developmaster보다 최신 버전이라고 하기에는 어렵다. 이때는 masterdevelop이 서로 다른 내용을 가지고 있으므로 이 내용을 합친 새로운 커밋 메시지를 만들어서 병합하게 된다.

recursive-merge2

분기된 시점부터 베이스가 되는 브랜치에 커밋이 발생했기 때문에 병합할 때 새로운 커밋 메시지가 생기며 병합되는 것을 확인할 수 있다.

Squash and merge

git merge --squash <분기된 브랜치명>

squash

분기된 develop 브랜치에서 커밋이 이루어지고 커밋된 내용을 master 브랜치로 가져와 새로운 커밋을 만들어내고 브랜치를 없애 브랜치 커밋 명세들을 지우는 병합 방식을 말한다.

squash2

왼쪽 사진부터 보게 된다면 develop 브랜치에서 작업 내용을 모두 커밋한 상태이다. 중간 사진은 squash merge를 이용하여 develop에 있던 수정 내용을 가져와 커밋 메시지를 생성하였고 마지막으로 오른쪽 사진은 필요가 없어진 브랜치를 삭제하는 것으로 마무리가 된 것을 확인할 수 있다.

Rebase and Merge

git rebase <base 브랜치명>
git checkout <base 브랜치명>
git merge <분기된 브랜치명>

rebase

분기된 develop 브랜치에서 커밋이 이루어지고 커밋된 내용을 master 브랜치에 rebase를 통해 커밋 내용을 재배치하고 추가 커밋 메시지 없이 병합되는 것을 말한다.

rebase2

왼쪽 사진은 develop에서 커밋을 마친 직후이고 오른쪽 사진은 master 브랜치로 커밋된 내용을 재배치한 상황이다. 보게 되면 develop에서 커밋된 내용이 재배치되면서 해시값들이 모두 변경되었고 추가 메시지 없이 병합이 이루어진 것을 확인할 수 있다.

요약

  • Merge
    • 일반적으로 많이 사용하는 Merge 방식이고 각 상황에 따라 Fast-forward, Recursive 방식으로 병합되며 Fast-forward는 새로운 커밋 메시지 없이 커밋 내용이 적용되며 Recursive는 합병할 때 새로운 커밋 메시지와 함께 커밋 내용이 적용되는 방식이다.
  • Squash and Merge
    • 이전 커밋 내용을 모두 합쳐서 하나의 새로운 커밋 메시지로 만들고 난 다음 이전 커밋 내용을 모두 지우는 병합 방식이다.
  • Rebase and Merge
    • 커밋 내용을 Base가 되는 브랜치에 재배치하고 추가로 커밋 메시지 없이 병합을 진행하는 방식이다.

Reference