2012-04-27 27 views
4

我正在研究一個有master分支的git倉庫,我們將其稱爲ab分支。我的團隊正在致力於ab分支機構,並使用github提供了拉請求工作流程。我的一個隊友向他的分支jeremy_ab_deletions提出了要求,要求ab分支。我正在檢查/測試他的更改,但是當我將它們合併到ab分支中時,我意外地將它們合併到了master中,並在我發現錯誤之前將master推送到了github。想我可以只是混合恢復我做的變化git revert SHA,它似乎工作...搞砸了主git分支......無法弄清楚我需要恢復

我認爲這已經足夠,我高興地切換回我的AB分支,並繼續工作。然而,現在我意識到前面提交的ab分支應該是從來沒有落在主人,都在掌握之中。這是......非常混亂。由於他的分支最初是從ab分裂出來的,然後我將它合併成了主人,所以我應該使用git revert -m 1 SHA將它歸還。

今天我想弄清楚我究竟在哪裏出了問題,而且我根據git歷史和我的引用日誌來了解各種困惑。首先,我試圖恢復的就返回,然後做git revert -m 1 SHA但是git的告訴我:

fatal: Mainline was specified but commit 4c431c345dfe0a856967c090932c32f153824085 is not a merge. 

所以我覺得OK了...也許這不是合併提交,我需要針對不同的SHA。但看歷史我不能爲我的生活出其中哪一個是合併提交...

This was supposed to be on AB... 
… 
d985b5bcf8 Browse code 
Nathan B authored 8 days ago 

This was supposed to be on AB... 
… 
0e01911273 Browse code 
Nathan B authored 8 days ago 

removed unecessary tests 
4c431c345d Browse code 
Nathan B authored 8 days ago 
Apr 17, 2012 

removing un-used views and pages 
a546f90ed3 Browse code 
jeremychurch authored 10 days ago 

是說「這應該是對AB」的兩次提交是恢復提交以恢復「已刪除的不必要的測試」和「刪除未使用的視圖和頁面」提交。下一次承諾是在今天,而在此之前的承諾是在16日,這兩者都沒有關係。我沒有看到實際的合併發生在哪裏。

我經歷了我的reflog,看看到底發生了什麼事。我使用git reset --hard [email protected]{NUM}去上下了reflog版本,然後檢查關鍵文件,看看那個地方是否有不好的變化。最後,我把範圍縮小到這些reflogs:

1fe2be2 [email protected]{79}: checkout: moving from 1fe2be29c6eda9f9fc9eb0b372ee83b7c15dfc2c to jeremy_ab_deletions 
1fe2be2 [email protected]{80}: [email protected]{3}: updating HEAD 
4c431c3 [email protected]{81}: [email protected]{1}: updating HEAD 
47a97af [email protected]{82}: commit: removed unecessary tests, routes, and controller actions 
4c431c3 [email protected]{83}: merge jeremy_ab_deletions: Fast-forward 
1fe2be2 [email protected]{84}: checkout: moving from master to ab 
d985b5b [email protected]{85}: revert: This was supposed to be on AB... 
0e01911 [email protected]{86}: revert: This was supposed to be on AB... 
4c431c3 [email protected]{87}: merge jeremy_ab_deletions: Fast-forward 
c121a08 [email protected]{88}: checkout: moving from jeremy_ab_deletions to master 
4c431c3 [email protected]{89}: commit: removed unecessary tests 
a546f90 [email protected]{90}: checkout: moving from ab_page_changes to jeremy_ab_deletions 
511b340 [email protected]{91}: checkout: moving from jeremy_ab_deletions to ab_page_changes 
a546f90 [email protected]{92}: pull [email protected]:REDACTED/repo.git ab-remove-stuff: Fast-forward 

具體HEAD @ {} 88這裏沒有壞的提交,HEAD @ {} 87呢。因此,我認爲我搞砸了merge jeremy_ab_deletions: Fast-forward提交是合理的......但我無法弄清楚那會是「合併提交」。我試過這個:

$ git revert -m 1 4c431c3 
fatal: Mainline was specified but commit 4c431c345dfe0a856967c090932c32f153824085 is not a merge. 

