2017-04-13 60 views
1

我有我的主分支master和分支originalCode。在originalCode分公司的母公司爲master如何在第一次提交git中的master分支之前移動後來創建的分支?

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

現在我想將我的originalCode分支提交F提交A之前。 我已經嘗試過重新綁定和合並,但是我無法使它工作,並且我無法找到關於此的類似問題。

目標是有一個共同的歷史,以確切地看到從原始代碼(一些腳本)已經做了什麼變化。當我開始簽入時,我已經開始使用外部修改版本。

+1

這是有點不清楚 - 你已經有一個共同的歷史! –

+0

OriginalCode分支包含未修改的原始代碼,這是我在第一次簽入時沒有的。我後來才意識到,當我開始將其添加到回購時,我已經有了一個修改版本。分支中的代碼應該是第一次提交。 –

+1

你應該明白在Git中,分支是對* single commitits的引用,所以在你的情況下'originalCode'是'F'的另一個名字,'master'是'E'的另一個名字。這張圖應該繪製得有點不同,要準確,我會告訴你如何。 – mkrieger1

回答

3

這是我會怎麼做:

  1. 創建並切換到一個新的分支reordered,稍後將包含重新排序提交,指向同一個commit(F)爲originalCode

    $ git checkout -b reordered originalCode 
    

    的承諾圖形現在看起來是這樣的:

        F originalCode, reordered 
           /
    A - B - C - D - E master 
    

    這使masteroriginalCode保持不變。如果出現問題,您可以簡單地刪除reordered並重新開始。

  2. 交互變基reorderedA之前定位F

    由於A是根犯,你需要指定--root選項。

    $ git rebase -i --root reordered 
    

    這將打開一個包含這樣的文本編輯器:

    pick d14a5dd A 
    pick 57b6bd9 B 
    pick de4e672 C 
    pick 6fc8c1f D 
    pick 453da48 E 
    pick d2443c0 F 
    

    剪線與F並粘貼與A線之上。然後保存並退出編輯器繼續。

    根據提交的實際內容,您可能需要在重新綁定期間解決合併衝突。

  3. 一旦變基完成後,提交圖形應該是這樣的:

        F originalCode 
           /
    A - B - C - D - E master 
    
    F'- A'- B'- C'- D'- E' reordered 
    

    注意,有兩個系列都沒有共同的祖先,因爲--root底墊的提交。

  4. 請再次確認reorderedmaster之間的內容沒有差異。

    $ git diff reordered master 
    

    這應該不會產生輸出。

    編輯:我懷疑你想要的master內容爲「最新」版本中,originalCode沒有的內容,所以我相應地改變了diff。)

    如果是有區別的,你可能在解決合併衝突時做了錯誤的事情。

    您還可以使用圖形存儲庫瀏覽器(如gitk)檢查單個提交。

  5. 一旦你滿意的reordered分支的狀態,你可以刪除originalCodemaster,然後重命名reorderedmaster,或者你可以移動master指向同一個commit(E')作爲reordered和刪除originalCodereordered分支。

    $ git checkout -B master reordered 
    $ git branch -D reordered originalCode 
    

    最終的結果應該是這樣的一個承諾圖表:

    F'- A'- B'- C'- D'- E' master 
    

爲了解決一些評論者提出的問題:

如果還有其他人誰已經克隆了存儲庫並依賴於master分支,則不應刪除或移動它,如上面第5步所示。

相反(在步驟4)我提議新reordered分支合併爲master,提供一種替代的歷史導致了目前的狀態,但保持原有的歷史以及:

$ git checkout master 
$ git merge reordered 
$ git branch -d reordered 

結果:

A - B - C - D - E - G master 
        /
F'- A'- B'- C'- D'- E' 
+0

謝謝,在我刪除了其他分支之後,我的歷史就像我想要的那樣。 –

0

你做到以下幾點:

創建一個新的根提交包含原始代碼庫:

git checkout originalCode 
git checkout --orphan originalCode2 
git commit -m "Original code of project foo" 

現在我們要移植導致master這個新的根頂部的歷史。爲此,我們嫁接的originalCode2頂部提交A

echo $(git rev-parse A originalCode2) >> .git/info/grafts 

然後改寫歷史,使新parentship永久:

git filter-branch master 

現在你有打算的歷史。請注意,此重寫了歷史記錄以及有關已發佈的重寫歷史記錄的所有注意事項。

最後,你應該刪除最後一行.git/info/grafts(寫在上面的步驟)。這很可能是唯一的一行,那麼你可以刪除.git/info/grafts

也許可以使用git rebase --root originalCode2 master或一些涉及--root而不是filter-branch的變體,但是我對這個變體變體沒有經驗。

相關問題