【问题标题】:Git merge dropped more recent codeGit 合并删除了更新的代码
【发布时间】:2013-10-23 15:40:22
【问题描述】:

自从我开始在 3 人团队中使用 git 已经一年了,这是我第一次不明白为什么 git 会惩罚我。

我有主分支开发。

2013 年 9 月,我从“开发”创建了分支“主题”并开始着手处理。

2013 年 10 月,我从“develop”创建了分支“fixOct”并开始着手处理。

在“wsCommesse.cs”文件中,我有函数 A、C、D。

在分支“主题”上,我向 D 函数添加了一些 cmets。

在分支“fixOct”上,我在函数 A 和 C 之间添加了一个冗长的函数 B;然后我修改了函数 D 中的许多行。

今天我尝试将“主题”与“fixOct”合并。 我收到一个合并冲突警告我 git 不知道他是否必须添加函数 B(好的),但将所有更改的代码扔到函数 D 中,保持在分支“主题”上编辑评论(灾难性)。

我搜索了有关为什么会发生这种情况的文档,尝试了不同的合并策略、耐心、日志记录、详细; git 看到函数 D 没有冲突,他只是觉得该代码必须被丢弃。

保留它的唯一方法是使用“merge -s ours topics”,但这会扼杀合并智能。

他为什么不警告我有冲突? 为什么他认为杀死更新鲜的代码是安全的? 我怎样才能防止将来出现类似的问题,甚至增加更多的手工检查冲突?

我使用 bitbucket Web 界面附上了所发生情况的差异屏幕截图。 红色表示通过合并删除的最新代码。 合并后保留的旧代码以绿色显示。

相同的代码,并排的差异

提前致谢, 法布里奇奥

【问题讨论】:

  • 我的第一次尝试是使用rebase -i 拆分导致 git 问题的提交。如果没有看到实际内容(合并库、我们的、他们的),很难说出 git 的合并算法有什么令人困惑的地方。
  • @jthill 两个分支都来自“开发”。我应该在哪个分支上运行 rebase ?我知道没有实际代码很难得到答案,我认为这更像是一个概念问题;仍然,在一个特定文件上遇到问题,一旦你告诉我应该运行 rebase 什么,我会尝试发布我发现的内容: - 在合并之前的主题上? - 在合并之前的 fixOct 上? - 合并后在 fixOct 上?
  • 阅读交互式变基,你在有问题历史的分支上做。
  • 您有两个已合并的提交,因此您应该能够找到 git 使用 git merge-base <commita> <commitb> 选择的合并基础。如果您查看该提交时的文件,您可能会找到答案。
  • 这基本上告诉您的是,该提交(以及因此丢失的代码)被合并到您合并在一起的两个分支中,但在一方面,该合并是以一种抛出代码或该代码随后被还原。另一方可能不理会代码,因此将“不变”和“删除”合并到该代码的唯一效果就是进行删除。

标签: git merge git-merge


【解决方案1】:

@jthill 和@charlesBailey 在 cmets 中很有帮助,我还没有找到“真正的”解决方案,我没有时间花在这个问题上;我只会写我发现的内容,希望对其他人有所帮助。

问题的根源可能是人为错误,有人标记了最近的更新,然后在处理冲突时丢弃了部分代码,导致该代码在后续合并中被抛出。

理解这一点的关键是使用命令git merge-base <commita> <commitb> 比较两个分支,并告诉您将来用于两者合并的共同提交祖先是什么。

我发现祖先比我想象的要新得多,并且已经包含了我认为只是在其中一个分支中的代码;最终合并时丢失的代码。

我认为更好地学习rebase 的使用将有助于缓解这个问题,但目前我将继续使用merge --no-ff filosophy 并尝试保持较低的当前分支数。

干杯, 法布里奇奥

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多