撤銷 git commit --amend

韓師學子--胖佳發表於2019-03-16

                      撤銷 git commit --amend

 

轉載:https://segmentfault.com/a/1190000014272359


想必大家都知道 git commit --amend 這條實用命令, 其可以用來修改最後一條提交的 commit message, 也可以追加新的修改.
但有時候不小心 amend 了錯誤的內容, 如何回退呢?

普通青年一般會用 git reset 撤銷到上一個提交, 再重新 git commit 一次, 這固然是可以的.
但如果工作區此時已經改的面目全非, 這時如果執行 git reset, 就很難分的清哪些內容屬於被撤銷的提交了. 嗯, 這位同學說這種情況可以用 git stash來處理, 是可以解決問題的.
但是, 身為文藝青年, 怎麼能用這麼不優(zhuang)雅(bi)的方法呢.

先上結論:
如果只 amend 了一次, 那麼直接用 git reset HEAD@{1} 就可以撤銷這次 amend. 如果 amend 多次, 就參考 git reflog進行撤銷.

下面以例項介紹如何就地撤銷 git commit --amend.


製造事故現場
首先製造事故現場. 追加空行到專案中的 index.html 檔案下:
 

$ echo "" >> index.html 
$ git add .
$ git commit -m "add blank line to index.html"

然後再加一行到 index.html, 並 amend 一下:
 

$ echo "this line would break the code" >> index.html 
$ git add .
$ git commit --amend

現場已經出現, 我們要撤銷 amend 的那個提交.

撤銷 amend

首先使用 git reflog 命令檢視操作記錄:
 

$ git reflog
c1c1b21 HEAD@{0}: commit (amend): add blank line to index.html
9ff821d HEAD@{1}: commit: add blank line to index.html
b078331 HEAD@{2}: commit: no more commit!
b86e902 HEAD@{3}: commit: so many commit
77e6ce9 HEAD@{4}: commit: this is another commit
ccde039 HEAD@{5}: commit: this is a commit
a49dcf4 HEAD@{6}: clone: from ssh://liux@xxx.xx.xx.xxx:29418/git_test.git


看到 amend 操作之前的最後一個操作就是 HEAD@{1}.
現在可以用 git reset 將當前分支的 HEAD 指向 HEAD@{1}, 即可達到撤銷 amend 的目的:

$ git reset --soft HEAD@{1}
$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   index.html

隨即使用 git status 檢視狀態, 發現 amend 的內容已經被撤銷 (到工作區) 了.
如果想撤銷到暫存區, 就用 git reset --soft HEAD@{1} .
如果想幹掉這個修改, 就用 git reset --hard HEAD@{1} .
這和 git reset 操作 commit 的情形是一樣的.

如果一個 commit 被 amend 了多次, 也可以用這種方法撤銷到任意一次 amend 處:
 

$ git reflog
937fd53 HEAD@{0}: commit (amend): add blank line to index.html
7589755 HEAD@{1}: commit (amend): add blank line to index.html
f7ade82 HEAD@{2}: commit (amend): add blank line to index.html
c1c1b21 HEAD@{3}: commit (amend): add blank line to index.html
9ff821d HEAD@{4}: commit: add blank line to index.html
$ git reset --soft HEAD@{2}

可以看出, 不止是 amend 操作, 其他操作也可以用這種方法進行撤銷.

相關文章