4764
23094
我不小心將錯誤的文件提交給Git,但尚未將提交推送到服務器。
如何撤消本地存儲庫中的那些提交? 
1個
2
3
下一個
撤消提交並重做
$ git commit -m“某些東西被嚴重誤導了”#(0:您的事故)
$ git reset HEAD〜#(1)
<<根據需要編輯文件>>#(2)
$ git添加。 #(3)
$ git commit -c ORIG_HEAD#(4)
此命令負責撤消。它將撤消您的最後一次提交,同時保持工作樹(磁盤上文件的狀態)不變。您需要再次添加它們,然後才能再次提交它們。
對工作樹文件進行更正。
git添加要包含在新提交中的任何內容。
提交更改,重新使用舊的提交消息。重置將舊的頭複製到.git / ORIG_HEAD;使用-c提交ORIG_HEAD將打開一個編輯器,該編輯器最初包含舊提交的日誌消息,並允許您對其進行編輯。如果不需要編輯消息,則可以使用-C選項。
另外,要編輯先前的提交(或僅編輯其提交消息),commit --amend會將當前索引內的更改添加到先前的提交。
要刪除(而不是還原)已推送到服務器的提交,必須使用git push origin master --force重寫歷史記錄。
進一步閱讀
如何將HEAD移回先前的位置? (獨立的頭部)和撤消提交
上面的答案將向您顯示git reflog,您可以使用它來確定要還原到的提交的SHA-1。獲得此值後,請按照上述說明使用命令序列。
HEAD〜與HEAD〜1相同。文章git中的HEAD是什麼?如果您要取消提交多個提交,則很有幫助。
|
如果您不知道提交的工作方式,則撤消提交會有些嚇人。但是,如果您理解的話,實際上非常容易。我將向您展示撤銷提交的4種不同方式。
選項1:git reset --hard
假設您有這個,其中C是您的HEAD,(F)是您的文件狀態。
(F)
A-B-C
↑
主
您想核對提交C,再也看不到它,並且丟失本地修改文件中的所有更改。你來做這件事:
git reset --hard HEAD〜1
結果是:
(F)
A-B
↑
主
現在B是HEAD。因為使用了--hard,所以文件在提交B時被重置為其狀態。
選項2:git重置
嗯,但是假設提交C並不是一場災難,只是有點困難。您想要撤消提交,但是在進行更好的提交之前保留您的更改以進行一些編輯。從這裡再次開始,以C作為您的HEAD:
(F)
A-B-C
↑
主
您可以這樣做,而不必使用--hard:
git reset HEAD〜1
在這種情況下,結果為:
(F)
A-B-C
↑
主
在這兩種情況下,HEAD都只是指向最新提交的指針。當您執行git reset HEAD〜1時,您告訴Git將HEAD指針移回一次提交。但是(除非您使用--hard),否則文件將保持原樣。因此,現在git status顯示您已簽入C的更改。您還沒有丟失任何東西!
選項3:git reset --soft
對於最輕鬆的接觸,您甚至可以撤消提交,但保留文件和索引:
git reset --soft HEAD〜1
這不僅讓您的文件獨自一人,甚至使索引也獨自一人。當執行git status時,您會看到索引中的文件與以前一樣。實際上,在此命令之後,您可以執行git commit,並且將重做與剛才相同的提交。
選項4:您進行了git reset --hard操作,需要返回該代碼
還有一件事:假設您像第一個示例一樣破壞了一個提交,但是畢竟發現您需要它?運氣不好吧?
不,仍然有辦法找回它。輸入git reflog,您將看到移入其中的(部分)提交列表(即哈希)的列表。找到您破壞的提交,然後執行以下操作:
git checkout -b someNewBranchName shaYouDestroyed
您現在已經復活了該提交。在Git中,提交實際上並沒有被銷毀約90天,因此您通常可以回去拯救不是故意要擺脫的一個。
|
有兩種方法可以“撤消”您的上一次提交,具體取決於您是否已將提交公開(推送到遠程存儲庫):
如何撤消本地提交
假設我在本地提交了,但是現在我想刪除該提交。
git日誌
提交101:錯誤的提交#最新提交。這將被稱為“ HEAD”。
提交100:良好提交#倒數第二次提交。這是我們想要的。
要將所有內容恢復到上一次提交之前的狀態,我們需要重置為HEAD之前的提交:
git reset --soft HEAD ^#如果要保留更改,請使用--soft
git reset --hard HEAD ^#如果不關心保留所做的更改,請使用--hard
現在,git log將顯示我們的上一次提交已被刪除。
如何撤消公共承諾
如果您已經將提交公開,則需要創建一個新的提交,該提交將“還原”您在先前提交(當前HEAD)中所做的更改。
git恢復頭
您的更改現在將恢復並準備好提交:
git commit -m'恢復我意外刪除的文件'
git日誌
提交102:恢復我意外刪除的文件
提交101:刪除我們不需要的文件
承諾100:添加我們需要的文件
有關更多信息,請查看Git基礎知識-撤消事情。
|
添加/刪除文件以您想要的方式獲取內容:
git rm classdir
git添加sourcedir
然後修改提交:
git commit-修改
先前的錯誤提交將被編輯以反映新的索引狀態-換句話說,就好像您從未犯過錯誤。
請注意,只有在尚未推送的情況下,才應該這樣做。如果已推送,則只需正常提交修復程序即可。
|
git rm yourfiles / *。class
git commit -a -m“刪除了文件夾'yourfiles'中的所有類文件”
要么
git reset --hard HEAD〜1
警告:上面的命令將永久刪除您要提交的對.java文件(和任何其他文件)的修改。
硬重置為HEAD-1會將您的工作副本設置為錯誤提交之前的提交狀態。
|
更改最後一次提交
替換索引中的文件:
git rm-緩存* .class
git添加* .java
然後,如果它是一個私有分支,則修改提交:
git commit-修改
或者,如果它是一個共享分支,請重新提交:
git commit -m'用.java文件替換.class文件'
(要更改以前的提交,請使用令人敬畏的交互式rebase。)
ProTip™:將* .class添加到gitignore中,以阻止這種情況再次發生。
還原提交
如果需要更改最後的提交,則修改提交是理想的解決方案,但是會重置更通用的解決方案。
您可以使用以下命令將Git重置為任何提交:
git reset @〜N
其中N是HEAD之前的提交次數,@〜重置為前一個提交。
因此,您可以使用:
git reset @〜
git添加* .java
git commit -m“添加.java文件”
請查看git help reset,特別是有關--soft --mixed和--hard的部分,以更好地了解其功能。
刷新日誌
如果您搞砸了,可以隨時使用reflog查找丟棄的提交:
$ git reset @〜
$ git reflog
c4f708b HEAD @ {0}:重置:移至@〜
2c52489 HEAD @ {1}:提交:添加了一些.class文件
$ git reset 2c52489
...而您又回到了起點
|
使用git revert 。
要獲取提交ID,只需使用git log。
|
如果您打算完全撤消本地提交,則對提交所做的任何更改,如果您對此不擔心,只需執行以下命令即可。
git reset --hard HEAD ^ 1
(此命令將忽略您的整個提交,並且您的更改將完全從本地工作樹中丟失)。如果要撤消提交,但是要在登台區域中進行更改(在提交之前就像在git add之後一樣),請執行以下命令。
git reset --soft HEAD ^ 1
現在,您提交的文件進入暫存區。假設如果要升級文件,因為需要編輯一些錯誤的內容,請執行以下命令
git reset HEAD
現在已提交的文件將從暫存區域進入未暫存區域。現在文件已準備好進行編輯,因此無論您進行什麼更改,都希望對其進行編輯並添加它,然後進行新的/新的提交。
更多(鏈接斷開)(存檔版本)
|
如果安裝了Git Extras,則可以運行git undo撤消最新的提交。 git undo 3將撤消最後三個提交。
|
我想撤消我們共享存儲庫中的最新五次提交。我查找了要回滾的修訂版ID。然後我輸入以下內容。
提示> git reset --hard 5a7404742c85
HEAD現在位於5a74047
提示> git push origin master --force
總計0(增量0),重用0(增量0)
遠程:bb / acl:允許新生兒。接受的有效載荷。
到git@bitbucket.org:thecompany / prometheus.git
+ 09a6480 ... 5a74047主機->​​主機(強制更新)
提示>
|
我更喜歡使用git rebase -i來完成這項工作,因為會彈出一個不錯的列表,我可以在其中選擇要刪除的提交。它可能不像這裡的其他答案那麼直接,但是感覺不錯。
選擇要列出的提交數量,然後像這樣調用(以列出最後三個)
git rebase -i HEAD〜3
樣品清單
為RtmpSrv端口選擇aa28ba7完整性檢查
選擇c26c541 RtmpSrv版本選項
選擇58d6909更好的URL解碼支持
然後,Git將刪除您刪除的任何行的提交。
|
如何修復先前的本地提交
使用git-gui(或類似的工具)執行git commit --amend。在GUI中,您可以從提交中添加或刪除單個文件。您也可以修改提交消息。
如何撤消之前的本地提交
只需將分支重置到先前的位置即可(例如,使用gitk或git rebase)。然後從保存的副本重新應用您的更改。在本地存儲庫中進行垃圾回收之後,就像從未發生過不需要的提交一樣。要在單個命令中完成所有這些操作,請使用git reset HEAD〜1。
字警告:粗心使用git reset是使工作副本進入混亂狀態的好方法。我建議Git新手盡可能避免這樣做。
如何撤消公共承諾
執行反向Cherry Pick(git-revert)撤消更改。
如果您尚未將其他更改添加到分支中,則只需執行...
git revert --no-edit頭
然後將更新後的分支推送到共享存儲庫。
提交歷史記錄將分別顯示兩個提交。
高級:更正公共存儲庫中的私有分支
這可能很危險-確保您具有要重新推送的分支的本地副本。
另請注意:如果其他人可能正在分支上工作,則您不想這樣做。
git push --delete(branch_name)##刪除分支的公共版本
在本地清理您的分支,然後重新啟動...
git push origin(分支名稱)
在正常情況下,您可能不必擔心自己的私人分支提交歷史記錄很原始。只需推送一個後續提交(請參見上面的“如何撤消公共提交”),然後再執行壁球合併以隱藏歷史記錄。
|
如果您想永久撤消它,並且已經克隆了一些存儲庫
提交ID可以通過
git日誌
然後,您可以-
git reset --hard <提交ID>
git push origin <分支名稱> -f
|
如果您犯了垃圾但沒有被推,
git reset --soft HEAD〜1
HEAD〜1是head之前提交的簡寫。或者,如果您想重置為哈希,則可以引用哈希的SHA-1。 --soft選項將刪除提交,但會保留所有更改的文件“要提交的更改”,因為git status會將其保存。
如果您想擺脫對工作樹中跟踪文件的任何更改,因為在頭部之前的提交使用“ --hard”代替。
要么
如果您已經推送並且有人拉了(通常是我的情況),則不能使用git reset。但是,您可以執行git revert,
git恢復頭
這將創建一個新的提交,以撤消意外提交所引入的所有內容。
|
在SourceTree(適用於GitHub的GUI)上,您可以右鍵單擊提交並執行“反向提交”。這應該撤消您的更改。
在終端上:
您也可以使用:
git還原
要么:
git reset --soft HEAD ^#如果要保留更改,請使用--soft。
git reset --hard HEAD ^#如果您不關心保留更改,請使用--hard。
|
單個命令:
git reset --soft'HEAD ^'
撤消上一次本地提交非常有用!
|
只需使用git使用以下命令將其重置:
git reset --soft HEAD〜1
說明:git reset的作用,基本上是將其重置為您要返回的任何提交,然後,如果將其與--soft key結合使用,它將返回,但會將更改保留在文件中,因此返回到剛剛添加文件的階段,HEAD是分支的頭,如果與〜1組合(在這種情況下,您還使用HEAD ^),它將僅返回您想要的一次提交。 ..
我在下圖中為您創建了更多詳細信息的步驟,包括在實際情況下和提交代碼時可能發生的所有步驟:
|
如何撤消最後的Git提交?
為了將所有內容恢復到上一次提交之前的狀態,我們需要重置為HEAD之前的提交。
如果您不想保留所做的更改,請執行以下操作:
git reset --hard HEAD ^
如果要保留更改:
git reset --soft HEAD ^
現在檢查您的git日誌。它將顯示我們的上一次提交已被刪除。
|
“將工作樹重置為最後一次提交”
git reset --hard HEAD ^
“從工作樹中清除未知文件”
git clean
請參閱-Git快速參考
注意:此命令將刪除您以前的提交,因此請謹慎使用! git reset --hard更安全。
|
使用reflog查找正確的狀態
git reflog
重置前重新記錄
選擇正確的引用日誌(在我的情況下為f3cb6e2)並輸入
git reset --hard f3cb6e2
之後,回購HEAD將重置為該HEADid
重置後記錄
最後,reflog如下圖所示
最後完成
|
首輪:
git reflog
它將向您顯示您已對存儲庫執行的所有可能操作,例如,提交,合併,拉取等。
然後做:
git reset --hard ActionIdFromRefLog
|
撤消上一次提交:
git reset --soft HEAD ^或git reset --soft HEAD〜
這將撤消上一次提交。
在這裡--soft表示重置為暫存。
HEAD〜或HEAD ^表示要在HEAD之前提交。
將最後的提交替換為新的提交:
git commit --amend -m“消息”
它將用新的提交替換最後的提交。
|
其他方式:
簽出要還原的分支,然後將本地工作副本重置回您要成為遠程服務器上最新提交的提交(此操作之後的所有操作都會再見)。為此,我在SourceTree中右鍵單擊,然後選擇“將BRANCHNAME重置為此提交”。
然後導航到存儲庫的本地目錄並運行以下命令:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAME分支名稱:分支名稱
這將擦除本地存儲庫中當前提交之後的所有提交,但僅針對該分支。
|
鍵入git log並找到最後的提交哈希碼,然後輸入:
git reset <上一個合作夥伴>
|
就我而言,我意外地提交了一些我不想提交的文件。所以我做了以下工作,它起作用了:
git reset --soft HEAD ^
git rm --cached [不需要的文件]
git add [您需要的文件]
git commit -c ORIG_HEAD
使用gitk或git log --stat驗證結果
|
很簡單,在命令行中運行以下命令:
git reset --soft HEAD〜
|
主要有兩種情況
您尚未推送提交
如果問題是您提交了多餘的文件(並且您不希望這些文件存儲在存儲庫中),則可以使用git rm刪除它們,然後使用--amend提交
git rm 
您還可以使用-r刪除整個目錄,甚至可以與其他Bash命令結合使用
git rm -r <路徑到目錄>
git rm $(查找-name'* .class')
刪除文件後,可以使用--amend選項進行提交
git commit --amend -C HEAD#-C選項將使用相同的提交消息
這將重寫您最近的本地提交,從而刪除了多餘的文件,因此,這些文件將永遠不會在推送時發送,也將由GC從您的本地.git存儲庫中刪除。
您已經推送了提交
您可以應用其他方案的相同解決方案,然後使用-f選項進行git push,但是不建議這樣做,因為它會用不同的更改覆蓋遠程歷史記錄(可能會使您的存儲庫混亂)。
相反,您必須在沒有--amend的情況下進行提交(記住有關-amend`的信息:該選項將重寫上一次提交的歷史記錄)。
|
對於本地提交
git reset --soft HEAD〜1
或者,如果您不記得確切的提交時間,則可以使用
git rm-緩存<文件>
對於推送的提交
從存儲庫歷史記錄中刪除文件的正確方法是使用git filter-branch。那是,
git filter-branch --index-filter'git rm --cached <文件>'頭
但我建議您謹慎使用此命令。在git-filter-branch(1)手冊頁上閱讀更多內容。
|
要重置為先前的版本,請永久刪除所有未提交的更改:
git reset --hard HEAD〜1
|
使用什麼,重設--soft或重設--hard?
我只是為@Kyralessa的答案加上兩美分:
如果不確定要使用什麼,請使用--soft(為了安全起見,我使用此約定記住了--soft)。
為什麼呢
如果您錯誤地選擇--hard,則將丟失以前從未發生的更改。
如果錯誤地選擇--soft,則可以通過應用其他命令來獲得--hard相同的結果
git reset HEAD file.html
git checkout-file.html
完整的例子
回顯“一些更改...”> file.html
git添加file.html
git commit -m“錯誤的提交”
#我需要重設
git reset --hard HEAD〜1(取消更改)
# 要么
git reset --soft HEAD〜1#返回登台
git reset HEAD file.html#返回工作目錄
git checkout-file.html#取消更改
致謝@Kyralessa。
|
1個
2
3
下一個
高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。
不是您要找的答案?瀏覽標記為git version-control git-commit undo的其他問題,或提出您自己的問題。