2011-06-26 88 views
101

有人接受了他們不應該有的拉請求。現在我們合併了一堆破碎的代碼。如何撤消一個請求?我只是想在合併之前恢復對提交的更改,但我注意到它合併在一堆提交中。所以現在這個人在合併之前的幾天就有這些提交。你如何解決這個問題?通過拉取請求撤消合併?

+3

儘管接受的答案是建議,但如果回購與其他人共享,請勿強制推送到存儲庫。你冒着破壞別人已經完成的工作的風險,並且GitHub可能會繼續顯示pull請求已被合併。這個問題的另一個答案解釋了一個更安全的方法來撤消拉取請求。 – alxndr

+2

注意:至少現在(2014年6月),GitHub在其Pull Request Web GUI中提出了「恢復」按鈕。請參閱[我的答案](http://stackoverflow.com/a/24459309/6309) – VonC

+0

回覆按鈕的問題是,它創建一個新的提交作爲與拉請求相反的方式,這意味着如果您想要最終合併這些更改,使用「還原」按鈕可能會使這變得更加困難。 – FluffySamurai

回答

88

有一個better answer這個問題的最後一件事,雖然我可以打破這一步一步的。

您將需要獲取和結帳,像這樣的最新上游的變化,例如:

git fetch upstream 
git checkout upstream/master -b revert/john/foo_and_bar 

在提交日誌以一看,你會發現一些與此類似:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 
Merge: 9271e6e a507888 
Author: Tim Tom <[email protected]> 
Date: Mon Apr 29 06:12:38 2013 -0700 

    Merge pull request #123 from john/foo_and_bar 

    Add foo and bar 

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e 
Author: John Doe <[email protected]> 
Date: Mon Apr 29 12:13:29 2013 +0000 

    Add bar 

commit 470ee0f407198057d5cb1d6427bb8371eab6157e 
Author: John Doe <[email protected]> 
Date: Mon Apr 29 10:29:10 2013 +0000 

    Add foo 

現在您想要恢復整個拉取請求,並具有稍後恢復的能力。 爲此,您需要取合併提交的ID。

在上面的例子中合併提交是最上面的一個地方說:「合併拉請求#123 ......」

這樣做是爲了恢復兩個變化(「添加欄」「添加富」),你會最終在一個提交回復整個拉入請求,你可以unrevert以後,保持歷史改變清潔:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269 
+6

這應該是正確的答案。 git-revert手冊頁提供了git郵件列表的更多詳細信息https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge .txt –

+0

爲什麼'git checkout upstream/master -b revert/john/foo_and_bar'?它究竟做了什麼? – Magne

+2

@Magne - 您正在創建一個新分支來執行還原操作,然後您可以選擇合併還原的位置。基本上只是給你更多的控制如何處理分支。在我的情況中,我從這個「固定」分支提交了一個新的請求,包含返回到我們的開發分支,這意味着我的新的請求也可以在必要時恢復。這是爲了發佈我們決定推出已重新計劃的功能的初稿而完成的。沒有錯誤的代碼,只是不會在這個版本。 –

84

看看你的提交圖(使用gitk或類似的程序)。您將看到pull請求中的提交,並且您將看到您自己的提交以及合併提交(如果它不是快進合併)。您只需在合併之前查找自己的最後一個提交,並將分支重置爲此提交。

(如果有分支的引用日誌,它應該是更容易找到在合併之前提交。)


(編輯後的評論:)更多信息

Okay, lets look at the graph:

screenshot 1

我假設最後(最右邊)的提交是你的錯誤通過拉請求合併,它合併了這裏看到的藍線。 你最後承諾會前的一個上黑線,這裏以紅色標記:

enter image description here

重置爲這個承諾,你應該罰款。

這意味着,在您的本地工作副本做到這一點(確保以後你有沒有更多的未提交的東西,例如通過git的藏匿處):

git checkout master 
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef 
gitk 

現在確認您是真的在提交標誌着我那裏,你會看到它的血統中沒有任何東西。

git push -f origin master 

(如果你的github remote被命名爲origin - 否則更改名稱)。

現在一切都應該看起來正確的github上。提交仍然在您的存儲庫中,但任何分支都無法訪問,因此不應該在那裏造成任何傷害。 (當然,它們仍然會在RogerPaladin的存儲庫中)。

(可能存在Github特定的僅限於Web的方式,但我不太熟悉Github及其請求管理系統)

注意注意,如果其他人已經可能用錯誤的提交拉了你的主人,他們就會遇到和你現在一樣的問題,並且不能真正回饋。在重置爲新的主版本之前。

如果可能發生這種情況,或者您只是想避免任何問題,請使用git revert命令而不是git reset,以便使用新的提交來恢復更改,而不是將其更改爲舊的提交。 (有些人認爲你永遠不應該用已發佈的分支進行重置。)請參閱關於如何執行此操作的此問題的其他解答。

對於未來:

如果你想只有一些RogerPaladin的分公司提交的,可以考慮使用的cherry-pick代替merge。或與RogerPaladin溝通,將他們移動到單獨的分支併發送新的拉取請求。

+0

但是我們在合併和他的第一次提交之間有很多提交。所以就像我們有合併提交,我們自己的提交,然後是他的另一個提交。它似乎融入了他真正的老承諾。 – Will

+0

是的,它會合併到所有合併提交的祖先(並且已經不是您的提交的祖先)。這不應該妨礙你重置 - 如果你以後沒有重新綁定,那麼這些提交不會自行重新排序。 –

+0

嗯,我真的不太瞭解git,我使用tortoisegit,所以我不知道你是否可以用它做到這一點。當我嘗試重置到最後一次提交時,仍然有舊的提交。 – Will

25

若拉是他做那麼

git reset --hard HEAD~1 
+1

按照這條指示要小心,它實際上讓我回到2步,而不是一個。 – szeitlin

+0

@szeitlin這怎麼可能發生,它把你帶回了2個步驟,而不是一個?我知道這個評論是在4年前留下的,但我很好奇,如果有人知道答案會如何發生。這對我來說非常重要。謝謝。 – Haradzieniec

+0

我現在不記得了,但我猜如果我嘗試重置時做了新的提交,可能會發生這種情況。如果您擔心,我會用虛擬回購測試它。 – szeitlin

19

開始2014年6月24日,你可以嘗試輕鬆取消PR(請參閱 「Reverting a pull request」)與:

Introducing the Revert Button

,你可以很容易地通過點擊還原恢復在GitHub上拉請求:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

你會被提示創建一個還原變化的新的拉動請求:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

它仍然有待測試,但如果該r evert使用-m或不(也用於還原合併)

+0

我試過這個,它創建了一個新的分支,而不是撤銷主人的PR? – Tsar

+0

奇怪。你能否問一個新問題來說明這種行爲? – VonC

0

我一直都在使用這個地方,謝謝。

我正在尋找如何撤消拉請求,並在這裏。

我剛剛在git reset --hard「很久以前」和 做一個快速回到我之前做拉請求的地方。

除了看這裏,我也問我的同事他會做什麼, 他有一個典型的很好的答案:使用示例輸出 第一個答案以上:

git reset --hard 9271e6e 

與大多數Git中的東西,如果你這樣做並不容易, 你可能做錯了。

4

要撤消在整個你不想刪除提交一個github上拉的要求,你必須運行:

git reset --hard --merge <commit hash>

與提交哈希被提交前合併拉請求。這將從pull請求中移除所有提交而不影響歷史記錄中的任何提交。

一個很好的方法來發現這是去現在關閉拉請求,並發現這一領域:

Pull Request Image Pull Request Image

運行git reset後,運行:

git push origin --force <branch name>

這應該在拉取請求之前恢復分支,而不會影響分支中的任何提交進入commi t提取請求提交之間的歷史記錄。

編輯:

如果你點擊就拉請求恢復按鈕,這造成在樹枝上的額外承諾。它不會拒絕或取消合併。這意味着如果您要點擊回覆按鈕,則無法打開新的拉取請求來重新添加所有這些代碼。

+0

將事情理順的好方法,無需任何瘋狂的還原或櫻桃採摘 –

+0

謝謝!這正是我計劃要做的事情,但那大約會有大約200次提交櫻桃挑選。 – FluffySamurai