【问题标题】:While merging, does Git only consider the timestamp of a commit rather than which branch it belongs to?合并时,Git 是否只考虑提交的时间戳而不考虑它属于哪个分支?
【发布时间】:2015-07-05 04:29:56
【问题描述】:

我在 Git 中有两个主要分支:masterdev
我的分支结构如下所示:

B-->E-->F-->G (master branch)

B-->C-->D-->H-->I-->J-->K (dev branch)

在我执行合并之前,masterdev 有一个共同的父级 B
在 master 的提交 EFG 中,我错误地删除了一些文件(比如 foobar),而它们仍然存在于提交 C 之后的 dev 分支中。
结果,当我通过创建提交L 执行三路合并以加入GK 时,L 不再包含 foo 和 bar! Git 并没有以任何方式通知我他们的失踪。

在我看来,因为 EFG 在提交后被简单地重播了 C 因此 foobar 消失了。

Git 合并的这种行为对我来说很奇怪。因为我无法知道是否有人从另一个分支中删除了某些文件。
我不应该在合并时至少收到有关任何冲突修改的通知吗?

【问题讨论】:

  • I was not notified by Git in any way about their disappearance. git merge 的输出显示正在应用的更改。
  • 为什么您认为在一个分支上删除而另一个分支上未触及的文件之间存在冲突?合并的重点是:以包含在任一分支上所做的所有更改的结果结束。因此,重新提交的提交从一个分支中删除,因为在另一个分支上没有对其进行任何冲突。
  • 如果是这样,那么将A合并到B和将B合并到A有什么区别?由于两次合并都将得出一个包含对 A 或 B 所做的所有更改的结果。

标签: git github


【解决方案1】:

在合并时是否应该至少通知我任何有冲突的修改?

在这种情况下,否:将 dev 合并到 master 会报告从 dev(自共同祖先 B)到 master 的修改。
B 以来,dev 中的 foo 和 bar 未修改。自B 以来,它们已在 master 中删除。没有冲突(如果foobardev 中没有修改):这两个文件与合并无关(从dev 没有应用),并且在master 中保持不变(意思是已删除)。

您可以preview a merge 使用:

git checkout master
git diff  --name-status dev

这将列出已删除的文件。

您能告诉我一些关于 Git 如何决定在合并期间重播哪些提交的建议吗?

Git 不会“重放”提交 when merging(仅 when rebasing):它只考虑两个分支 HEAD(以及共同的祖先)。

Git 创建一个由此 three-way merge 产生的新快照,并自动创建一个指向它的新提交。这称为合并提交,其特殊之处在于它有多个父级。

【讨论】:

  • 我实际上是从dev 合并到master。根据您的回答,Git 应该报告来自 dev 的修改,但 Git 没有向我报告任何内容。 dev 中的两个附加文件是否不被视为修改?
  • @lixiang“我实际上是从dev合并到master”:我已经相应地修改了答案,并解释了这里不涉及foobar的地方(并且仍然被删除在master)。
  • 我明白你的意思了!但是,我有一个关于合并的扩展问题。你能给我一些关于 Git 如何决定在合并期间重播哪些提交的指示吗?这个问题也与从A合并到B和从B合并到A是否有区别有关?谢谢!
  • 谢谢!我的最后一个问题是合并的方向如何影响最终的合并结果?在您的示例中,从“iss53”到“master”的合并与其他方式有何不同。
  • @lixiang 您在合并时报告从源到目标的修改。查看git-scm.com/book/en/v2/…,将master 合并到iss53(功能分支),会将修补程序文件(集成在master)报告给iss53。将iss53 合并到master 会将功能文件报告给master
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2021-03-15
  • 2012-07-03
相关资源
最近更新 更多