我...找不到實際的合併提交它似乎?有沒有人知道我做錯了什麼:/我現在都失去了。

回答

4

如果沒有其他人已經退出此主(或拉,但對於某些尚未使用過它),這是我會做什麼:

  1. 如果沒有工作的主因爲「意外」完成,我只是重置它到最後一個好的提交,然後更新遠程主分支(通過用-f推)。
  2. 如果已完成一些工作,可以將其重置爲最後的良好提交,然後使用git rebase -i並刪除有問題的提交,並將好的提交留在列表中。然後,您需要再次推送(使用-f)。

或者,您也可以做到這一切在一個新的分支:

  1. 結賬的最後一個良好的主犯,創建一個分支出現,
  2. 然後使用git rebase -i master過濾掉壞的提交。
  3. 然後你就可以回去掌握和手動「合併」,海納百川的新分支的變化,和覆蓋在主的一切(你可以使用--no-commitgit checkout --theirs
  4. 推(-f)的固定的主人。

希望這會有所幫助!我討厭合併

+0

如果有人*拉壞了壞主人,會有什麼影響?我可以在那裏做第一步(完全消除這種情況的歷史),然後他們可以拉和接收正確的主人?或者當上遊沒有意識到變化時,git會感到困惑? – nzifnab 2012-04-27 19:07:50

+0

如果有其他人拉掉了不好的「主人」分支,他們將不得不經歷基本相同的步驟。如果他們自那時以來沒有對*他們的*副本進行任何更改,他們可以通過'取出固定主副本並更新他們的參考文獻來將其短路。很容易明白爲什麼如果你只記得每個克隆開始*就像*克隆它的「原始」:所以如果你必須在「原始」上執行步驟1,2,3,那麼你還必須在克隆上執行步驟1,2,3。 – torek 2012-04-27 19:29:36

+0

要去第一步,並確保拉着主人的另一個人也得到了固定。哈哈,這會教我合併和隨意推! – nzifnab 2012-04-27 19:51:41

1

更新:雖然這可能會幫助別人,但這實際上讓我感到更加沮喪。我會保留這裏以防其他人絆倒它。

sinelaw我指出了正確的方向......但我發現一個更合適的答案在這裏:Revert to a commit by a SHA hash in Git?

答案的消息爲:

如果您要提交在當前頭頂與確切的狀態 在不同的提交,撤消所有的中間提交,那麼你可以使用重置創建索引的正確狀態,使 提交。

這正是我想要的。我想恢復到HEAD @ {88},但是讓它恢復它自己的提交,因爲有些人已經拉到了master分支,我不想讓他們像我必須經過重置步驟...所以這些是我使用的命令:

# reset the index to the desired tree 
git reset [email protected]{88} 

# move the branch pointer back to the previous HEAD 
git reset --soft [email protected]{1} 

git commit -m "Revert the bad ab merge" 

# Update working copy to reflect the new commit 
git reset --hard 

# Clean untracked files 
git clean -f -d 

縱觀歷史,我可以看到,我只是創建了所有這一切應該已經排至AB分支變化的精確逆轉提交。

(更新):沒關係,這不是我想要的。我們的回購有幾個分支,以及'主'分支。主人打算進行其他3個分支中普遍的變化,並且經常合併到這些分支中。這樣做會導致一系列命令的回覆,從而導致master到'ab'分支(或任何分支)合併衝突和無意刪除文件的嚴重噩夢(因爲他們應該應該活動在ab中,只是不在主)。我上面提到了sinelaw的解決方案,並與一位非技術設計師一起工作,這個設計師已經把主人帶回了好的版本。

+0

如果你已經完成了一個單獨的分支(我描述的「替代」),那麼其他人只需要再次拉主人而無需任何特殊工作。我錯了嗎? – sinelaw 2012-04-27 19:57:32

+0

這涉及通過交互式rebase來確定哪些提交保留以及哪些提交應該是'ab'獨佔的。在'ab'上有很多提交,我不一定要過濾......最後在他的機器上,我們做了'git branch -D master''git fetch upstream''git checkout -b master upstream/master',這使他的主設備與上游的正確主設備聯機。似乎已經工作。 – nzifnab 2012-04-27 20:14:27