2016-05-14 131 views
3

我試圖將功能分支(從主分支)分叉到另一個分支的特定提交上。 我最初的狀態是以下將功能分支重新映射到另一個分支的特定提交

 C -- D   branch1 
    / 
A -- B -- E -- F   master 
       \ 
         branch2 (zero commits after creating the branch) 

我第一次重建基礎BRANCH2到一個在主站,它工作得很好。應(根據我的理解),我現在的狀態是以下

 C -- D    branch1 
    /
A -- B -- E -- F   master 
\ 
    B -- E -- F    branch2 

我覈實,BRANCH2分支主在提交A和甚至與主分支。我現在想就是這個

A -- B -- E -- F   master 
\ 
    B -- E -- F    branch2 
    \ 
    C -- D    branch1 

我試圖

git checkout branch1 
git rebase --onto B branch2 

,但是這導致了一大堆矛盾,我不所有這些是如何產生的理解。也許我完全誤解了rebase的作用?

注意:在成功將branch1重新綁定到branch2的B之後,我打算將master重置爲A,因此最終版本應該看起來如下所示。

A     master 
\ 
    B -- E -- F  branch2 
    \ 
    C -- D   branch1 
+3

爲什麼不把'master'重置爲'A'?你想達到什麼目的? – PetSerAl

+0

如果我只是重置'master',那麼'branch1'會發生什麼?我試圖用'branch2'建立一個staging/development分支..並將'master'重置爲當前應該部署的版本。 – denise

+1

在Git分支中,只是一個提交的指針。所以,當你移動指針'master'時,指針'branch1'仍然會指向與之前一樣的提交。 – PetSerAl

回答

3

您的假設存在一些問題。首先,分支只是指向提交的指針。您從此開始,並且簽出master

 C -- D  branch1 
    / 
A -- B -- E -- F master 

之後git branch branch2你有這個。

 C -- D  branch1 
    / 
A -- B -- E -- F master & branch2 

注意沒有存根分支,masterbranch2兩個點F.除了他們的名字,他們是無法區分的。

一旦您結帳branch2git rebase A沒有什麼變化。 branch2已在其祖先A,它仍然指向F。您應該收到類似Current branch branch2 is up to date的消息。

當你做了git checkout branch1git rebase --onto B branch2這個迷茫的事情。假設有第三個參數,即當前檢出的分支。你實際上跑的是git rebase --onto B branch2 branch1。這就是說「採取分支1而不是分支2(與git log branch2..branch1或C和D相同)可達的提交併將它們放到B」上。這應該是一個沒有操作,但如果branch1和branch2有共同的變化,rebase會拋出它們。

如果C和E做出了相同的更改,那麼您可能會因此而發生衝突。

 C -- D  original branch1 
    / 
A -- B -- E -- F master & branch2 
     \ 
     D1 branch1 

這沒有什麼意義,但是當你試圖在兩個表兄弟之間進行重組時,會發生這種情況。

另請注意,重定位分支的ID爲D1,而不是D.提交ID包含其父母的ID,因此ID必須更改。 rebase不會重寫歷史記錄,它會創建新的歷史記錄,並告訴您它始終是如此。一個微妙而重要的區別。你原來的提交仍然存在......一段時間。


如果你想從這個去:

 C -- D  branch1 
    / 
A -- B -- E -- F master & branch2 

了這一點。

A     master 
\ 
    B -- E -- F  branch2 
    \ 
    C -- D   branch1 

這可以翻轉,因此它與你有更好的。

 C -- D  branch1 
    / 
    B -- E -- F branch2 
    /
    A    master 

所有你需要做的是移動master到A.有幾種方法可以做到這一點,一個是git branch -f master A。這迫使master移至A

相關問題