【问题标题】:Why doesn't introducing a bug create a merge conflict with git?为什么引入 bug 不会与 git 产生合并冲突?
【发布时间】:2020-06-12 07:14:21
【问题描述】:

我是 git 新手,并试图了解合并冲突。我从 master 分支上的这个程序开始,在文件 helloworld.c 中:

#include <stdio.h>

int main () {
  printf("Hello world!\n");
}

然后我创建一个名为 dev2 的新分支:

$ git checkout -b dev2

然后我编辑文件 helloworld.c 并引入一个错误来创建文件:

#include <stdio.h>

int main () {
  printf("Hello world!\n")
}

然后我提交更改:

$ git commit -am "Bug"

然后我回到分支master:

$ git checkout master

我希望合并会产生冲突。取而代之的是,merge 命令只是愉快地将 bug 吸进了我的 master 分支:

$ git merge dev2
Updating 0379d43..b10cde3
Fast-forward
 helloworld.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

该错误现在在 master 分支中:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 17 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

$ cat helloworld.c
#include <stdio.h>

int main () {
  printf("Hello world!\n")
}

在我看来,合并应该抱怨来自 dev2 分支的文件中的一行与来自 master 分支的同一文件中的那一行不同。为什么这种合并不会产生冲突?

【问题讨论】:

  • 您认为对现有代码行的每一个更改都会是冲突?那将是完全无法控制的。 Git 不知道删除该分号是一个错误,它只是在处理文本。它正在完全按照您告诉它的方式进行 - 将更改从一个分支应用到另一个分支。
  • 您提交了一个更改,该更改将printf("Hello world!\n"); 更新为printf("Hello world!\n")。现在您将提交合并/应用到行为printf("Hello world!\n"); 的分支。当然它自然更新为printf("Hello world!\n")。为什么你会期待冲突?如果master 行是其他内容,例如printf("Hello world!\n");;;,则会导致冲突。

标签: git merge git-merge


【解决方案1】:

当即将合并的分支以不同的方式修改同一行时,就会发生合并冲突。更具体地说,当 git 不知道要保留哪个版本以及要丢弃哪个版本时,就会发生这种情况。在这种情况下,更改不会与任何其他更改发生冲突(感谢@jonrsharpe)。

Git 也不评估任何代码,因此 git 无法知道什么是错误,什么不是错误。

【讨论】:

  • 并不是说它微不足道,只是它没有与任何其他更改冲突。
  • 让我试着理解一下git的逻辑。它是这样的:文件有一个分号,然后被删除。所以 dev2 分支说“删除分号”。换句话说,git 查看当前提交和之前的提交并说“区别在于删除分号”。由于可以将相同的逻辑应用于主分支,因此它将更改合并。如果主分支在此期间发生了更改,它可能无法看到无冲突合并的路径。我将不得不考虑这一点。关于“状态”的一些担忧......
  • 我刚刚验证了 git 没有按照我在上面评论中所说的那样做。 Git 不会比较提交历史中的更改。我明白答案,但不是真的。我仍然感到困惑。
  • @bhristov 感谢您的建议。我认为 git 教程并不强调适当的工作流程。工作流程应该是:做一个 git diff 并了解要合并的分支。在没有引入问题时进行合并。如果发生合并冲突,不要“解决冲突”。查看差异并找出问题所在。发生冲突的事实意味着“出了点问题”,它可能远远超出 git 检测到冲突的地方。相反,如果没有发生合并冲突,仍然可能有问题。了解差异是最重要的。
  • @AnthonyMannucci 没有一个“合适的工作流程”。合并后您在 master 上遇到了问题,因为您在合并之前在 dev2 上遇到了问题,然后告诉 git 将该分支合并到 master 中。您不必逐行查看每个合并;如果您测试过 dev2,您就会知道它不起作用。您还可以使用分支的变基来确保合并是一个简单的快进(无论如何在这种情况下都会发生这种情况),然后您知道您在分支上测试的内容正是您在 master 之后得到的内容合并。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2013-07-16
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多