git을 이용해 코드관리를 하다보면 커밋 메시지에 오타가 생기거나 설명을 잘 못 추가하는 경우가 간혹있다. 커밋 로그를 잘 적어놔야 코드의 유지보수가 편한데, 커밋 로그를 잘못 작성했다면 수정을 해야한다.
commit --amend
마지막 커밋을 수정하려면 git commit --amend
를 이용하면 된다.
$ git commit --amend -m "New Commit message"
$ git push -f
커밋 메시지가 변경되어 Commit Hash 값이 바뀌었으므로 원격 저장소에 -f
옵션을 이용해서 강제로 푸쉬를 해줘야 수정이 된다.
rebase -i
개발 브랜치를 따서 작업을 한 다음 머지(Merge)를 했는데 잘못된 커밋 로그를 발견한 경우도 있다. 마지막 커밋에 대한 수정이 아닌 커밋로그 중간을 수정해야하는 경우에는 git commit --amend
를 사용할 수 없다.
이 경우 git rebase -i
명령을 이용해서 커밋 메시지를 수정할 수 있다.
$ git rebase -i HEAD~5
-i
옵션의 인자로 넘겨준 HEAD~5
는 현재 브랜치의 HEAD 부분부터 5개의 커밋에 대해 rebase를 진행하겠다는 의미다. 이 명령을 수행하면 최근 5개의 커밋내용이 출력된다.
pick 2de6ad3 Commit 1
pick 7f983e1 Commit 2
edit b9e5b8e Commit
pick 60f48c9 Commit 4
pick 9ee6cd1 Commit 5
# Rebase 8e2ec4d..9ee6cd1 onto 8e2ec4d (5 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
각 커밋 해시 값의 앞에는 pick
이라는 단어가 붙어있다. pick은 커밋 로그를 그대로 사용하겠다는 의미다. 수정하고 싶은 커밋 메시지의 pick을 edit
으로 바꿔준다.
에디터로 vi
를 사용하고 있다면 수정한 상태에서 :wq
를 이용해서 수정한 내용을 저장하고 종료한다. 그러면 리베이스가 시작된다. Commit, Commit2는 pick을 했기 때문에 기존 커밋을 그대로 이용한다. edit
을 명시한 b9e5b8e
커밋에서 리베이스가 멈춘다.
$ git commit --amend
이 상태에서 git commit --amend
명령을 이용해 커밋 로그를 수정한다.
Commit
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Thu Sep 17 20:20:20 2020 +0900
#
# interactive rebase in progress; onto 8e2ec4d
# Last commands done (3 commands done):
# pick 7f983e1 Commit 2
# edit b9e5b8e Commit
# Next commands to do (2 remaining commands):
# pick 60f48c9 Commit 4
# pick 9ee6cd1 Commit 5
# You are currently editing a commit while rebasing branch 'master' on '8e2ec4d'.
#
원하는 커밋 로그로 수정한 다음 :wq
로 저장하고 종료한다. 이제 커밋 로그가 수정되었다.
$ git rebase --continue
rebaes --continue
를 이용해서 리베이스를 계속한다. 이런식으로 edit
해 놓은 커밋 로그들을 수정한다.
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
레베이스가 종료되면 Successfully 어쩌구가 나오면서 리베이스가 종료된다. git log
를 이용해 수정된 커밋 로그를 확인해보자. 그리고 git push -f
를 이용해서 원격 저장소에 강제로 푸쉬하면 된다.
댓글