[Git] 커밋 메시지 수정하기 - amend, rebase, stash

dondonee·2023년 11월 8일
0
post-thumbnail

커밋 메시지 수정하기

✔️ 직전 커밋 메시지 수정하기

$ git commit --amend

주의! 워킹트리 내용 함께 커밋됨

commit --amend는 사실 커밋 메시지만 변경하는 명령은 아니다. 최근의 변경 내역을 최신 커밋에 합쳐 새로운 커밋으로 만들어주는 명령어다(SHA-1 해시값이 변경된다). 워킹트리에 변경내역이 있다면 메시지 뿐만 아니라 워킹트리의 내역까지 다시 만들어지는 커밋에 포함되는 것이다. Git에서는 메시지 수정 또한 커밋의 변경으로 간주하기 때문이다.
따라서 만약 워킹트리에 수정 내역이 있는데, 이것은 반영하지 않고 정말 커밋 메시지만 변경하고 싶다면 git stash를 통해 스택에 변경사항을 별도로 임시 저장해두고, commit --amend를 통해 커밋 메시지를 변경한 뒤 stash에서 저장한 내역을 워킹트리로 다시 꺼내오면 된다.

또 다른 사용법

커밋 메시지만 변경하는 명령어가 아니라니 번거롭게 느껴졌는데 쓰다보니 그렇지만도 않았다. 깜빡하고 스테이지에 올리지 못하고 커밋한 내용이 있을 때, git add를 한 뒤 commit --amend를 하면 빠뜨린 내용이 최신 커밋에 포함된다.
커밋 메시지를 변경할 필요가 없는 경우 git commit --amend --no-edit와 같이 옵션을 주면 메시지 편집창이 뜨지 않고 커밋된다.


✔️ 예전 커밋 메시지 수정하기

$ git rebase -i HEAD~n

위 명령어를 치면 커밋 리스트가 뜬다. Vi 편집기에서 변경할 커밋의 "pick"을 "reword"로 변경한 뒤 저장하고 종료(:wq)하면 커밋 메시지 편집창이 뜬다. 커밋 메시지를 변경하고 저장한다.

만약 워킹트리에 변경내역을 가지고 있다면 경고가 뜬다. stash에 따로 저장해두고 다시 시도하면 된다.


✔️ 원격저장소의 예전 커밋 메시지 수정하기

$ git push -f
$ git push -force

push -force는 최대한 사용하면 안 된다. 혼자 사용하는 프로젝트라면 상관 없겠지만, 여러 팀원이 함께 사용하는 프로젝트에서 push -f를 통해 수정하는 경우 기존의 커밋을 가지고 있던 다른 팀원들이 수동으로 해당 내역을 변경해야 한다.


참고) 📦 Stash

"Stash away"는 "쟁여둔다", "숨겨둔다"는 뜻이다. stash는 아직 완료되지 않은 워킹트리의 내용을 별도의 공간에 저장해두는 명령어이다. Modified이면서 Tracked 상태인 파일과 Staging Area에 있는 상태(state)를 보관한다. 다른 브랜치로 checkout해도 보존된다.

스택 개념이기 때문에 밑에서 0번부터 쌓이고 꺼내기와 삭제 작업은 최신 것부터 가능하다. 기본적으로는 그렇지만 특정 state를 선택하여 작업할 수 있다(예. git stash pop 0).

git stash list [<log-options>]
git stash show [-u | --include-untracked | --only-untracked] [<diff-options>] [<stash>]
git stash drop [-q | --quiet] [<stash>]
git stash pop [--index] [-q | --quiet] [<stash>]
git stash apply [--index] [-q | --quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
                [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
                [--pathspec-from-file=<file> [--pathspec-file-nul]]
                [--] [<pathspec>...]]
git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
               [-u | --include-untracked] [-a | --all] [<message>]
git stash clear
git stash create [<message>]
git stash store [(-m | --message) <message>] [-q | --quiet] <commit>

명령어

  • 저장: git stash save(git stash), git stash push
    • 보관 콘텐츠에 메시지(레이블)를 지정할 수 있음: git stash "making a big change"
    • tracked 상태가 아닌 파일을 함께 저장하려면 --include-untracked 또는 -u 옵션을 준다.
    • push는 새로 추가된 명령어로 저장과 메시지 지정 모두 가능하다. save에는 없는 pathspec 관련 옵션이 있다.
  • 보관 목록 표시: git stash list
  • 최신 state 적용: git stash apply
    • 스택에 아직 남아있기 때문에 따로 삭제 명령을 해주어야 한다.
    • 기본적으로 staged 상태였던 파일을 그대로 스테이지에 올려주지 않기 때문에 저장했을 때의 스테이지 상태와 같이 복구하려면 git stash apply --index를 해준다.
  • 최신 state 꺼내기: git stash pop
    • apply 후 스택에서 제거한다.
  • 삭제: git stash drop
  • 스택 모두 비우기: git stash clear
  • 새로운 stash branch 만들기: git stash branch <브랜치>
    • 스택에 내용을 저장하고 명령을 실행할 때의 커밋에서 checkout한 뒤, 새 브랜치를 생성하여 저장한 state를 적용하고 스택에서 제거한다. (복구 시에 충돌 걱정이 없다.)

🔗 References

0개의 댓글