如何撤消Git中的最新本地提交?

How do I undo the most recent local commits in Git?
投票:20291回答:81

我不小心將錯誤的文件提交給Git ,但是我還沒有將提交推送到服務器。

如何撤消本地存儲庫中的那些提交?

tags:git,version-control,git-commit,undo,pre-commit
81回答
447
投票

我想撤消我們共享存儲庫中的最新五次提交。 我查找了要回滾的修訂版ID。 然後我輸入以下內容。

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

633
投票

使用git revert <commit-id>

要獲取提交ID,只需使用git log


426
投票

我更喜歡使用git rebase -i來完成這項工作,因為會彈出一個不錯的列表,我可以在其中選擇要刪除的提交。 它可能不像這裡的其他答案那麼直接,但是感覺不錯。

選擇要列出的提交數量,然後像這樣調用(以列出最後三個)

git rebase -i HEAD~3

樣品清單

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

然後,Git將刪除您刪除的任何行的提交。


513
投票

如果您打算完全撤消本地提交,則對提交所做的任何更改,如果您對此不擔心,只需執行以下命令即可。

git reset --hard HEAD^1

(此命令將忽略您的整個提交,並且您的更改將完全從本地工作樹中丟失)。 如果要撤消提交,但是要在登台區域中進行更改(在提交之前,就像在git add之後一樣),請執行以下命令。

git reset --soft HEAD^1

現在,您提交的文件進入暫存區。 假設如果您要升級文件,因為您需要編輯一些錯誤的內容,請執行以下命令

git reset HEAD

現在已提交的文件將從暫存區域進入未暫存區域。 現在文件已準備好進行編輯,因此無論您進行什麼更改,都希望對其進行編輯並將其添加並進行新的/新的提交。

更多


410
投票

如何修復先前的本地提交

使用git-gui(或類似的工具)執行git commit --amend 在GUI中,您可以從提交中添加或刪除單個文件。 您還可以修改提交消息。

如何撤消之前的本地提交

只需將分支重置到先前的位置即可(例如,使用gitkgit rebase )。 然後從保存的副本重新應用您的更改。 在本地存儲庫中進行垃圾回收之後,就像從未發生過不需要的提交一樣。 要在單個命令中完成所有操作,請使用git reset HEAD~1

警告粗心地使用git reset是使工作副本進入混亂狀態的好方法。 我建議Git新手盡可能避免這種情況。

如何撤消公開提交

執行反向櫻桃挑git-revert )撤消更改。

如果您尚未將其他更改添加到分支中,則只需執行...

git revert --no-edit HEAD

然後將更新後的分支推送到共享存儲庫。

提交歷史記錄將分別顯示兩個提交


高級:更正公共存儲庫中的私有分支

這可能很危險-確保您具有要重新推送的分支的本地副本。

另請注意:如果其他人可能正在分支上工作,則您不想這樣做。

git push --delete (branch_name) ## remove public version of branch

在本地清理您的分支,然後重新啟動...

git push origin (branch_name)

在正常情況下,您可能不必擔心您的私人分支提交歷史記錄很原始。 只需推送一個後續提交(請參見上面的“如何撤消公共提交”),然後再執行壁球合併即可隱藏歷史記錄。


149
投票

其它的辦法:

簽出您要還原的分支,然後將本地工作副本重置回您要成為遠程服務器上最新提交的提交(此操作之後的所有操作都會再見)。 為此,我在SourceTree中右鍵單擊,然後選擇“將BRANCHNAME重置為此提交”。

然後導航到存儲庫的本地目錄並運行以下命令:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

這將刪除本地存儲庫中當前提交之後的所有提交,但僅針對該分支。


140
投票

輸入git log並找到最後的提交哈希碼,然後輸入:

git reset <the previous co>

326
投票

如果您想永久撤消它,並且已經克隆了一些存儲庫

提交ID可以通過

git log 

然後,您可以-

git reset --hard <commit_id>

git push origin <branch_name> -f

276
投票

SourceTree (適用於GitHub的GUI)上,您可以右鍵單擊提交並執行“反向提交”。 這應該撤消您的更改。

在終端上:

您也可以使用:

git revert

要么:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

135
投票

就我而言,我意外地提交了一些我不想提交的文件。 所以我做了以下工作,它起作用了:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

使用gitk或git log --stat驗證結果


122
投票

使用SourceTree (Git的圖形工具)查看提交和樹。 您可以通過右鍵單擊直接將其手動重置。


178
投票

“將工作樹重置為最後一次提交”

git reset --hard HEAD^ 

“從工作樹中清除未知文件”

git clean    

參見-Git快速參考

注意:此命令將刪除您以前的提交,因此請謹慎使用! git reset --hard更安全–


160
投票

首輪:

git reflog

它將顯示您對存儲庫執行的所有可能操作,例如,提交,合併,拉取等。

然後做:

git reset --hard ActionIdFromRefLog

184
投票

使用reflog查找正確的狀態

git reflog

刷新之前 重置前重新記錄

選擇正確的引用日誌(在我的情況下為f3cb6e2)並輸入

