git branch




從Git中的分支刪除提交 (18)

git reset --hard

git push origin HEAD --force

如果標記了一個或多個提交,請首先刪除標記。 否則,不會刪除標記的提交。

我想知道如何刪除提交。

通過delete ,我的意思是,就好像我沒有進行提交,並且當我將來進行推送時,我的更改將不會推送到遠程分支。

我讀了git help,我認為我應該使用的命令是git reset --hard HEAD 。 它是否正確?


正如您在上面的圖像中看到的,我想刪除恢復“測試更改2”提交(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (您可以通過在git bash中使用gitk命令獲取SHA1 ID))。

為此,我可以使用(以下所有命令僅在本地工作。刪除後需要推送):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //它備份你的提交( 測試更改4提交的SHA1 ID是515b5220c50e3dfbb1063f23789d92ae1d3481a2
  2. git reset --hard HEAD~1 //它在一次提交之前備份你。
  3. git reset --hard HEAD^ //從git中刪除最後一次提交

刪除後:


小心: git reset --hard 將刪除你的工作目錄更改 。 在運行此命令之前,請務必隱藏要保留的任何本地更改

假設你正坐在那個提交上,那麼這個命令就會搞砸......

git reset --hard HEAD~1

HEAD~1表示在head之前提交。

或者,您可以查看git log的輸出,找到要備份的提交的提交ID,然後執行以下操作:

git reset --hard <sha1-commit-id>

如果你已經推了它,你需要做一個強制推動來擺脫它......

git push origin HEAD --force

但是 ,如果其他人可能已經取消了它,那麼你最好開始一個新的分支。 因為當他們拉動時,它會將它合併到他們的工作中,並且你會再次將它推回去。

如果你已經推動了,那麼最好使用git revert來創建一個“鏡像”提交,它將撤消更改。 但是,兩個提交都將在日誌中。

僅供參考 - git reset --hard HEAD - 如果您想擺脫WORK IN PROGRESS,那麼git reset --hard HEAD很棒。 它會將您重置為最近的提交,並清除工作樹和索引中的所有更改。

最後,如果您需要找到“已刪除”的提交,它通常存在於git reflog除非您有垃圾收集您的存儲庫。


我正在附上這個答案,因為我不明白為什麼那些剛剛嘗試提交工作的人會因為使用Git的一些錯誤而刪除所有工作!

如果你想保留你的工作並且只是'撤消'那個提交命令(你在推送回購之前就抓住了):

git reset --soft HEAD~1

除非您想要銷毀自上次提交以來正在進行的工作,否則請勿使用--hard標誌。


上面的所有命令都會在進行提交之前恢復工作樹和索引的狀態,但不會還原存儲庫的狀態。 如果你看一下,“刪除”的提交實際上並沒有被刪除,它根本就不是當前分支的尖端。

我認為沒有辦法刪除瓷器命令的提交。 唯一的方法是從日誌和reflog中刪除它,然後執行git prune --expire -now


使用git revert https://git-scm.com/docs/git-revert它將恢復所有代碼然後你可以做下一次commit.Then head將指向最後一次提交。 還原提交永遠不會刪除,但它不會影響您上次提交。


假設我們要從repo中刪除提交2和4。

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

注意: 您需要擁有repo的管理員權限,因為您使用的是--hard-f

  • git checkout b3d92c5簽出上次可用的提交。
  • git checkout -b repair創建一個新的分支來處理。
  • git cherry-pick 77b9b82通過提交3運行。
  • git cherry-pick 2c6a45b通過提交1運行。
  • git checkout master Checkout master。
  • git reset --hard b3d92c5重置為上次可用的提交。
  • git merge repair我們的新分支合併到master上。
  • git push -f origin master推送到遠程倉庫。

另一種可能性是我最喜歡的命令之一:

git rebase -i <commit>~1

這將在交互模式下啟動rebase -i ,就在您想要進行提交之前的那一點。 編輯器將從那時開始列出所有提交。 刪除包含要刪除的提交的行並保存文件。 Rebase將完成剩餘的工作,僅刪除該提交,並將所有其他提交重新放回日誌中。


如果你搞砸了你的最後一次提交(錯誤的消息,忘了添加一些更改)並希望在將其推送到公共倉庫之前修復它,為什麼不使用:

git commit --amend -m "New message here"

如果你有新的階段性更改,它們將與最後一次提交(你試圖擺脫)相結合,並將替換該提交。

