remove - 如何撤消Git中最近提交的提交?




git取消push (20)

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

如何從本地存儲庫中撤消這些提交?

https://code.i-harness.com


如何修復以前的本地提交

使用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)

在正常情況下,您可能不必擔心您的私有分支提交歷史是原始的。 只需推送一個後續提交(參見上面的'如何撤消公共提交'),然後進行squash-merge以隱藏歷史記錄。


撤消上次提交:

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

這將撤消上次提交。

這裡--soft意味著重置為暫存。

HEAD~HEAD^表示在HEAD之前移動到提交。

將上次提交替換為新提交:

git commit --amend -m "message"

它將用新提交替換最後一次提交。


撤消提交和重做

$ 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~ (其中HEAD~HEAD~1相同) )但是現有的更改會暫停。
  3. 對工作樹文件進行更正。
  4. git add您想要包含在新提交中的任何內容。
  5. 提交更改,重用舊的提交消息。 reset將舊頭複製到.git/ORIG_HEAD ; 使用-c ORIG_HEAD commit將打開一個編輯器,該編輯器最初包含來自舊提交的日誌消息,並允許您對其進行編輯。 如果您不需要編輯消息,則可以使用-C選項。

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

如果代碼已經推送到您的服務器並且您有權覆蓋歷史記錄(rebase),那麼:

git push origin master --force

你也可以看看這個答案:

如何將HEAD移回以前的位置? (獨立頭)

上面的答案將向您展示git reflog ,它用於找出您希望恢復的SHA-1。 一旦找到要撤消的點,就可以使用上面解釋的命令序列。

1但是,請注意,如果您在提交消息中犯了錯誤,則無需重置為先前的提交。 更簡單的選擇是git reset (為了更新你之後所做的任何更改),然後是git commit --amend ,這將打開預先填充了最後一次提交消息的默認提交消息編輯器。


“將工作樹重置為上次提交”

git reset --hard HEAD^ 

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

git clean    

看 - Git快速參考

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


主要有兩種情況

你尚未推送提交

如果問題是您提交的額外文件(並且您不希望存儲庫中存在這些文件),則可以使用git rm刪除它們,然後使用git rm進行--amend

git rm <pathToFile>

您還可以使用-r刪除整個目錄,甚至可以與其他Bash命令結合使用

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

刪除文件後,您可以使用--amend選項進行提交

git commit --amend -C HEAD # the -C option is to use the same commit message

這將重寫您最近的本地提交刪除額外的文件,因此,這些文件永遠不會在推送時發送,也將由GC從您的本地.git存儲庫中刪除。

你已經推送了提交

您可以應用其他方案的相同解決方案,然後使用-f選項執行git push ,但不推薦使用它,因為它會以不同的更改覆蓋遠程歷史記錄(它可能會弄亂您的存儲庫)。

相反,你必須在沒有--amend的情況下進行提交(請記住這個關於-amend`:該選項會重寫最後一次提交的歷史記錄)。


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


使用reflog查找正確的狀態

git reflog

重置前的REFLOG

選擇正確的reflog(在我的例子中為f3cb6e2)並輸入

git reset --hard f3cb6e2

之後,repo HEAD將重置為該HEADid 重置後的日誌

最後,reflog如下圖所示

REFLOG FINAL


其他方式:

檢查要還原的分支,然後將本地工作副本重新設置為您希望成為遠程服務器上最新版本的提交(之後的所有內容將再次出現)。 為此,在SourceTree中我右鍵單擊並選擇“將BRANCHNAME重置為此提交”。

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

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

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


單個命令:

git reset --soft 'HEAD^' 

它可以很好地撤消上一次本地提交!


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.

如果你不知道如何工作,撤銷提交有點可怕。 但是如果你理解的話,這實際上非常容易。

假設你有這個,其中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的變化。你沒有丟失任何東西!

對於最輕微的觸摸,您甚至可以撤消提交但保留文件和index

git reset --soft HEAD~1

這不僅會使您的文件單獨存在,甚至會使您的索引單獨存在。 當你執行git status ,你會看到索引中的文件和以前一樣。 實際上,在這個命令之後,你可以執行git commit然後你將重做你剛剛提交的同一個提交。

還有一件事: 假設你在第一個例子中銷毀了一個提交但後來發現你需要它呢? 運氣好,對嗎?

不,還有辦法讓它回來。 輸入git reflog ,你會看到你已經移動的(部分)提交sha的列表。找到你銷毀的提交,並執行以下操作:

git checkout -b someNewBranchName shaYouDestroyed

你現在已經復活了這個提交。 提交實際上並沒有在Git中被摧毀大約90天,所以你通常可以回去拯救一個你並不想要擺脫的東西。


如果你犯了垃圾而沒有推,

git reset --soft HEAD~1

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

如果你想要去除工作樹中跟踪文件的任何更改,因為在頭部之前提交“ --hard ”之前。

要么

如果你已經推了並且有人拉了,這通常是我的情況,你不能使用git reset 。 但是你可以做一個git revert

git revert HEAD

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


如果您計劃完全撤消本地提交,無論您在提交時做了什麼更改,如果您對此沒有任何擔心,只需執行以下命令即可。

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

現在提交的文件從分段區域進入未分區區域。 現在文件已經可以編輯了,所以無論你做什麼改變,你都要編輯並添加它並進行新的/新的提交。

More


如果要在上次提交中刪除文件,可以使用:

git reset --hard HEAD~1

如果需要上次提交中的文件,您可以使用:

git reset --soft HEAD~1

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

git reset --soft HEAD~ 

我想在我們的共享存儲庫中撤消最新的5次提交。 我查找了想要回滾的修訂版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 [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

我花了一段時間才弄明白,所以也許這會幫助別人......

根據您是否已將提交公開(推送到遠程存儲庫),有兩種方法可以“撤消”上次提交:

如何撤消本地提交

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

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

要將所有內容恢復到上次提交之前的狀態,我們需要在HEAD之前reset為提交:

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 Basics - Undoing Things


有很多方法可以做到:

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是commit id。

現在讓我們看看一些案例:

假設您要還原最後一次提交'd81d3f1'。 這有兩個選擇:

$ git reset --hard d81d3f1

要么

$ git reset --hard HEAD~1

假設您要還原提交'be20eb8':

$ git reset --hard be20eb8

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

$ git reset --help

第一次運行:

git reflog

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

然後做:

git reset --hard ActionIdFromRefLog

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

git reset <the previous co>




git-revert