git reset --hard f3cb6e2

之後,回購HEAD將重置為該HEADid 重置效果 重置後記錄

最後,reflog如下圖所示

刷新後 最後完成


121
投票

對於本地提交

git reset --soft HEAD~1

或者,如果您不記得確切的提交時間,則可以使用

git rm --cached <file>

對於推送的提交

從存儲庫歷史記錄中刪除文件的正確方法是使用git filter-branch 那是,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

但我建議您謹慎使用此命令。 git-filter-branch(1)手冊頁中閱讀更多內容。


256
投票

單個命令:

git reset --soft 'HEAD^' 

撤消上一次本地提交非常有用!


228
投票

如何撤消最後的Git提交?

為了將所有內容恢復到上一次提交之前的狀態,我們需要重置為HEAD之前的提交。

  1. 如果您不想保留所做的更改,請執行以下操作:

     git reset --hard HEAD^ 
  2. 如果要保留更改:

     git reset --soft HEAD^ 

現在檢查您的git日誌。 它將顯示我們的上一次提交已被刪除。


122
投票

要重置為先前的版本,請永久刪除所有未提交的更改:

git reset --hard HEAD~1

326
投票

如果您犯了垃圾但沒有被推,

git reset --soft HEAD~1

HEAD〜1是head之前提交的簡寫。 或者,如果您想重置為哈希,則可以引用哈希的SHA-1 --soft選項將刪除提交,但會保留所有更改的文件“要提交的更改”,因為git status會將其保存。

如果您想擺脫工作樹中被跟踪文件的任何更改,因為在頭部之前的提交使用“ --hard ”代替。

要么

如果您已經推送並且有人拉了通常是我的情況,則不能使用git reset 不過,您可以執行git revert

git revert HEAD

這將創建一個新的提交,以撤消意外提交所引入的所有內容。


745
投票

更改最後一次提交

替換索引中的文件:

git rm --cached *.class
git add *.java

然後,如果它是一個私有分支,則修改提交:

git commit --amend

或者,如果它是一個共享分支,請重新提交:

git commit -m 'Replace .class files with .java files'


要更改以前的提交 ,請使用令人敬畏的交互式rebase 。)


ProTip™:將*.class添加到gitignore中,以阻止這種情況再次發生。


還原提交

如果您需要更改最後的提交,則修改提交是理想的解決方案,但是reset了更通用的解決方案。

您可以使用以下命令將Git重置為任何提交:

git reset @~N

其中NHEAD之前的提交次數, @~重置為前一個提交。

因此,您可以使用:

git reset @~
git add *.java
git commit -m "Add .java files"

查看git help reset ,特別是--soft --mixed--hard上的部分,以更好地了解其功能。

刷新日誌

如果您搞砸了,可以隨時使用reflog查找丟棄的提交:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



129
投票

很簡單,在命令行中運行以下命令:

git reset --soft HEAD~ 

124
投票

有很多方法可以做到這一點:

使用Git命令撤消上一次提交/上一次提交:

警告:如果您不知道自己在做什麼,請不要使用--hard。 --hard太危險了 ,它可能會刪除您的文件。

恢復Git中的提交的基本命令是:

$ git reset --hard <COMMIT -ID>

要么

$ git reset --hard HEAD~<n>

COMMIT-ID :提交的ID

n:是您要還原的最後一次提交的次數

您可以獲取提交ID,如下所示:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

其中d81d3f1be20eb8是提交ID。

現在讓我們看一些情況:

假設您想還原最後的提交'd81d3f1'。 這裡有兩個選擇:

$ git reset --hard d81d3f1

要么

$ git reset --hard HEAD~1

假設您要還原提交“ be20eb8”:

$ git reset --hard be20eb8

有關更多詳細信息,您也可以參考並嘗試其他一些命令以將head重置為指定狀態:

$ git reset --help

153
投票

撤消上一次提交:

git reset --soft HEAD^git reset --soft HEAD~

這將撤消上一次提交。

在這裡--soft表示重置為暫存。

HEAD~HEAD^表示要在HEAD之前提交。


將最後的提交替換為新的提交:

git commit --amend -m "message"

它將用新的提交替換最後的提交。


247
投票

只需使用git使用以下命令將其重置:

git reset --soft HEAD~1

說明: git reset作用,基本上是resetreset為您要返回的任何提交,然後,如果將其與--soft key結合使用,它將返回,但會將更改保留在文件中,因此返回到剛剛添加文件的階段, HEAD是分支的頭,如果與~1組合(在這種情況下,您還使用HEAD^ ),它將僅返回您想要的一次提交。 ..

我在下圖中為您創建了更詳細的步驟,包括在實際情況下和提交代碼時可能發生的所有步驟:

如何撤消Git中的最後一次提交?


2022
投票

有兩種方法可以“撤消”您的上一次提交,具體取決於您是否已將提交公開(推送到遠程存儲庫):

如何撤消本地提交

假設我在本地提交了,但是現在我想刪除該提交。

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

要將所有內容恢復到上一次提交之前的狀態,我們需要resetHEAD之前的提交:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

