Git branch 병합하기
merge 그리고 rebase
  • Github

Github merge와 rebase 이해하기

Github를 사용하다보면 branch를 생성하고 add, commit, merge, rebase, push.. 뭔가 할일이 많다.
공부해야할게 많다. 그 중 병합에 대해 오늘은 끄적여보고자 한다.

mergerebase 둘 다 2개의 branch를 병합하는 방법이다. 뭐가 다를까?

Merge

간단한 그림으로 알아보고자 한다.

  1. 그림처럼 commit 상태가 있다고 가정해본다.

이 상태에서 master에서 새로운 feature branch를 생성하여 추가로 작업을 하였다.

Copy
$git checkout -b feature/sample
$git commit -m "commit a"
$git commit -m "commit b" 

그러면 현재의 git object의 상태는 그림과 같다.
image

  1. 그런데 Master branch에 문제가 생겼다. Hotfix를 해야하는 상황이 생긴것이다.

그래서 그림과 같이 새로운 branch를 생성하여 작업하고 Master와 다시 병합하였다.

Copy
$git checkout master
$git checkout -b hotfix/typo-err
$git commit -m "hotfix"
$git checkout master
$git merge hotfix/typo-err

image

그럼 위와같이 HEAD가 이동하였고, cli에는 fast-worward라는 내용을 확인할 수 있다.
빨리감기 라고도 하며 branch의 head가 이동했다는것을 의미한다.

  1. 이 상태에서 이제 개발이 완료된 feature/sample branch를 master와 병합하고자 한다.
Copy
$git checkout master
$git merge sample-branch 

image

위와같이 merge를 하게되면 새로운 커밋이 생성되며 갈래가 나갔다가 다시 합쳐지는 형태로 생성되며 새로운 commit이 자동으로 생성된다. (위 그림에서 xxx 커밋) 이러한 형태를 3-way Merge라고 부른다.

Rebase

간단한 그림으로 알아보고자 한다.

  1. Merge와 동일하게 commit 상태가 있다고 가정해본다.
Copy
$git checkout -b feature/sample
$git commit -m "commit a"
$git commit -m "commit b" 

image

  1. 이번에도 Master branch에 문제가 생겨서 hotfix를 하였다.
Copy
$git checkout master
$git checkout -b hotfix/typo-err
$git commit -m "hotfix"
$git rebase master

image

  1. 이 상태에서 이제 개발이 완료된 feature/sample branch를 master와 병합(이번엔 rebase)하고자 한다.
Copy
$git rebase master 

image

  1. feature/sample의 branch꼬리를 master에 가져다 붙였다. 이제 master에서 merge를 하면

깔끔하게 fast-forward가 이루어 진다.

image

결론

merge보다 rebase가 이력관리가 더 깔끔하다. (가지가 나갔다가 들어갔다가 하지않기 때문에). 때문에 실무에서는 rebase가 대부분 사용하고 있는데, 어떤 차이가 있는지 왜 rebase를 쓰는지 조금이나마 이 글을 정리하면서 이해가 되었다.


  • References
  1. https://cyberx.tistory.com/96