2010-10-22 35 views
53

我和其他一位開發人員合併並將我們的工作推向一個稱爲工具的非主分支。這樣,我們並沒有影響到其他團隊。我的主題分支叫做DPM-93,我的git工作流程就是這樣。Git陷入錯誤的分支

# do some work 
git checkout DPM-93 
git commit -m "did some work" 

# catch up 
git checkout toolwork 
git pull origin toolwork 

# rebase my topic branch 
git checkout DPM-93 
git rebase toolwork 

# merge and push my changes 
git checkout toolwork 
git merge --no-ff DPM-93 
git push origin toolwork 

這大部分是工作的罰款,直到我無意中發出這些Git命令

git checkout toolwork 
git pull origin master 

在這一點上,一堆新的東西分支toolwork出現了,我不知道如何擺脫它沒有刪除我的工作區,並從回購重新克隆。

有沒有什麼辦法可以把它拉回到拉之前的狀態?

回答

85
git reset --hard ORIG_HEAD 

git reset man page(如果你只是做了拉):

撤消合併或拉

$ git pull       (1) 
Auto-merging nitfol 
CONFLICT (content): Merge conflict in nitfol 
Automatic merge failed; fix conflicts and then commit the result. 
$ git reset --hard     (2) 
$ git pull . topic/branch   (3) 
Updating from 41223... to 13134... 
Fast-forward 
$ git reset --hard ORIG_HEAD  (4) 
  1. 嘗試從上游更新導致了很多衝突;你現在還沒有準備好花很多時間合併,所以你稍後決定這麼做。
  2. pull」沒有進行合併提交,所以作爲「git reset --hard HEAD」的同義詞的「git reset --hard」清除了索引文件和工作樹的混亂。
  3. 將主題分支合併到當前分支中,導致快進。
  4. 但是你決定主題分支尚未準備好供公衆使用。
    「拉」或「合併」總是將當前分支的原始尖端留在ORIG_HEAD,因此難以重置會使索引文件和工作樹返回到該狀態,並將分支的尖端重置爲承諾。

有關更多信息,請參見HEAD and ORIG_HEAD

+0

假設還沒有人從主服務器拉出來,使用'git rebase -i ORIG_HEAD'來刪除不需要的提交可以嗎? – unutbu 2010-10-22 17:28:30

+0

@unutbu:我相信在這種情況下,這種rebase的最終結果將類似於'git reset'。 – VonC 2010-10-22 18:42:06

+0

謝謝,@VonC。對不起,這個愚蠢的問題。不知何故,我沒有意識到'git reset --hard'不僅會改變工作樹和索引,還會移除DAG中的父指針。 – unutbu 2010-10-22 20:34:57

9

您可以使用git log找到SHA-1,你想在你toolwork分支的頭部修訂的,然後使用git reset --hard <SHA1>到你的工作副本恢復到那個版本。

把所有東西都放回去!然後重新閱讀git reset的手冊頁,以確保它正在做你想做的事。

編輯:哦,是的,ORIG_HEAD應該包含正確的SHA-1。但先檢查。

+0

起初沒有看到你回答。 'git reset'是正確的(即使你正確地提到有點危險)。 +1 – VonC 2010-10-22 16:37:04

+0

首選此答案,因爲您更清楚要恢復哪個提交。在我的情況下,這是很有用的,因爲我有一些本地提交之前,我不小心拉錯了分支,所以我不想做一個硬重置到ORIG_HEAD。 – 2012-04-08 18:41:14

49

重置主分支:

git reset --hard origin/master 
+6

不知道這是因爲「正確」的答案是2歲,但在嘗試其他建議沒有運氣後,這是對我有用。 – 2012-06-27 23:07:42

+3

這是唯一對我有用的答案。 – lashleigh 2012-12-27 18:14:14

+3

這解決了我所遇到的問題,那就是我拉錯了分支 – HorseloverFat 2013-12-04 10:26:10

3

我最近做了類似的事情,並且使用了基於this answer一個簡單的解決方案。

假設要恢復到toolwork分支的狀態已經被推origin,你可以簡單地做

git fetch origin 
git reset --hard origin/toolwork 

在我的情況下,ORIG_HEAD值被重寫由另一合併在不同的分支上,這樣做,我不必擔心在日誌中搜索正確的提交。