1

过去两年我一直在使用 Git,它的合并是我迄今为止使用过的最伟大的合并之一,但最近它只是表现不佳。我的 git 上没有任何变化,但每次我进行合并时,它只是在起作用。

例如:我开始看到类似的东西

<<<<<<< 头

还有 ->>>>>>> 隐藏的更改

<<<<<<< 更新上游

这就是我在完成自动合并后在代码中看到的内容。奇怪的是,它并没有像以前那样要求我在一段时间内手动解决冲突。它以前从未这样做过。有人见过这种行为吗?

4

1 回答 1

4

这听起来很像一个空白问题。两种可能性(根据您的描述,可能两者都有):

行尾的空格

许多文本编辑器会自动为您缩进您的代码。这意味着,如果您在函数中间留下任何空白行,它们实际上可能包含空格或制表符。

例如,想象以下代码:

    function somethingFunky() {
        setupFunkyProcess();
        prepareTheFunk();

        goFunky();
    }

如果我们打开特殊代码视图(或任何你的编辑器调用它),我们可能会看到:

»   function somethingFunky() {¶
»   »   setupFunkyProcess();¶
»   »   prepareTheFunk();¶
»   »   ¶
»   »   goFunky();¶
»   }¶

或者我们可能会看到:

»   function somethingFunky() {¶
»   »   setupFunkyProcess();¶
»   »   prepareTheFunk();¶
¶
»   »   goFunky();¶
»   }¶

你看到空白行的区别了吗?对于大多数编程语言来说,这完全没有区别。如果它保持这种状态,它对 Git 的影响也为零。

但是想象一下,在未来的编辑过程中,它会从一种形式变为另一种形式。也许您手动删除了空格,或者您切换到在保存时去除空格的文本编辑器。现在两个版本之间会有技术差异,但只是空格;差异将如下所示:

<<<<<<< HEAD

=======

>>>>>>> BranchToMergeFrom

看起来熟悉?激活特殊代码后,实际上是:

<<<<<<< HEAD¶
»   »   ¶
=======¶
¶
>>>>>>> BranchToMergeFrom¶

行尾字符

另一种可能性,可以解释您评论中的警告:

warning: LF will be replaced by CRLF

是换行符的变化。

保存文本文件时,使用特殊代码表示每一行的结束。不幸的是,不同的操作系统在使用的代码上存在分歧。Wikipedia ( http://en.wikipedia.org/wiki/Newline ) 上有大量信息,但您只需要知道 Windows PC 和 Mac 或 Linux 系统将使用不同的 EOL 代码。

如果两个开发人员正在合作,但他们使用不同的操作系统,除非他们同意一个共同的标准,否则不同的 EOL 代码会导致很多冲突。

Git 用户通常管理这一点的方式是同意所有提交都将使用 Linux EOL 代码(Git 最初是为了帮助 Linux 内核的开发而创建的)。Git 可以配置为在您提交时自动转换行尾。Github 上有一些很好的说明:https ://help.github.com/articles/dealing-with-line-endings 。

如果您(或其他开发人员)没有配置您的系统以正确管理它,会发生什么?这些文件在技术上会有所不同,但由于它只是空格,因此差异消息可能没有那么有用:

<<<<<<< WindowsEOL
This is my test file.
The contents are irrelevant; they are
simply here for the purpose of EOL comparison.

In this file, the line endings are Windows format.
In other words, CRLF
=======
This is my test file.
The contents are irrelevant; they are
simply here for the purpose of EOL comparison.

In this file, the line endings are Unix format.
In other words, LF
>>>>>>> UnixEOL

你能做些什么来解决这个问题?

假设其中一些空白更改已提交到您的存储库,除了了解未来编辑期间发生的情况外,您无能为力。

如果这是您的存储库,请定义一些标准(Windows 或 Linux EOL,是否去除空格)并将其传达给您的合作者。如果您正在为其他人的回购做出贡献,请尝试找出他们的标准并自己坚持下去。

根据问题的程度(文件数量、差异数量等),您可能希望执行 repo 的清理并在没有其他更改的情况下提交。

于 2013-06-23T08:56:54.697 回答