Git合并不会添加新文件。

4

这是我的提交历史记录:

 * Merge commit (missing file a.c)
/|
||
*| Add new file a.c again <- branchB
||
|* Remove files a.c <- branchA
||
*| Remove files a.c
||
\|
 |
 * Add new file a.c
 |
 |
...

我有一个分支A,我在其中添加了一个文件。然后,我又创建了一个分支B。由于某些原因(重构),该文件后来在分支B中被删除。我将这些更改回溯到了分支A中。但是后来,我又在分支B中添加了该文件。最终,我将分支B合并到了分支A中。

git checkout branchA
git merge branchB

合并时,没有提到文件a.c。在合并后,文件在branchA中不存在。为什么Git无法看到文件a.c在branchB中是在删除之后(就日期和时间而言)添加的,因此它需要保留它?至少,我希望看到冲突或其他提示...

感谢您的帮助!


1
您能否将您运行的Git命令发布出来? - John Bupit
我编辑了我的帖子。只是使用git checkout然后git merge。当然,我在两个分支中有更多的提交,并且不得不解决一些冲突。但是与此文件相关的没有冲突。 - gagou7
它不应该考虑日期,因为合并不应该优先考虑较晚的更改而不是较早的更改。 - eddyP23
2
日期和时间对于Git来说是无关紧要的,重要的是提交。具体而言,只有三个提交是重要的:合并基础,即两个分支重新汇合的地方(这是您底部的Add new file a.c提交),以及两个分支尖端 A 和 B。Git将合并基础与A进行差异比较,以查看A组更改了什么。Git将合并基础与B进行差异比较,以查看B组更改了什么。然后,Git将两个更改组合起来,将组合后的更改应用于合并基础,并提交结果。 - torek
1
好的,所以Git看到在合并基础和branchB之间文件a.c没有变化。但是在合并基础和branchA之间,它看到了一个删除操作。因此,结果是文件a.c被删除了。在我的情况下,使用git merge,即使在解决冲突后,生成的项目也处于无效状态,无法编译/工作...从git的角度来看,我该怎么办?是否有替代git merge或者我应该知道的合并参数? - gagou7
1个回答

0

从注释中:

具体而言,只有三个提交是重要的:合并基础,即两个分支再次合并的地方(这是您底部的Add new file a.c提交),以及两个分支端点A和B。

正如您提到的:

Git看到在合并基础和branchB之间file a.c没有变化。但在合并基础和branchA之间,它看到了删除。因此,结果是文件a.c被删除。

您可以在合并分支之前的两个提交上使用git difftool。 您将能够查看缺失的文件及其内容,并手动重新保存它们。

您还可以在两个分支上使用git diff --name-only。 一旦确定了缺失的文件,您可以直接将它们从branchB检出到branchA:

git checkout branchA
git checkout branchB -- a.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接