git merge와 git rebase의 차이

Posted on 2021-08-30 by GKSRUDTN99
Git git

git merge란?

master 브랜치에서 분기한 a 브랜치가 있다고 할 때,

master 브랜치에서 a 브랜치를 merge하면, a 브랜치와 master 브랜치가 병합되었음을 나타내는 새로운 커밋이력을 head에 생성한다.

merge_rebase_img


git rebase란?

master 브랜치에서 a 브랜치를 rebase한다면,

merge_rebase_img

a 브랜치에서 master 브랜치를 rebase한다면,

merge_rebase_img

즉, 현재 작업하는 브랜치를 대상 브랜치를 base로 해서 커밋 이력을 재정렬한다는 의미이다.

여기서 rebase를 할 때 작업하는 브랜치의 커밋들의 해시 값이 바뀐다는 것을 확인할 수 있다.


git rebase를 할 때 주의할 점

master 브랜치에서 분기한 a와 b브랜치가 있다고 할 때,

merge_rebase_img

master 브랜치에서 a 브랜치를 rebase하면, 다음과 같은 상태가 되는데,

merge_rebase_img

이 상태에서 b 브랜치는 master 브랜치로부터 분기한 커밋이 없어지게 된다.

이런 이유로 b 브랜치를 master 브랜치에 병합할 때 무수히 많은 conflict를 발생시키므로

master 브랜치를 rebase하는 행위는 가급적 피하는 것이 좋다.


git rebase를 할 때 장점

사실, rebase를 사용하지 않더라도, squash and merge를 사용하면 커밋이력을 깔끔하게 관리할 수 있다.

하지만, 브랜치 내에서 작업한 커밋 하나하나를 기록할 필요가 있다면 git rebase가 도움이 된다.

git rebase를 사용하지 않고 git merge만 사용한 상태라면, 아래 그림과 같은 상황일 것이다.

merge_rebase_img

하지만, a 브랜치에서 master 브랜치를 rebase 한 뒤에, merge하면, 아래 그림과 같은 상태가 되고,

merge_rebase_img

이 상태에서 b 브랜치도 master 브랜치를 rebase 한 뒤, merge하면, 아래 그림과 같은 상태가 된다.

merge_rebase_img

마치 a 브랜치의 작업이 끝난 뒤 b 브랜치가 분기하여 작업한 것 처럼 보이게 커밋 이력을 관리할 수 있다.

이렇게 하면 브랜치 끼리 커밋 이력이 섞이지 않아 커밋 이력 관리가 편해진다.