merge vs rebase

merge
마스터 브렌치(M)의 최신 커밋과 Feature 브렌치(f)의 최신 커밋과 그 공통의 조상인 브렌치를 비교하여 (3 way merge)를 통해 병합해주고 그럴 수 없는 경우 conflict를 내서 사람이 병합 하게 한다.
이렇게 되면 f브렌치는 자신의 하위 커밋과 마스터의 하위 커밋을 모두 가지게 되어 f브렌치의 입자에서는 m브렌치를 병합한 것이 라고 할 수 있다.
rebase
m브렌치와 f브렌치가 공통으로 가지고 있는 조상이 f브렌치의 입장에선 base가 된다. 여기서 rebase를 한다는 얘기는 앞서 말한 base를 바꾼다는 말이 된다.
실습해보기
마스터에서 파일을 하나 만들고 커밋 -> 브렌치 생성 후 새로운 파일을 만들고 커밋 후 또한번 수정 후 커밋 -> 다시 마스터로 넘어가서 또다른 파일 생성 후커밋 -> 같은 파일을 수정 후 커밋
jinzz@DESKTOP-I8KEDHO MINGW64 /c/rebasetest (master)
$ git log --decorate --all --oneline --graph
* 53d9851 (HEAD -> master, origin/master, origin/HEAD) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature, feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base
git log --decorate --all --oneline --graph
로 확인 해보면 브렌치가 나뉘어진걸 알 수 있음.
이 상태에서 현재 feature브렌치의 base는
7c5f2fd master base 이다.
feature 브렌치에 체크아웃 상태에서 rebase를 해본다.
$ git rebase master
그리고 다시 로그를 확인해 본다.
* 6722852 (HEAD -> feature) feature made 2
* 9ba89a7 feature made 1
* 53d9851 (origin/master, origin/HEAD, master) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base
마스터의 가장 최신 브렌치였던
53d9851 (origin/master, origin/HEAD, master) master branch2
의 위로 feature브렌치가 올라간 것을 알 수있다.
즉 마스터의 가장 최신 브렌치를 base로 reabse한 것이다.
다시 마스터로 체크아웃 후
git merge feature를 통해 합병
로그를 확인해 보면
* 6722852 (HEAD -> master, feature) feature made 2
* 9ba89a7 feature made 1
* 53d9851 (origin/master, origin/HEAD) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base
6722852 (HEAD -> master, feature) feature made 2
feature 브렌치와 마스터 브렌치가 모두 머물고 있는걸 알 수 있다.
*rebase 시 conflict 가 났을 때
해당 파일을 vim 으로 수정해 주어야 한다.
<<<<<<< HEAD // 현재 해당하는 브렌치의 내용
======= // 구분자
>>>>>>> exp // 병합한 브렌치
충돌 해결 후
git rebase --continue
를 통해 다시 rebase를 해준다.