【问题标题】:Commit changes missing from git merge提交 git merge 中缺少的更改
【发布时间】:2017-09-11 21:52:49
【问题描述】:

我有两个分支,A) 开发和 B) 功能

我在 B 上工作,现在准备将 B 合并到 A 中。A 显然已经完成了很多工作,许多其他功能分支通过拉取请求合并。我拉出 A 的最新负责人并出于测试目的,假设我将 A 合并到 B(注意,我在两个方向上都得到了相同的行为,但我试图找出问题出在哪里)。

我将 A 合并到 B,但在解决合并冲突后出现了很多编译器错误。我注意到 A 中实际上包含的代码只是没有将其传递给 B。这会导致构建失败,并且缺少很多东西(它至少是一个大提交的代码)。

我追踪了我在从 A“合并”到 B 时遇到问题的提交。但这并不是说它没有合并,当我在合并后签出 B 时键入“git log”时确实看到了它。由于某种原因,与提交相关的实际更改会消失。有问题的代码没有合并冲突,而且我确信我在处理 B 时从未接触过该部分,因此可能会发生其他任何事情。

关于“丢失”提交(即使我在分支日志中看到它),我应该怎么做才能恢复实际更改?我会使用差异工具,但我担心这是一个更大问题的症状,并且我不知道的其他代码也可能丢失。

我对 git 还很陌生,所以我有点不确定如何处理这个问题。如果还有其他有用的信息,请告诉我。

到目前为止我所做的尝试:

将 A 合并到 B,提交存在,但提交的代码不存在 将 B 合并到 A,相同代码/提交的相同问题

我尝试过变基,但是分支因许多冲突而被许多提交关闭。所有提交也都在服务器上,所以从我读过的内容来看,这可能是个坏主意。请让我知道我是否应该尝试在某个方向(A->B 或 B->A)进行变基。

【问题讨论】:

  • 正如很常见的那样,minimal reproducible example 会有所帮助,但即使没有它,它也只会显示您运行的命令的实际命令行解释器序列(git checkout br1; git merge br2,以及其他任何内容,例如) 在这里会有所帮助。

标签: git version-control merge


【解决方案1】:

解决方案

如果只是缺少一个提交,您可以通过在 B 分支上发出 cherry-pick 命令轻松地将其应用到 A 分支:

git cherry-pick commit_name

此命令采用特定的提交(按名称)并将其作为新提交应用到当前分支。只需检查日志中提交的名称并将其粘贴为参数即可。

以下是有关该命令的更多信息: https://git-scm.com/docs/git-cherry-pick

更多关于可能的原因

至于问题本身。您遇到这种情况的原因可能有很多,其中一些可能是微不足道的,有些则不是。我会说 GIT 最有可能看到差异,但由于某种原因得出的结论是不应应用它们(在自动合并过程中)。您将必须检查 B 分支的历史记录,它是如何以及何时(关于此 A 提交)创建的,以及它是否具有该特定提交的任何历史记录。

无论如何,如果来自该提交的更改实际上并没有出现在 B 代码中,樱桃选择应该可以帮助您解决这个问题,因为它将使用新的提交名称应用这些更改,从而避免任何问题。

【讨论】:

  • 感谢帮助,在对哪些提交(有两个)进行了一些调查后,我能够使用cherry-pick 解决我的问题。提交大约 1 个月大,我仍然很好奇为什么更改在合并时消失了,但现在我至少可以扑灭大火并继续工作。
【解决方案2】:

一个原因可能是您之前将 A 合并到 B 并以您的提交遗漏的方式处理了冲突。

Feature 分支与 develop 分叉了很长时间,可能很难合并回 develop (B -> A)。为了防止这种情况,可以在一段时间后将 develop 合并到 feature (A -> B) 以处理目前为止 2 个分支之间的冲突。在这种情况下,当您稍后合并 A 和 B(在任何方向上)时,git 不再提及已处理的冲突。

要检查这一点,请在最终合并之前在 B 上使用“git log”,如果您看到丢失的提交,则表示它已经合并到 B。

【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多