$ 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 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"
--include-untracked
또는 -u
옵션을 준다.push
는 새로 추가된 명령어로 저장과 메시지 지정 모두 가능하다. save
에는 없는 pathspec
관련 옵션이 있다.git stash list
git stash apply
git stash apply --index
를 해준다.git stash pop
apply
후 스택에서 제거한다.git stash drop
git stash clear
git stash branch <브랜치>