merge vs rebase

merge와 rebase 모두 브랜치를 합치는 명령어지만 약간의 차이가 있다.

merge는 아래 사진과 같이 깃의 커밋들의 로그가 두 브랜치가 합쳐지는 형태로 남는다

merge 예시

rebase는 merge처럼 합쳐지는 형태로 기록이 남지 않고 합쳐질 브랜치가 앞에 붙는 형식으로 선형적으로 남는다.

rebase 예시

rebase는 로그가 선형적으로 남아 기록이 더 깔끔하게 남을 수 있지만, 없어지는 커밋이 생길 수도 있다. 반면에 merge는 로그가 합쳐지는 두 가지 갈래 형태로 남아 깔끔하진 않을 수 있지만 모든 커밋이 보존된다.

merge

merge를 할 때 우선 남아야 하는 브랜치로 이동한 후에 merge를 해야 한다.

git checkout [남아야할 브랜치 이름]
git merge [합칠 브랜치 이름]

rebase

rebase는 merge와 다르게 합쳐질 브랜치로 이동을 하고 남을 브랜치로 rebase 한다.

git checkout [합쳐질 브랜치 이름]
git rebase [남을 브랜치 이름]

rebase 예시

그런데 위의 명령어만 입력하면 위의 그림처럼 master에 experiment를 합쳤지만 master가 experiment보다 뒤에 있다.

그렇기 때문에 이 두 브랜치를 한번 더 합쳐줘야 같은 커밋을 가리킨다.

git checkout [남을 브랜치 이름]
git merge [합쳐질 브랜치 이름]

rebase 옵션

B와 C의 공통된 부분을 없애고, C를 A에 붙힘

git rebase --onto A B C

Conflict(충돌)

두 브랜치를 합칠 때 같은 파일의 같은 부분을 두 브랜치에서 모두 수정하고 머지하면 발생한다.

이는 컴퓨터가 두 브랜치중 어떤 브랜치의 수정사항을 받아들일지 결정할 수 없기 때문에 발생한다고 이해하면 된다.

충돌이 발생했을 경우, 두 브랜치중 어떤 브랜치의 내용을 선택할지 에디터에서 수정을 해주고 커밋을 다시 하면 해결할 수 있다.

'git' 카테고리의 다른 글

[git] git이란?  (0) 2021.10.13
[git] pull vs fetch  (0) 2021.10.13
[git] branch  (0) 2021.10.13
[git] add, commit  (0) 2021.10.13
복사했습니다!