2014-02-13 144 views
0

我已發送一個PR並將其合併到存儲庫。假設PR號。是127和PR包含如下的提交,以便(最近第一)如何恢復git中的許多提交以恢復到特定狀態

hdyw6
cnsfg

然後我把另一PR沒有。 128有如下的提交它

6dwiu
sbyww

(假設世界上只有一個公關沒有提交。126點即提交jdus7

現在,我意識到有些不對勁得到了承諾,現在我想帶回在PR 127之前的版本庫。這意味着我想保持承諾,直到jdus7(即在公關編號126)

那麼該怎麼做呢?

我是否必須一個接一個地回覆提交(從最近開始),像這樣?

git revert sbyww
git revert 6dwiu
git revert cnsfg
git revert hdyw6

現在終於所有的壞提交都不見了?請糾正我,如果這不是它會工作或更好的方式來做到這一點?

還是有一些地方,而不是還原一個個我剛纔說git reset back till jdus7

+0

看看這個:http://stackoverflow.com/questions/3639115/reverting-to-a-specific-commit-based-on-commit-id-with-git –

回答

0

git reset --hard jdus7

git revert用於另一件事(引入新的提交恢復以前的變化提交)。

+0

之後,如果我發送PR那麼它會要求我重新設計並且會失敗,不是嗎? – JVK

+0

是的。如果你擁有其他倉庫,那麼你可以用git push -f來強制你想要的任何東西。儘管更改已發佈的分支機構是不好的做法,因爲它會使每個人都依賴於必須進行重新分配。如果你不擁有其他存儲庫,那麼你無法及時回去。已發佈已發佈。然後您就可以使用git revert方法。或者更好,只需添加一個新的提交修正錯誤的代碼。 – elmart

0

如果你只是想徹底清除出來的東西就是當前分支,那麼你可能想

git reset --hard jdus7 

這將使指定jdus7 ID新HEAD。命令git revert(正如你所看到的)將在你正在返回的提交之上創建一個新的提交字符串。這可能會造成醜陋的歷史,併爲未來的承諾留下潛在的地雷。

如果您恢復提交,那麼將不會更改該提交的任何更改。因此,如果您恢復提交123456,然後再運行git merge 123456它實際上不會合並任何內容。這可能很令人困惑。爲了引入更改,您必須找到由git revert 123456產生的恢復提交,然後恢復提交

但是請注意,如果您使用git reset --hard那麼刪除的提交不再可從當前分支訪問。當使用git revert時,他們仍然會在那裏,以及恢復提交。

0

如果分支僅是局部的,你可以做git reset --hard jdus7

但是,如果提交已經被推到遠程分支這樣只會移動您當地回,而不是實際刪除提交(除非你做一個git push -f但如果你是使用遠程因爲它會搞亂人們的歷史)的唯一的人,你只能這樣做

您可以創建一個「多提交復歸」使用下面的命令:

git diff HEAD..jdus7 --name-only | xargs git checkout jdus7 -- 

這將獲得已更改的文件,並從您想要的狀態中檢出它們。然後,您可以提交這些更改,並將所有內容都還原爲所需的提交。