为什么回答问题后显示回答已删除?

SourceTree 中的树可视化 删除特征分支:

SourceTree 中的树可视化 删除特征分支:

左侧列表中的feature 分支如预期般消失了,树可视化中的标签也如预期般消失了。

  1. 为什么仍然显示紫色部分?
  2. 我需要执行哪些 Git 命令才能不再看到紫色部分?我可能在后面两节自己回答了这个问题。

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

从命令行重播步骤(而不是 SourceTree)

我在命令行上重放了它(只是为了检查 SourceTree 是否按照我的想法做了),最后一步是 git merge feature。同样的情况:

我取消了最后一次合并并尝试了这个:

现在它显示了我最初的预期。一条直线,没有任何迹象表明 feature 分支曾经存在:

  1. 这次合并与之前的合并有何不同?

我想我在上面的所有试验和错误之后拼凑了这些合并会发生什么,但如果有人能真正详细解释上述步骤的语义差异是什么,我将不胜感激。


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

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

这将在分歧之前重播featuremaster 上的提交。您的历史记录中会出现一条直线。

  1. 你做了一个git merge --squash,它很像一个变基 - 但是你在一次提交中压缩了源分支的所有提交(在你的情况下你只有一个提交,所以它并没有真正显示)李>
  • 您的第二点非常有帮助,它首先解释了如何避免获得紫色部分。但是,假设我确实执行了git merge feature,然后在master 上执行了另外十几个提交:我怎样才能让紫罗兰色部分在游戏中消失这么晚?让我们进一步假设我没有推送任何东西,所以重写历史是可以接受的。如何做到这一点?

  • 假设你没有推送任何东西,它仍然是可行的。有十几个提交,这取决于......你有两个解决方案:1)这些提交与合并不太相关?你可以做一个交互式变基(看起来有点难) - 2)git reset 在合并之前,git stash 你的修改,git rebase feature 然后git stash pop 来检索你的修改,并重做你的提交

  • @topheman 尝试点 2:“功能”被删除,重置后我看不到分支“功能”?

  • 不是重置,而是变基:这就是为什么在您想要将代码从功能导入到主控的场景中不再需要此功能分支的原因。

删除分支时,您删除的是指向提交的指针,而不是提交本身。如果没有其他对该提交的引用,则该提交最终会被垃圾收集,但合并后的提交会创建对该提交的引用(因为该提交是其父提交)。

最初的merge 工作流创建一个包含两个父级的合并提交,即使指向它的分支不存在,第二个父级提交仍然存在。

当您执行git merge --squash 时,您实际上是在将您的提交的rebase 提交到目标分支上,从而为您提供线性历史记录而不是双亲历史记录。有关该命令和rebase 之间的区别,请查看。

  • 不错的链接。它说git merge --squash“没有标记任何合并关系”。那是我不明白的部分。谢谢!

  • @Lernkurve。不客气。如果你想重写你的历史,你需要准确地决定你希望你的历史是什么样子。例如,您是希望在 master 分支之上进行十几个提交,还是只需要一个相当于所有这些提交的提交?

  • 我对第一个示例感兴趣,我可以在 master 之上保留十几个提交。但出于学习目的,我也对一个提交等同于所有提交的示例感兴趣。

  • 成功了! :-) 我刚刚用 精心挑选了它。愉快!非常感谢。

我要回帖

更多关于 别人问为什么删除她的回答 的文章

 

随机推荐