簡體   English   中英

如何取消提交受保護分支上的最后一次合並?

[英]How do I uncommit last merge on a protected branch?

如何取消提交受保護分支上的最后一次合並?

git reset --hard HEAD~1

git push -f origin master

在注意到最后一次合並在生產中存在 UI 錯誤后,我做了以下操作,但在本地環境中沒有。

$ git push -f origin master
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: error: GH006: Protected branch update failed for refs/heads/master.
remote: error: Cannot force-push to this protected branch
To https://github.com/Ivory/Web.git
 ! [remote rejected]     master -> master (protected branch hook declined)
error: failed to push some refs to 'https://github.com/Ivory/Web.git'

但是,我不能強制推送,有沒有辦法取消提交更改?

有不同級別的受保護分支。 我不知道在您的情況下,保護是否需要 PR 才能合並到master ,或者您是否可以推送新的提交,但不能強制推送。 除非您可以讓某人暫時禁用保護或讓您暫時強制推送,否則您將需要恢復合並:

git fetch # update your branches
git checkout master 
git reset --hard @{u} # make your copy of master look like origin/master
git log # copy the merge commit ID that you want to revert (press q to exit)
git revert -m 1 <commit-id-to-revert>
git log # View the log message of your new commit and verify that it is correct
# verify your code looks correct (obviously)
git push

如果推送有效,那么您的“保護”只是防止強制推送。 如果仍然失敗,請創建一個新分支並將其 PR 到master

git checkout -b fixup-bad-merge # or whatever you want to call this branch
git push
# now create your PR into master and do what needs to be done to complete it

正如其他用戶在評論中所說,您有兩種選擇:

  1. 取消保護您的分支,我想這不是一個選項,否則您不會發布問題
  2. git revert合並分支帶來的更改

為了簡單起見(現在),這可能是您需要運行的命令:

git revert -m 2 HEAD

其中HEAD引用了合並提交,而-m 2僅表示您要還原第二個父級引入的更改。 但是,在還原合並提交時,您應該注意

恢復合並提交聲明您將永遠不希望合並帶來的樹更改。 因此,以后的合並只會帶來提交引入的樹更改,這些提交不是先前恢復的合並的祖先。 這可能是也可能不是您想要的。

git revert文檔

基本上,在您恢復合並提交后,您只是撤消更改,但歷史記錄仍將來自“恢復的分支”的提交視為主線的祖先。 因此,如果將來您想再次合並該分支,即使在發現錯誤的同一分支中修補了新提交后,您也不會看到屬於合並提交的還原父級的提交帶來的更改。 在這種情況下的解決方案是git revert恢復的提交。

我知道,沒有一些圖片聽起來有點復雜,Linus Torvalds 在這里解釋得比我好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM