为什么合并和删除后Git功能分支仍然可见?

Ler*_*rve 7 git git-merge git-branch

采取的步骤

我将一个feature分支合并回master并删除了feature分支.但它仍然出现在树上.

结果

删除功能分支之前,SourceTree中的树可视化: 删除功能分支之前的树

删除功能分支 SourceTree中的树可视化: 删除功能分支后的树

feature正如预期的那样,左侧列表中的分支消失了,树形可视化中的标签也消失了,同样如预期的那样.

问题

但:

  1. 为什么紫罗兰部分仍然显示?
  2. 我需要执行哪些Git命令才能看到紫色部分?我可能自己回答了这个问题.

我知道上面截图中的最终提交有两个父母.但我不明白为什么在功能分支上发生的紫罗兰提交不在最终合并提交内master(我认为,这意味着紫罗兰分支在删除之后不再可见).

从命令行重新显示步骤(而不是SourceTree)

我在命令行上重播它(只是为了检查SourceTree是否做了我认为它做了什么),最后一步是a git merge feature.相同的情况:

命令行上的树形象化

试用 --squash

我解除了最后一次合并并尝试了这个:

git merge --squash feature
git commit "Squashed merge"
git delete -D feature # Note that -d did not work; it said "error: The branch 'feature' is not fully merged."
Run Code Online (Sandbox Code Playgroud)

现在它显示了我本来期望的东西.一条直线,没有任何feature分支表示:

直线树线后--squash

  1. 这个合并与以前的合并有什么不同?

我想在上面的所有试验和错误之后我将这些合并发生的事情拼凑在一起,但如果有人能够真正详细解释上述步骤的语义差异,我将不胜感激.

top*_*man 4

  1. 您仍然看到紫色部分,因为您 dit a git merge,它创建了一个组装两个分支的合并提交。由于分支已经发散,这是一个“非快进”合并,这就是为什么历史仍然会显示这种树。

  2. 你不想要紫色部分吗?使用git rebase而不是git merge. 在你的情况下:

    • git checkout master
    • git rebase feature
    • git branch -d feature

这将重播分歧之前feature的提交。master您的历史记录中将会有一条直线。

  1. 您做了一个git merge --squash非常类似于变基的操作 - 但您将源分支的所有提交压缩在一次提交中(在您的情况下,您只有一次提交,因此它并没有真正显示)