2011-08-12 93 views
5

我對標題不滿意,但我認爲我的解釋過於複雜,最終與上面一樣簡單。從存儲庫中刪除不正確的合併

我們正在使用具有中心起源回購的「分支」模型,這是一個「開發」分支,其分支關閉了功能分支。

我已經制定了本地組更改過的開發分支,是這樣的:

develop (A)- (D1) - (D2) 
     \ - (F1) - (F2) - (F3) - (F4) 

在這一點上,我在我的混帳GUI溜起來,而不是推着我的特性分支作爲遠程分支起源,我以某種方式將它推回原點/發展。所以,我們現在有:

develop (A)- (D1) - (D2) -  -  (M1) 
     \ - (F1) - (F2) - (F3) - (F4)/

我們不想要的只是。由於在這個特定的日子裏只有我自己和另外一個開發人員,我登錄了原始主機,並將開發頭控制回D2提交,並將我的功能分支返回到F4。我問我的同事在我做完這件事之前不要拉扯,因此認爲一切都很好。

(實際上我克隆了原點回購,使得頭部在本地變化,然後強行將它們推回上游,實際上我並不記得確切的命令,但結果是根據需要回購,儘可能我能看見)。

我忘記了我們的持續集成系統正在進行常規拉動並設法獲得合併頭的副本。一個星期後,我注意到原始主機上的巡航控制提交了一些提交,並且感覺不好。果然,它正在將原產地開發部門合併到當地的「特色部門合併」回購中。

所以我們現在的情況有點像這樣:

Cruisecontrol可以回購:

 (from origin/develop)   (C1) - (C2) - (C3) 
develop (A)- (D1) - (D2) -  -  (M1) \ (M2) \ (M3) 
     \ - (F1) - (F2) - (F3) - (F4)/

產地回購:

develop (A)- (D1) - (D2) - (C1) - (C2) - (C3) 
     \ - (F1) - (F2) - (F3) - (F4) 

其中C1和C2的提交製成的原點回購由我們開發者誰擁有「糾正」回購(即我的頭部操縱以消除我最初的錯誤),M2和M3是巡航控制回購現在不得不作出的合併承諾。

現在我做了一件真的是笨。我在巡航控制源回購中「推」了一下。所以我們的「原產地」回購現在有M1合併和介入的M2和M3合併。

我再次讓我的同事不要拉一會兒。但是,我的git-foo不夠強大,以致於在原始回購中彼此交錯的Mx和Cx提交,並將其恢復到原來的狀態。

認爲我需要做一些聰明的HEAD ^(x)和HEAD〜(y),但這是一個困難的情況來解釋簡潔,因此很難谷歌。

歡迎任何建議;我有一個夜間備份的repo運行,並且可能只是從那裏恢復,並且每個人都從今天開始重新提交他們的提交,但是我想知道這種類型的分支是否可以完全解除綁定。

我想我應該能夠像上面原點圖一樣得到原始回購,並且巡航控制回購已被刪除並重新克隆,並且M系列提交準備好在原始回購中被垃圾回收。

謝謝!

+0

難道你不能暫停配置項,克隆配置項回購,將其重置爲良好狀態並強制推回?像你對原產地所做的一樣? – VonC

+0

當你沒有M1時,你們是怎麼製造C1和C2的? – Andy

+0

如果你會顯示你想要的最終狀態,這將有所幫助,因爲我不確定你想要在哪裏結束。 –

回答

2

在Git中所有提交相同的哈希是相同的(所以是有歷史),所以你應該能夠使用兩個你出身相同的命令和你的CI存儲庫(因爲develop被檢查出:

# on the current branch: 
git reset --hard C3 
# on your feature branch: 
git branch -f feature F4 

git push不應強行推動在默認情況下,你沒有說明在你的問題在CI -> origin推事,所以我假定這是一個快速向前推(默認)

爲未來我建議您的CI知識庫做一個git fetch + git reset --hard origin/develp,除非你想要你的分支合併在一起(可能只提交CI回購中存在的提交)

+0

這個伎倆。我花了一些時間看着gitg輸出來「看」它,但因爲它只是M系列提交有多個父母(例如M(n-1)和Cn),所以將頭重置爲C3根據需要提供歷史記錄。 我覺得我的解釋可能有點過於複雜...... 謝謝大家。 –