Rebase
명령어를 통해 Git 커밋 그래프를 깔끔하게 만드는게 가능합니다.
여기서 Interactive Rebase
를 사용하면 커밋 내용도 다시 정리하여 훨씬 더 깔끔하게 만드는 것이 가능합니다.
먼저 Rebase
명령어와 Interactive Rebase
명령어의 차이에 대해서 알아보겠습니다.
Rebase
는 두 개의 브랜치를 합치는 용도로 사용이 됩니다. Rebase
의 장점은 Merge
와 다르게 합쳤다는 커밋이 새로 만들어지지 않고 합치려는 브랜치에 그대로 붙게 되어 커밋 그래프가 조금 더 깔끔하게 만들어집니다.
그렇다면 종종 보이는 Interactive Rebase는 그냥 Rebase와 어떤게 다를까요?
Interactive Rebase
는 커밋 히스토리를 수정할 수 있다는 점에서 기존의 Rebase
와 다릅니다.
히스토리를 수정할 수 있다는 점은 경우에 따라 굉장히 큰 이점이 될 수 있습니다.
예를 들어
이렇게 커밋 히스토리를 정리하게 되면 커밋 그래프의 가독성이 비약적으로 상승합니다.
이 특징을 단순히 글로 표현하게 되면 이해하기가 어렵기 때문에 Git GUI 프로그램인 Fork와 함께 설명하겠습니다.
1번 브랜치는 커밋과 오타 하나 수정한 커밋 두 개가 있습니다.
1번 브랜치를 develop으로 rebase interactively
할 것입니다.
feat/1 으로 checkout 하고 난 뒤, develop이 있는 커밋에 rebase interactively
해줍니다.
그러면 아래와 같은 화면이 뜹니다. 여기서 커밋 히스토리를 수정할 수 있습니다. 기본적인 상태는 Pick 상태입니다.
커밋 히스토리를 수정할 때는 사용하는 상태는 주로 Pick, Reword, Squash 입니다.
아래와 같이 Squash를 클릭하면 이전 커밋이 Reword로 바뀌고 description에 Squash한 커밋이 들어갑니다. Reword로 바꼈기 때문에 커밋 메시지를 수정할 수도 있습니다. 수정이 다 완료됐다면 우측 하단의 파란색 Rebase 버튼을 클릭합니다.
Rebase
가 완료되면 아래와 같이 develop과 master 브랜치가 있는 곳에 합쳐집니다. 여기서 로컬 브랜치와 원격 브랜치를 동기화하기 위해서 push를 해야 합니다.
하지만, 그냥 push를 누르게 되면 아래와 같은 에러가 발생합니다. 왜냐하면 2개의 히스토리가 서로 관련이 없기 때문에 push가 되지 않는 것입니다.
따라서, push force를 해줘야 합니다.
force push를 하면 아래와 같이 기존의 feat/1 브랜치는 삭제되고 깔끔하게 Rebase 됩니다.
이제는 develop을 feat/1에 동기화해줍니다..
develop 브랜치로 checkout하고 feat/1에 Rebase 해줍니다.
그리고 원격 브랜치도 push 해서 로컬 dev 브랜치와 동기화 합니다.
이 때는 브랜치간 연결이 되어있기 때문에 force push를 하지 않고 그냥 push하면 됩니다.
2번 브랜치의 경우에는 2개의 커밋의 성격이 비슷하기 때문에 역시 하나의 커밋으로 합칠 것입니다.
마찬가지로 feat/2로 checkout하고 Rebase Interactively
해줍니다.
그리고 위에 있는 커밋을 Squash로 설정하고 밑에 있는 커밋 메시지를 수정해줍니다.
그리고 force push 하면 됩니다.
1번 브랜치에서 했던 것과 마찬가지로 1번 브랜치와 develop 브랜치를 rebase
된 커밋에 rebase
해주고 원격 브랜치를 다시 동기화합니다.
3번 브랜치는 쓸데 없는 커밋을 squash를 통해 감쪽같이 속일 것입니다.
쓸데없는 커밋을 숨기기 위해 squash 해줍니다.
다시 feat/1, feat/2, deveop 브랜치를 rebase
된 커밋에 rebase
하고 원격 브랜치와 동기화합니다.
마지막으로, Master 브랜치를 rebase 된 커밋에 동기화하기 위해 rebase
하고 push를 통해 원격 브랜치와 동기화합니다.
이 과정을 거쳐서 3개의 이점을 챙기게 되었습니다.
무조건적으로 Rebase과 Merge보다 좋다라고 할 수는 없지만 Interactive Rebase를 잘 활용해서 커밋 히스토리를 깔끔하게 정리할 수 있다는 장점을 경험하면 확실히 Rebase에 빠질 것 같네요 😀
잘보고갑니다.