【问题标题】:Git merge does not add new filesGit合并不添加新文件
【发布时间】:2017-07-15 04:04:10
【问题描述】:

这是我的提交历史:

 * 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
 |
 |
...

我有一个分支分支,我在其中添加了一个文件。然后,我分支到了branchB。由于某种原因(重构),该文件后来在 branchB 中被删除。我将这些更改反向移植到 branchA 中。但后来,我又在 branchB 中添加了文件。最后我将branchB合并到branchA中。

git checkout branchA
git merge branchB

在合并期间,没有提及文件 a.c.并且在branchA中合并后文件不存在。为什么 git 无法在 branchB 中看到文件 a.c 是在删除(在两个分支中)之后(相对于日期和时间)添加的,因此需要保留它?至少,我想看看冲突什么的……

感谢您的帮助!

【问题讨论】:

  • 你可以发布你运行的 git 命令吗?
  • 我编辑了我的帖子。只需使用 git checkout 然后 git merge。当然,我在两个分支中都有更多的提交,并且必须解决一些冲突。但没有与此文件相关的冲突。
  • 它不应该查看日期,因为合并并不意味着更喜欢稍后的更改而不是更早的更改。
  • 日期和时间与 Git 无关;重要的是提交。具体来说,三个 - 并且只有三个 - 提交很重要:合并基础,两个分支回到一起(这是你的底部 Add new file a.c 提交),以及两个 分支提示 A 和 B。Git 将合并基础与 A 进行比较,以查看 A 组发生了哪些变化。 Git 将合并基础与 B 进行比较,以查看 B 组发生了什么变化。然后 Git 合并这两个更改,将合并后的更改应用到合并基础,并提交结果。
  • 好的,所以 Git 发现合并基础和分支 B 之间的文件 a.c 没有变化。但是在合并基础和分支A 之间,它看到了一个删除。所以结果是文件 a.c 被删除了。在我的情况下,使用 git merge,即使在管理冲突之后,生成的项目也处于无效状态并且无法再编译/工作......从 git 的角度来看,我该怎么办?是否有我应该注意的 git merge 或合并参数的替代方法?

标签: git merge


【解决方案1】:

来自cmets:

具体来说,三个——而且只有三个——提交很重要:合并基础, 两个分支一起回来的地方(那是你的底部添加新 文件 a.c 提交),以及两个分支提示 A 和 B。

而且,正如你提到的:

Git 发现合并基础之间的文件 a.c 没有变化 和分支B。但是在合并基础和分支A 之间,它看到了一个 删除。所以结果就是文件a.c被删除了。

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

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

git checkout branchA
git checkout branchB -- a.c

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2012-09-24
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2017-02-08
    相关资源
    最近更新 更多