git-commit add取消 - 如何撤消Git中最近提交的提交?




git取消push git取消commit (25)

在我的情況下,我不小心提交了一些我不想要的文件。 所以我做了以下工作:

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驗證結果

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

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


使用reflog查找正確的狀態

git reflog

重置前的REFLOG

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

git reset --hard f3cb6e2

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

最後,reflog如下圖所示

REFLOG FINAL


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

提交ID可以通過以下方式查看

git log 

然後你可以做 -

git reset --hard <commit_id>

git push origin <branch_name> -f

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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

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

More


主要有兩種情況

你尚未推送提交

如果問題是您提交的額外文件(並且您不希望存儲庫中存在這些文件),則可以使用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`:該選項會重寫最後一次提交的歷史記錄)。


第一次運行:

git reflog

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

然後做:

git reset --hard ActionIdFromRefLog

添加/刪除文件以獲得您想要的方式:

git rm classdir
git add sourcedir

然後修改提交:

git commit --amend

之前的錯誤提交將被編輯以反映新的索引狀態 - 換句話說,它就像你從來沒有犯過錯誤。

請注意,只有在尚未推送的情況下才應執行此操作。 如果你已推,那麼你只需要正常提交修復。


其他方式:

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

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

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

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


如何修復以前的本地提交

使用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 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將刪除您刪除的任何行的提交。


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


我想在我們的共享存儲庫中撤消最新的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 rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

要么

git reset --hard HEAD~1

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

HEAD-1 hard reset會在錯誤提交之前將工作副本設置為提交狀態。


如何撤消上次Git提交?

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

  1. 如果您不想保留所做的更改:

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

    git reset --soft HEAD^
    

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


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

假設你有這個,其中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重置它,執行以下命令:

git reset --soft HEAD~1

解釋: git reset作用是什麼,它基本上會reset為你想要回复的任何提交,然後如果你將它與--soft鍵結合使用,它會返回,但保留你文件中的更改,所以你回到剛剛添加文件的階段, HEAD是分支的頭部,如果你與~1結合(在這種情況下你也使用HEAD^ ),它將只返回你想要的一個提交。 ..

我將在下面的圖片中為您創建更多詳細信息,包括在實際情況中可能發生的所有步驟並提交代碼:


使用git revert commit-id

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


單個命令:

git reset --soft 'HEAD^' 

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


撤消上次提交:

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

這將撤消上次提交。

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

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

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

git commit --amend -m "message"

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


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.

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

git reset <the previous co>

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


有很多方法可以做到:

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 push origin --delete <your_branch> 

刪除本地分支 ,有三種方法:

1: git branch -D <branch_name> 

2: git branch --delete --force <branch_name>  //same as -D

3: git branch --delete  <branch_name>         //error on unmerge

解釋:好的,請解釋一下這裡發生了什麼!

只需要執行git push origin --delete刪除你的遠程分支 ,最後添加分支的名稱,這將刪除並同時將其推送到遠程...

另外, git branch -D ,它只是刪除本地分支!...

-D代表--delete --force ,它會刪除分支,即使它沒有合併(強制刪除),但你也可以使用-d代表--delete ,它會拋出分支合併狀態的錯誤...

我還創建了下面的圖像來顯示步驟:





git git-commit git-reset git-revert