간단한 개인 프로젝트를 진행하는데, Github에서 바로 README.md를 수정하기를 몇 차례 거치니 커밋 내역이 너무 지저분해져서 손보기로 했다. Pull을 까먹고 커밋해버리는 등 멍청한 짓을 여러 번 저질러서 브랜치가 생겼다가 머지됐다가... 정말 더러웠다.
그동안 git을 많이 쓰기는 했는데 단순히 로그 남기기 이상도 이하도 아니게 사용해와서 히스토리를 어떻게 정리하는지 몰랐다. 검색해보니 rebase와 squash를 통해서 한다고 한다.
Github Desktop에서 드래그 앤 드랍으로 간단히 커밋을 합칠 수 있길래 깔아봤는데, 머지되기 이전 시점의 커밋은 합치지 못한다는 등 아무튼 오류가 나서 어쩔 수 없이 git bash로 진행해야 했다.
검색해서 나온 대로 git rebase -i HEAD~n
을 입력하고 squash
를 진행했지만 오류만 나고 히스토리가 더 지저분해졌다. 제대로 안 되니까 갑자기 귀찮아져서 던져두고 다음 날 로그를 다시 읽어봤는데 충돌이 났기 때문이었다. 계속하려면 충돌을 해결하고 git rebase --continue
를, 건너뛰려면 git rebase --skip
을, rebase를 취소하고 이전 상태로 돌아가려면 git rebase --abort
를 입력하라는 내용이 적혀 있었다. 오류 메세지를 읽는 게 참 중요하다는 걸 다시금 느낀다.
충돌을 모두 해결하고 git push -f origin main
으로 강제 push를 하고 보니, Github에서는 커밋이 깨끗하게 정리됐다. 그러나 로컬의 히스토리 그래프에서는 아직도 더러운 브랜치들이 남아 있었다. 살펴보니 릴리즈 태그인 v1.1
이 브랜치 사이에 끼여 있었다. 로컬에서는 git tag -d v1.1
로 지우고, 리모트에서는 git push --delete origin v1.1
로 지웠다. 쓰면서 보니 나는 리모트에서 먼저 지우고 뒤늦게 로컬에서 지웠는데, 그냥 로컬에서 지우고 push하면 될 것 같기도 하다.
아무튼 태그까지 지워버리고 나니 지긋지긋한 브랜치들이 사라지고 정말 깔끔하게 10개의 커밋만이 남았다. 사실 그렇게 깔끔하지는 않지만 아무튼 만족스럽다. git 공부좀 더 해야겠다...