[git] 이미 지나가버린 기존 커밋 작업내용 수정하기
오늘 유용한 기능을 알게 되어서 기록해둔다. 작업하다가 이전 커밋에 관련된 내용이라 수정을 하고 싶은데, 이후에 커밋들이 몇 개 더 쌓여버려서 곤란했던 적이 있다. 예전엔 커밋이 몇 개 안 되면 reset으로 되돌린 뒤 수정하고 순차적으로 다시 커밋을 하거나 아니면 chore를 달아 새로 커밋을 남겼었다. 지나가버린 특정 커밋을 수정하면서 커밋로그는 그대로 유지하고 싶을 때 rebase를 이용할 수 있다는 걸 알게 되었다!
- git log 를 통해 수정하고 싶은 커밋 이전의 커밋 해시값을 확인한다.
- git rebase -i {HASH VALUE} 명령어를 입력한다.
- vim 에디터가 열리면 해당 커밋 이후에 내가 남긴 커밋들이 쭉 뜬다. i를 눌러 편집모드에 들어가서 각 커밋에 대해 pick(유지), edit(수정), drop(제외) 중 어떻게 하고 싶은지를 설정한다. (다른 옵션들도 있다. 설명도 자세히 나온다.)
- 저장하고 나오면 해당 커밋 기준으로 최근 커밋까지 rebase를 진행하는데, 이때 앞서 vim 에디터로 작성한 내용에 따라 커밋들이 유지되거나 제외된다. edit을 하면 해당 커밋 상태에서 수정하고 싶은 내용을 수정한 뒤 git add 후 rebase continue 하면 된다.
- 주의할 점은 이 방법을 통해서 edit한 커밋은 해시값이 바뀌므로 git push -f 를 해 줘야 한다는 점. 그래서 개인이 작업하던 브랜치에서 내 작업에 한정해서만 사용하는 등 조심할 필요가 있다.
git 공식문서에서 rebase -i 옵션을 찾아보면 다음과 같이 나온다. ( https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt--i )
Git - git-rebase Documentation
In interactive mode, you can mark commits with the action "edit". However, this does not necessarily mean that git rebase expects the result of this edit to be exactly one commit. Indeed, you can undo the commit, or you can add other commits. This can be u
git-scm.com
-i
--interactive
Make a list of the commits which are about to be rebased. Let the user edit that list before rebasing. This mode can also be used to split commits (see SPLITTING COMMITS below).
The commit list format can be changed by setting the configuration option rebase.instructionFormat. A customized instruction format will automatically have the commit hash prepended to the format.
See also INCOMPATIBLE OPTIONS below.
즉 작업중이던 브랜치에서 특정 커밋 해시값을 이용해 해당 커밋을 기준으로 리베이스하는데 interactive 옵션을 적용해서 리베이스할 커밋들의 리스트를 만들어 조정하는 방식이다. 기능 단위로 꽤나 작고 잦게 커밋하는 일이 많은 나는 굉장히 유용하게 사용할 것 같다! 다만 위에도 적었지만 내가 작업중인 내용에 대해서는 유용하게 사용하되 협업하는 브랜치에서는 사용을 지양하는 게 좋을 거라고 생각했다. 이미 pr 올려서 디벨롭에 머지됐다? 그럼 그냥 커밋을 새로 쌓는 게 낫겠지.