簡體   English   中英

如何在Git中線性化“分裂”合並歷史?

[英]How to linearize “splintered” merging history in Git?

它必須非常明顯,但我發現無法做到這一點。 每個手冊都將變基描述為現有分支或簡單交互式變基的頂部,這就是全部。 假設,我有一個類似鑽石形狀的git歷史:

*   949430f Merge commit (D) (HEAD, mybranch)
|\  
| * e6a2e8b (C)
* | 3e653ff (B)
|/  
*   9c3641f Base commit (A)

我希望像以下一樣保持歷史:

*   949430f Combined commit (BCD)
|  
*   9c3641f Base commit (A)

提交B和C可能會被融化或丟棄,無所謂,我只想保留結果。 此外,我不想因為令人討厭的恐慌解決而還原提交。

這里我試過的事情:

1)我不能通過簡單壓扁B和C來避免這種情況

git rebase -i HEAD~2
...
p 3e653ff (B)
f e6a2e8b (C)
...
Could not apply a91f3a4

嗯,這有點可以理解,有一些沖突。

2)我無法通過壓扁來解決這個問題。

git rebase -i -p HEAD~3
...
pick 9c3641f Base commit (A)
f 3e653ff (B)
f e6a2e8b (C)
pick 949430f Merge commit (D)
...
error: unable to match a91f3a4...

3)我甚至不能丟棄B和C.

git rebase -i -p -m HEAD~3
...
pick 9c3641f Base commit (A)
#pick 3e653ff (B)
#pick e6a2e8b (C)
pick 949430f Merge commit (D)
...
error: Commit 949430f is merged but option -m is not set.
fatal: cherry-pick failed
Could not pick 4f3e6231b5cecf57434613ca3afd2a21ba375eb9

為什么? 這是選項“-m”......

有誰知道如何解決這個問題?

你想要的是git reset --soft (加上aragaer提到的提交 )。 盡管問題的情況不同,請參閱VonC的回答

我首先嘗試線性化提交圖,然后將它們壓縮在一起:

$ git checkout commitA -b newbranch
$ git cherry-pick commitB
$ git cherry-pick commitC
[resolve any conflicts]
$ git rebase -i commitA
[change the command for commitC to 'squash']
git rebase -i 9c3641f^ # 1 before base commit

然后在交互式編輯器中

pick 9c3641f Base commit (A)
pick 3e653ff (B)
fixup e6a2e8b (C)
fixup 949430f Merge commit (D) (HEAD, mybranch)

我實際上期望最后一個不存在,因為在我的經驗中,在交互式rebase期間合並提交會消失。

這會將B和C壓縮成一個提交。 D會消失,你不會真的想要它,因為它沒有添加代碼。

這將為您提供所需的輸出。 你錯過的概念性事情是你需要保留第一個提交(選擇),但如果你“修復”其他兩個,它們將合並到它。 你需要給它們一些東西來合並到那個不是基礎的提交。 所以你選擇第二個,然后第三個合並到它給你兩個提交。

你也可以這樣做

git rebase -i 9c3641f

然后就不會在交互式編輯器中看到基本提交,但其余行的pickfixup將是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM