【问题标题】:Git merge behaving crazyGit合并表现疯狂
【发布时间】:2013-06-21 17:54:32
【问题描述】:

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

例如:我开始看到像

这样的东西

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

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

【问题讨论】:

  • 我认为这是相关的。这就是我在看到上面的垃圾之前每次提交时看到的。 warning: LF will be replaced by CRLF in OpusOneCorp/Services/WebServices/Registration/User/Validations/Campaign/SouthernLivingValidator.cs. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in OpusOneCorp/Services/WebServices/Registration/User/Validations/Campaign/SouthernLivingValidator.cs. The file will have its original line endings in your working directory.
  • 如果 git merge 这次没有告诉你有冲突,那么很可能是它在过去的某个时间,然后这些文件被无意中按原样提交而没有解决冲突,这意味着这些文件的提交版本现在包含冲突标记,就好像它们是普通文本的一部分......

标签: git github git-merge


【解决方案1】:

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

行尾空格

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

例如,想象下面的代码:

    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 做出贡献,请尝试找出他们的标准并自己坚持下去。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 2010-12-12
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多