Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

git rebase 할 때 merge 커밋 유지하기

난 소스 형상관리를 할 때 커밋메시지나 커밋 히스토리같은 부분에 신경을 많이 쓰는 편이라 자연히 rebase를 많이 사용하는데 rebase를 하면 머지(merge) 커밋("Merge branch.."라고 나오면서 브랜치를 non-fast-forward로 머지할 때 자동으로 생기는 커밋) 커밋이 사라진다. 좀 더 정확히 얘기하면 rebase를 할 때 변경되는 커밋가운데 머지 커밋이 있으면 사라진다.

머지커밋이 있는 git 히스토리

위와 같이 master 브랜치에서 feature/somthing 브랜치(앗! 오타가!)를 만들어서 커밋을 하고 다시 머지를 한 히스토리가 있다. 여기서 커밋메시지가 4th라고 되어 있는 c4a9504 커밋을 수정하려고 git rebase -i c4a9504^를 실행하면 히스토리가 다음과 같이 변경된다.(여기서는 rebase 인터렉티브 모드를 사용했지만 일반적인 rebase도 같다.)

rebase 후 머지 커밋이 사라진 git 히스토리

4thnew 4th로 바꾸었는데 rebase를 수행할 때 머지 커밋은 제외하고 다시 커밋하므로 머지 커밋이 히스토리에서 사라졌다.

rebase 편집 화면

실제로 위처럼 rebase 편집화면에서도 머지 커밋은 나타나지 않는다. 직선 히스토리 라인을 좋아한다면 상관없지만 때로는 머지커밋을 의도적으로 남기고 싶을때도 있다. 이럴 때를 위해 git은 --preserve-merges라는 옵션을 제공한다.

다시 맨 위에 본 히스토리에서 git rebase -i --preserve-merges c4a9504^와 같이 --preserve-merges옵션을 사용하면...

merge 커밋이 나온 rebase 편집 화면

rebase 편집화면에서도 머지커밋(47dc154)이 나타나는 것을 볼 수 있다.

rebase 후 머지 커밋이 유지된 git 히스토리

이렇게 하면 위처럼 rebase 후에도 머지 커밋이 그대로 유지할 수 있다.

2014/03/05 23:05 2014/03/05 23:05