2017-06-19 64 views
0

假設我在我的存儲庫中有一個parent分支,並且我從中創建了另一個名爲derived的分支。git:重置之前提交的父分支

git checkout -b derived 

現在derived分支包含我parent分支的所有提交。我向我的derived分支添加了兩個更多的提交(提交D1和D2)。我的derived分支是兩個提交parent分支的提交。

現在我修改父分支中的一些以前的提交併添加新提交「Pn」。在此之後,由於某種原因,我想我的派生分支正是這個樣子

Amended commits from parent branch ---> Pn ---> D1 ----> D2 

我試圖git rebase parent從我derived分支,但它給了很多的合併衝突。是否有更簡單的方法來重置D1和D2之前的所有提交,就像parent分支一樣。

回答

1

不一樣。提交D1和D2依賴於他們面前的每一次提交,包括你不想要的提交。但是,這裏有事情,你可以嘗試:導出到新的父

  • git rebase --onto parent derived~3 derived

    再次基於。這會將合併基數顯式設置爲derived~3,即創建派生分支時父代的HEAD的提交。這將減少衝突,並避免重新引入舊的變化。

    通常情況下,git的數字了這一點自動,但由於你已經修改這些提交,Git不能告訴任何關係的存在,它們之間  —它不能告訴提交A'是提交A的修正變種。

  • 櫻桃採摘D1和D2到一個新的分支

    git branch derived-new parent 
    git checkout derived-new 
    git cherry-pick D1 D2 
    git branch -m derived derived-old # Save the old branch until you're ready to delete it 
    git branch -m derived-new derived 
    
  • 做衍生分支的互動底墊中,刪除您不想早提交,然後看看會發生什麼。這也可能會產生很多額外的衝突,並迫使你git rebase --abort,但如果它不,你是斯科特免費...只是重新基礎上新的父母,如上

0

你應該能夠遵循以下步驟:

  1. 查看您所在parent分支
    • git checkout parent
  2. 創建並檢查了新的分支基於關閉parent分支
    • git checkout -b derived-modified
  3. 使用git cherry-pickderived-modified簽出從derived移動新提交到derived-modified(這將使用你修改了提交修改後的父分支/加)
    • git cherry-pick 000aaaa
    • git cherry-pick 000bbbb
    • git cherry-pick 000cccc

這需要,例如,您對derived進行的3次提交併將它們移動到derived-modified,其中包含修改的parent分支。驗證完提交後,您可以刪除derived並將其重命名爲derived-modified

有關git cherry-pick的更多信息,請訪問here

1

想要使用git rebase,你只是希望它停止在你曾經與其他分支提交提交的點。

也就是說,你有:

...--Pl--Pm--Pn <-- parent 
       \ 
       D1--D2 <-- derived 

因爲這兩個修訂,並通過複製git rebase工作承諾,你現在所擁有的是:

  Pn'--Po--Pp <-- parent 
     /
---Pl--Pm--Pn <-- [email protected]{some-number} 
      \ 
       D1--D2 <-- derived 

在內存parent用於包含原始提交Pnparent的reflog中(可能在的reflog中)。

可以手動指定git rebase應使用在Pn停止:

git rebase --onto parent <hash-of-Pn> 

(即指定<upstream>作爲提交哈希停車點,並使用--onto,使之後的副本去parent的新提示)。您還可以使用與提交相關的語法(derived~number),如jpaugh's answer來標識Pn。有關詳細信息,請參閱the gitrevisions documentation

Git現在也有--fork-point。使用--fork-point,你可以讓Git 自動根遍歷parent的reflog來試圖找到Pn。在這裏,你可以運行:

git rebase --fork-point parent 

告訴Git的做到這一點生根-左右,而重訂到parent下降提交Pn

由於reflog條目過期(默認情況下爲30天或90天),究竟何時和是否--fork-point的工作有點棘手。