現在, git log將顯示我們的上一次提交已被刪除。

如何撤消公開提交

如果已經將提交公開,則需要創建一個新的提交,該提交將“還原”您在先前提交(當前HEAD)中所做的更改。

git revert HEAD

您的更改現在將恢復並準備提交:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

有關更多信息,請查看Git基礎知識-撤消事情


10451
投票

如果您不知道提交的工作方式,則撤消提交會有些嚇人。 但是,如果您理解的話,實際上非常容易。

假設您有這個,其中C是您的HEAD,(F)是您的文件狀態。

   (F)
A-B-C
    ↑
  master

您想核對C,然後再也看不到它了 你做這個:

git reset --hard HEAD~1

結果是:

 (F)
A-B
  ↑
master

現在B是HEAD。 因為使用了--hard ,所以文件在提交B時將重置為其狀態。

嗯,但是假設提交C並不是一場災難,只是有點困難。 您想要撤消提交,但是在進行更好的提交之前,請對更改進行一些編輯。 從這裡再次開始,以C作為您的HEAD:

   (F)
A-B-C
    ↑
  master

您可以執行此操作,而無需使用--hard

git reset HEAD~1

在這種情況下,結果為:

   (F)
A-B-C
  ↑
master

在這兩種情況下,HEAD都只是指向最新提交的指針。 當您執行git reset HEAD~1 ,您告訴Git將HEAD指針移回一次提交。 但是(除非使用--hard否則)將文件保持原樣。 因此,現在git status顯示您已簽入C的更改。您還沒有丟失任何東西!

對於最輕鬆的接觸,您甚至可以撤消提交,但保留文件和索引

git reset --soft HEAD~1

這不僅讓您的文件獨自一人,甚至讓索引也獨自一人。 當您執行git status ,您將看到與以前相同的文件在索引中。 實際上,在執行此命令後,您可以執行git commit然後重做剛才的相同提交。

還有一件事: 假設您像第一個示例一樣破壞了一個提交但是畢竟發現您需要它 運氣不好吧?

不, 仍然有辦法找回它。 輸入git reflog ,您將看到移入其中的(部分)提交SHA-1哈希的列表。找到您破壞的提交,然後執行以下操作:

git checkout -b someNewBranchName shaYouDestroyed

您現在已經復活了該提交。 在Git中,提交實際上並沒有被銷毀約90天,因此您通常可以回去拯救不是故意要擺脫的一個。


480
投票

如果安裝了Git Extras ,則可以運行git undo撤消最新的提交。 git undo 3將撤消最後三個提交。


980
投票
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

要么

git reset --hard HEAD~1

警告:以上命令將永久刪除您要提交的對.java文件(和任何其他文件)的修改。

hard resetHEAD-1會將您的工作副本設置為錯誤提交之前的提交狀態。


21978
投票

撤消提交並重做

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. 這是您要撤消的操作。
  2. 這對您的工作樹(磁盤上文件的狀態)沒有任何作用,但是會撤消提交,並使您提交的更改未進行暫存(因此,它們將在git status顯示為“未暫存為提交的更改”),因此您將需要在提交之前再次添加它們)。 如果你只是想更多的變化添加到先前的承諾,或修改提交信息1,你可以使用git reset --soft HEAD~代替,這就好比是git reset HEAD~ 2但保留現有的變化上演。
  3. 對工作樹文件進行更正。
  4. git add要包含在新提交中的任何內容。
  5. 提交更改,重新使用舊的提交消息。 reset將舊頭複製到.git/ORIG_HEAD ; 使用-c ORIG_HEAD commit -c ORIG_HEAD將打開一個編輯器,該編輯器最初包含舊提交的日誌消息,並允許您對其進行編輯。 如果不需要編輯消息,則可以使用-C選項。

但是請注意,如果您向索引添加了任何新的更改,則使用commit --amend會將它們添加到以前的提交中。

如果代碼已經推送到服務器,並且您有權覆蓋歷史記錄(變基),則:

git push origin master --force

您還可以查看以下答案:

如何將HEAD移回先前的位置? (獨立的頭部)和撤消提交

上面的答案將向您顯示git reflog ,用於查找您希望還原為的SHA-1。 找到要撤消的點後,即可使用上述命令序列。


1注意,但是,如果您在commit message了一個錯誤,則無需重置為較早的提交。 較簡單的選項是git reset (取消對您自此以來所做的任何更改),然後git commit --amend ,這將打開您的默認提交消息編輯器,該編輯器預填充了最後一條提交消息。

2 HEAD~HEAD~1相同。 另請參閱git中的HEAD是什麼? 如果您要取消提交多個提交,這將很有幫助。


1711
投票

添加/刪除文件以所需的方式獲取內容:

git rm classdir
git add sourcedir

然後修改提交:

git commit --amend

先前的錯誤提交將被編輯以反映新的索引狀態-換句話說,就好像您從未犯過錯誤。

請注意,只有在尚未推送的情況下,才應該這樣做。 如果已推送,則只需正常提交修復程序即可。


©2020 sofbug.com - All rights reserved.