git merge
란?
master 브랜치에서 분기한 a 브랜치가 있다고 할 때,
master 브랜치에서 a 브랜치를 merge하면, a 브랜치와 master 브랜치가 병합되었음을 나타내는 새로운 커밋이력을 head에 생성한다.
git rebase
란?
master 브랜치에서 a 브랜치를 rebase한다면,
a 브랜치에서 master 브랜치를 rebase한다면,
즉, 현재 작업하는 브랜치를 대상 브랜치를 base로 해서 커밋 이력을 재정렬한다는 의미이다.
이 말은, 현재 작업하는 브랜치를 대상 브랜치의 HEAD에서 분기된 브랜치로 간주하겠다는 뜻이기도 하다.
여기서 rebase를 할 때 작업하는 브랜치의 커밋들의 해시 값이 바뀐다는 것을 확인할 수 있다.
git rebase
를 할 때 주의할 점
master 브랜치에서 분기한 a와 b브랜치가 있다고 할 때,
master 브랜치에서 a 브랜치를 rebase하면, 다음과 같은 상태가 되는데,
이 상태에서 b 브랜치는 master 브랜치로부터 분기한 커밋이 없어지게 된다.
이런 이유로 b 브랜치를 master 브랜치에 병합할 때 무수히 많은 conflict를 발생시키므로
master 브랜치를 rebase하는 행위는 가급적 피하는 것이 좋다.
git rebase
를 할 때 장점
사실, rebase를 사용하지 않더라도, squash and merge
를 사용하면 커밋이력을 깔끔하게 관리할 수 있다.
하지만, 브랜치 내에서 작업한 커밋 하나하나를 기록할 필요가 있다면 git rebase
가 도움이 된다.
git rebase
를 사용하지 않고 git merge
만 사용한 상태라면, 아래 그림과 같은 상황일 것이다.
하지만, a 브랜치에서 master 브랜치를 rebase 한 뒤에, merge하면, 아래 그림과 같은 상태가 되고,
이 상태에서 b 브랜치도 master 브랜치를 rebase 한 뒤, merge하면, 아래 그림과 같은 상태가 된다.
마치 a 브랜치의 작업이 끝난 뒤 b 브랜치가 분기하여 작업한 것 처럼 보이게 커밋 이력을 관리할 수 있다.
이렇게 하면 브랜치 끼리 커밋 이력이 섞이지 않아 커밋 이력 관리가 편해진다.