HOWTO · Git

撤消本地倉庫中的最後一次 Git 提交

你可以撤消最後一次 git 提交併保留檔案更改。

本頁內容

本文將討論如何撤消 Git 中的最新提交。當我們想要在將提交推送到遠端倉庫之前刪除提交引入的更改時,這會派上用場。

讓我們直接開始吧。

在 Git 中撤消上次提交而不修改檔案

我們將通過討論如何在對檔案進行先前的修改時撤消提交來開始事情。為此,我們使用帶有 -soft 引數的 git reset 命令來指示 Git 保留我們檔案的內容。

$ git reset --soft HEAD~1

上面的命令將刪除我們的 HEAD 上的最後一次提交。

讓我們看一個例子。這是我們本地倉庫中的提交歷史記錄。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

讓我們執行 git reset 命令並檢查它對我們本地倉庫的影響。

git 重置

上面的輸出顯示我們的 file.txt 在我們的索引中,但提交不存在。我們可以對檔案進行修改並再次提交。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) (HEAD)
* 3b641e0  Second commit (HEAD~1)
* 21ca1e7  Initial commit (HEAD~2)

我們的命令 $ git reset --soft HEAD~1 刪除了最後一次提交。如果我們要刪除最後兩個提交,我們將改為使用 $ git reset --soft HEAD~2 等等。

有時,我們可能希望消除提交和檔案。我們使用帶有 -hard 選項的 git reset 命令,如下所示。

$ git reset --hard HEAD~1

上面的命令將從我們的索引和工作目錄中刪除與提交相關的所有修改。

讓我們看一個例子。這是我們提交歷史的視覺化。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

在這種情況下,我們希望刪除最後一次提交併取消修改。

我們跑:

$ git reset --hard HEAD~1
HEAD is now at 3b641e0 Second commit

讓我們執行 git status 命令來檢查我們的 repo 的狀態。

git status

上面的輸出顯示 Git 從我們的索引和工作目錄中刪除了檔案。

我們可能還需要撤消最後一次提交併在工作目錄中保留更改,但在我們的索引上。為此,我們在 git reset 命令中新增 --mixed 選項,如下所示。

$ git reset --mixed HEAD~1

讓我們看一個例子。這是我們提交歷史的當前狀態。

$ git log --oneline --graph
* c5bf6c8  (HEAD -> master) Added a new file named "file.txt"
* 3b641e0  Second commit
* 21ca1e7  Initial commit

我們跑:

$ git reset --mixed HEAD~1

我們的檔案應該在工作目錄中可見,但在索引中不存在。讓我們用 git status 命令確認這一點。

用 git status 確認

我們可以看到我們的 file.txt 在未跟蹤的檔案下。這是在保留修改的同時撤消提交的另一種方式。