如何在Git中线性化"分裂"合并历史?

Sca*_*orn 3 git rebase

它必须非常明显,但我发现无法做到这一点.每个手册都将变基描述为现有分支或简单交互式变基的顶部,这就是全部.假设,我有一个类似钻石形状的git历史:

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

我希望像以下一样保持历史:

*   949430f Combined commit (BCD)
|  
*   9c3641f Base commit (A)
Run Code Online (Sandbox Code Playgroud)

提交B和C可能会被融化或丢弃,无所谓,我只想保留结果.此外,我不想因为令人讨厌的恐慌解决而还原提交.

这里我试过的事情:

1)我不能通过简单压扁B和C来避免这种情况

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

嗯,这有点可以理解,有一些冲突.

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...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为什么?这是选项"-m"......

有谁知道如何解决这个问题?

tor*_*rek 6

你想要的是git reset --soft(加上aragaer提到的提交).尽管问题的情况不同,请参阅VonC的回答.

  • 完整的答案是`git reset --soft commitA; git add.; git commit -m"Combined commit"`. (2认同)