2011-01-19 103 views
12

在合併我的變化對上游的主,我經常發現自己做了以下內容:覆蓋和推進一個Git分支

git checkout somefeature 
git checkout -b integration 
git rebase master # resolving conflicts along the way 
git checkout somefeature 
git merge integration # or rebase, doesn't matter in this example 

我通常會發現,併購整合分支回我的特性分支做失敗到一些衝突。我的第一個問題是,「如果我的整合分支是某些特徵的後代,並且我已經解決了與上游主方的衝突,爲什麼會發生這種情況?」

如果您想知道爲什麼我要使用集成分支開始,那是爲了防止我的當前分支出現半失敗合併。

我目前的解決方法是這樣:

git checkout integration 
git branch -f somefeature # overwrite the branch 

現在的問題是,我不能把我變回遠程分支:

git push origin somefeature 
! [rejected]  somefeature -> somefeature (non-fast forward) 

所以現在我不得不刪除遠程分支並重新推送我的更改。這不是實現此目的的最佳方式,所以我想知道:「覆蓋分支並將更改推送到遠程分支的最佳方法是什麼?」

回答

15

的問題引起的。如果你只是合併而不是rebase,那麼這將工作,因爲合併提交下降從somefeature分支。

就推送到遠程分支而言,您只需使用--force即可使推送成功,但這會爲其他任何擁有其副本的人造成問題。

+3

請注意,儘管您不應該更改已發佈的提交,但與您一起工作的其他人也會遇到同樣的問題,因爲他們已經在其存儲庫中複製了不兼容的提交。只要它是本地的,重新啓動就沒問題,但重新提交併重新發布它們是邪惡的 - 因此Git會拒絕* *錯誤(這很聰明,並且指出您可能做錯了事情)。 – poke 2011-01-19 21:48:54

0

你的第一點操作很奇怪。你製作一些特色的副本。你重新對抗主人。然後你回到那個特徵,並將其與自身的重新設置的等價物合併。這不是做事情的方式。

不要過於複雜的事情。如果你想讓功能分支在其他地方啓動(比如最新的主控),只需要重新綁定它。

然後用--force(或-f)推它。告訴任何使用該功能分支的人,他們必須獲取更改並調整他們本地尚未推送的任何內容。

在其他人一直在努力的情況下,合併更好。

希望這會有所幫助。因爲git rebase產生了一系列新的未從somefeature分支下降,那麼當你嘗試,並將它們合併到somefeature解決衝突的底墊期間完成不適提交的

+1

嗯,是的印象,使somefeature的副本,然後合併,對主人將合併兩個分支無需擺弄無論是原件的簡單方法下。我想最好是做一個標準的rebase。謝謝。 – tmountain 2011-01-19 21:44:17

+0

您可以改爲合併它。你試圖做到這一點。這是問題。如果你想合併掌握或重新掌握,這取決於你。一個產生線性歷史,另一個保留你分支的點。你的選擇。如果您除了「移動某人的奶酪」之外還有潛在的轉售路線,您將有可能解決更多衝突。 – 2011-01-19 21:48:48

4

您可以使用git merge -s recursive -Xtheirs,這將自動解決集成分支的衝突。但是,這仍然會進行合併,並且可能無法適用於移動文件等。

但是,由於您的分支被推送,您有理由希望保持其歷史。爲了獲得您想要的理想行爲,您可以在集成分支中使用「我們的」策略。

git checkout somefeature 
git checkout -b integration 
git rebase master # resolving conflicts along the way 
git merge -s ours somefeature # mark integration as superseding the somefeature branch 
git checkout somefeature 
git merge integration # this is now a fast-forward, no conflicts