【发布时间】: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>选择的合并基础。如果您查看该提交时的文件,您可能会找到答案。 -
这基本上告诉您的是,该提交(以及因此丢失的代码)被合并到您合并在一起的两个分支中,但在一方面,该合并是以一种抛出代码或该代码随后被还原。另一方可能不理会代码,因此将“不变”和“删除”合并到该代码的唯一效果就是进行删除。