當然,如果您在推送之後修改了提交,那麼您將重寫歷史記錄,因此如果您這樣做,請務必了解其含義。

如果您希望使用先前的提交消息,也可以傳遞'--no-edit'選項而不是'-m'。

文檔: http://git-scm.com/docs/git-commit.htmlhttp://git-scm.com/docs/git-commit.html


如果您尚未將提交推送到任何地方,則可以使用git rebase -i來刪除該提交。 首先,找出提交的回程(大約)。 然後做:

git rebase -i HEAD~N

~N表示最後N提交( N必須是數字,例如HEAD~10 )。 然後,您可以編輯Git提供給您的文件以刪除違規提交。 保存該文件後,Git將重寫所有以下提交,就好像您刪除的那個提交不存在一樣。

Git Book有一個很好的部分,有關圖片和示例的變基礎。

但要小心這一點,因為如果你改變了你其他地方推進的東西,除非你計劃進行強制推動,否則將需要另一種方法。


如果您沒有發布更改,則可以執行刪除最新提交

$ git reset --hard HEAD^

(請注意,這也會刪除所有未提交的更改;請謹慎使用)。

如果您已經發布了要刪除的提交,請使用git revert

$ git revert HEAD

如果要保留歷史記錄,顯示提交和還原,則應使用:

git revert GIT_COMMIT_HASH

輸入消息,解釋你為什麼要還原,然後:

git push  

當您發出git log您將看到“錯誤”提交和還原日誌消息。


將代碼備份到臨時文件夾中。 以下命令將重置為與服務器相同。

git reset --hard HEAD
git clean -f
git pull

如果您想保留更改,請刪除最近的提交

git reset --soft HEAD^
git pull


要在本地分支中刪除,請使用

git reset --hard HEAD~1

要在遠程分支中刪除,請使用

git push origin HEAD --force

資料來源: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

刪除最後一次提交

例如你最後一次提交

git push origin + aa61ab32 ^:master

現在您要刪除此提交,然後以簡單的方式執行此操作

腳步

  1. 首先將分支重置為當前提交的父級

  2. 強制將其推入遙控器。

git reset HEAD^ --hard

git push origin -f

對於特定提交,您要重置以下內容

git reset bb676878^ --hard

git push origin -f

錯誤:

git rebase -i --root my branch,無知地認為我可以改寫第一次提交與master不同( GitHub for Windows默認視圖是與master的比較,隱藏它的全部)。

我長大了一個矽谷的鬍子,而900多個提交加載到Sublime。 退出時沒有任何變化,我對電池進行了充電然後繼續刮鬍子,因為所有900多個人提交的都是不加協商的 - 重置他們的提交時間到現在。

決定擊敗Git並保留原始時間,我刪除了這個本地存儲庫並從遠程重新克隆。

現在它重新添加了一個最近不需要的提交給master我希望刪除,所以繼續這樣做。

耗盡選項:

我不希望git revert - 它會創建一個額外的提交,讓Git佔上風。

git reset --hard HEAD什麼都沒做,在檢查了reflog ,最後也是唯一的HEAD是克隆--Git獲勝。

為了獲得最新的SHA,我檢查了github.com上的遠程存儲庫 - 次要獲勝。

在考慮git reset --hard <SHA>之後,我更新了另一個分支到master和1 ... 2 ... poof! 提交回來了--Git贏了。

檢查回來掌握,時間嘗試git rebase -i <SHA> ,然後刪除行......無濟於事,可悲的說。 “ 如果你在這裡刪除一條線,那將會失敗 ”。 啊......在2.8.3發行說明中掩蓋了新功能巨魔n00b

解決方案:

git rebase -i <SHA>然後d, drop = remove commit

為了驗證,我檢查了另一個分支,瞧 - 沒有隱藏提交從主服務器獲取/拉取。

https://twitter.com/holman/status/706006896273063936

祝你好運


git rebase -i HEAD~2

這裡'2'是您要重新設置的提交數。

'git rebase -i HEAD`

如果你想重新提交所有提交。

然後,您將能夠選擇其中一個選項。

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

這些線可以重新排序; 它們是從上到下執行的。 如果你在這裡刪除一行,那麼COMMIT將會丟失。 但是,如果刪除所有內容,則將終止rebase。 請注意,空提交已註釋掉

您可以使用選項“d”或刪除具有提交的行來刪除該提交。





git-reset