2017-03-21 134 views
1

我開始在branchB上工作。這是從branchA分支出來的。幾周後,主線分支開發了許多合併的提交。分支A和B都落後了。分支分支,如何在另一分支進行分配?

--d1--d2--d3 ...2 weeks later... --d253 develop 
     \ 
     a1--a2--a3       branchA 
        \ 
        b1--b2--b3    branchB (current) 

我想跟上開發分支。而且更願意在最新的提交d253中重建我的分支B.並且所有來自branchA的提交應忽略。這將避免我解決合併衝突的巨大努力(有很多)。因爲我不是那個分支的維護者。我可以在分支B中重新創建我需要的依賴關係。不知道是否應該在重新綁定之前或之後執行此操作。

--d1--d2--d3 ..... --d253 develop 
     \     \ 
     a1--a2--a3   \ 
          \ 
          b1'--b2'--b3' 

Q1。它是正確的做

git checkout develop 
git pull 
git checkout branchB 
git rebase --onto develop branchA 

Q2。讓我們假設衝突的數量是相當重要的,大約30個文件。與git merge develop相比,rebase仍然是一個好方法嗎?

回答

2

Q1 - 嗯,這是命令,你在圖片中顯示的是,是的。如果分支b與分支a正交,我想這很好。我會毫不猶豫地這樣做;是否有一個原因,你不想將兩個分支重新分配到當前的提交?

Q2 - 我還沒有注意到rebasemerge在衝突解決方面有很大的不同。最大的區別在於,您指定的特定底牌不包含a變更;這意味着如果a更改與d更改衝突,則不必處理該更改。 (如果b變化重疊的a變化,我不認爲這會被注意到的衝突本身,但它很可能導致代碼在一個破碎的狀態。)

真正的問題是,有b提交與其他開發者共享?如果是這樣,那麼通常不推薦重新使用它們,因爲這會給其他開發人員帶來問題。

+0

branchB尚未與其他開發者共享。你能解釋一下「如果分支b與分支a正交」的含義嗎?至於「一個原因,我不想將兩個分支重新分配到當前的提交?」這是B/C我不保持branchA。事實證明,這是一個緩慢移動的分支,它將被合併到主線的那一天遠非如此。我的分支B更加活躍,我需要從A中獲得的少量依賴可以從A中挑選出來,或者我甚至可以重新創建一些存根來讓我的代碼工作,同時等待branchA在未來合併。希望這是rebase的一個很好的理由。 – Polymerase

+0

'rebase' vs'merge'當'rebase'正在追趕長連鎖提交時,我注意到了一個區別。當rebase在目標分支的歷史記錄上重播這個文件時,文件可能有5個衝突。並要求衝突解決5次。通過合併,有一個最終合併衝突步驟,其中所有文件都顯示在一個屏幕中(我使用IntelliJ)。每個衝突的文件只需要解決一次。這樣說,這並不意味着「合併」更好。我非常喜歡將我的更改放在目標頂部而不是合併提交。只是想更好地瞭解最佳做法。 – Polymerase

+0

「正交」我的意思是如果你的改變可能是獨立於'a'的基礎開發線,反之亦然。而從你所說的情況來看並非如此。如果你決定繼續(例如通過從'a'中挑選你需要的東西),它可能會導致更多的合併衝突;所以你必須決定這是否值得。 –

1

爲了變基branchB上只有B發送的提交發展,就必須有3個參數使用rebase --onto

git checkout branchB 
git rebase --onto develop branchA branchB 

謝謝Git Tip of the Week: Rebasing Revisited節「衍合到」舉個例子,類似於情景在這個問題中描述。

也在git-rebase documentation。爲方便起見,轉載此處:

首先讓我們假設您的主題基於分支。例如,主題中開發的功能取決於接下來的某些功能。

o---o---o---o---o     master 
    \ 
     o---o---o---o---o   next 
         \ 
         o---o---o topic 

我們想讓分支主人分出主題;例如,因爲主題所依賴的功能被合併到更穩定的主分支中。我們希望我們的樹看起來像這樣:

o---o---o---o---o    master 
    |   \ 
    |    o'--o'--o' topic 
    \ 
     o---o---o---o---o  next 

我們可以使用下面的命令得到:

git rebase --onto master next topic 
+0

您建議的'rebase'命令中的最後一個參數是不需要的;它只是說「在開始之前檢查」branchB'「,並且您已經在該命令之前加上了顯式的」checkout「branchB –

+0

@MarkAdelsberger謝謝,第三個參數的默認值是令人困惑的。第三個參數是什麼時候意味着「在第三個參數中檢出分支」以及它何時意味着「直到當前分支中的這個提交」?如[我無法理解git rebase --onto]的行爲所示(http://stackoverflow.com/questions/29914052/i-cant-understand-the-behaviour-of-git-rebase-onto#29916361 )來自Enrico Campidoglio的回答,部分「外科醫生:git rebase - 帶3個參數」 – Polymerase

+1

呃?那麼,我想這是一個解釋的問題,但要理解的是,第三個參數是一個提交標識符(不一定是分支),它**總是**意味着「檢查第三個參數」。如果第三個參數是'HEAD ^^'(或者對分支提交而不是在分支提示的其他引用),那麼這會產生「提交到此提交」的效果,但它仍然通過檢出完成它承諾開始rebase(如果你先檢查提交,它仍然不需要;它只是語法糖)。 –