我最近在合并2分支时遇到了一个非常令人费解的Git问题。当自动合并尝试合并2个文件时,问题就出现了,这些文件的内容“大部分”是空格插入INSIDE一行。例如,在git merge(或git rebase)后查看此文件:
<<<<<<< f03b9ee0db23cbe39ff231d8fcc3b37bac20cc3d¬
1 public static function findTopParent($tid, $domaine_tree) {¬
2 =======¬
3 public static function findTopParent($tid,$domaine_tree) {¬
4 >>>>>>> Version 8 - last extraction¬
(注意$ tid之后的空格)这个“轻量级”编辑的目的只是为了与Drupal编码约定(在函数参数中昏迷后留下一个空格)。
我应该补充一点,这是合并左侧修订标记的一种情况。但 在很多情况下,自动合并确实可以正常工作,但在将文件与顶部的一大块代码(没有内部空间)和下面的一大块代码(带空格)合并时做得非常糟糕
但是在没有太多警告或错误的情况下运行我通常的git merge,我的站点停止使用所有类型的函数重定义错误。打开文件,我看到大量的代码在上面重复,上面的原始代码和下面函数中带有空格的昏迷的“新”代码。那到底是什么?????为什么这样的简单修改被Git解释为新行甚至更糟糕的新代码块?
我在整个地方做了几天变化,现在我和我的主要分支重新融合了。现在,我有点害怕对我的文件进行这种“小”改动,因为害怕创建隐藏在复制代码中的奇怪错误。我检查git merge doc但只发现与行末尾的空格相关的空白问题,行的开头(而不是制表符)或空格用于制表(core.whitespace)。但没有任何关于空间问题的内容增加了INSIDE。 :-(需要一些新鲜的眼睛!
编辑:
这里要清楚易懂,一个真实文件的摘录,前后。
合并前的主人:
// Menu Link MLID des pages HUB (statiques) du main-menu
// Requête BD : SELECT * FROM menu_links where plid = 999
// 726 = Loi et Réglements
// 728 = Aide financière de dernier recours
define ('LOI_AIDE_PAGE_MLID',934);
define ('REGLEMENT_PAGE_MLID',935);
define ('AFDR_PAGE_MLID',894);
// Taxonomy VID
define ('DOMAINE_VID',3);
在合并前的功能中(注意昏迷后添加的空间):
// Menu Link MLID des pages HUB (statiques) du main-menu
// Requête BD : SELECT * FROM menu_links where plid = 999
// 726 = Loi et Réglements
// 728 = Aide financière de dernier recours
define ('LOI_AIDE_PAGE_MLID', 934);
define ('REGLEMENT_PAGE_MLID', 935);
define ('AFDR_PAGE_MLID', 894);
// Taxonomy VID
define ('DOMAINE_VID', 3);
然后,在功能分支上:
git commit "blablabla"
git pull --rebase origin master (no message, everythings look cool)
git checkout master
git merge feature (fast-forward, no message)
...
run the site... error duplicate constant !?!?
打开文件,现在这个!?!
// Menu Link MLID des pages HUB (statiques) du main-menu
// Requête BD : SELECT * FROM menu_links where plid = 999
// 726 = Loi et Réglements
// 728 = Aide financière de dernier recours
define ('LOI_AIDE_PAGE_MLID',934);
define ('REGLEMENT_PAGE_MLID',935);
define ('AFDR_PAGE_MLID',894);
// Taxonomy VID
define ('DOMAINE_VID',3);
// Menu Link MLID des pages HUB (statiques) du main-menu
// Requête BD : SELECT * FROM menu_links where plid = 999
// 726 = Loi et Réglements
// 728 = Aide financière de dernier recours
define ('LOI_AIDE_PAGE_MLID', 934);
define ('REGLEMENT_PAGE_MLID', 935);
define ('AFDR_PAGE_MLID', 894);
// Taxonomy VID
define ('DOMAINE_VID', 3);
并且还找到了带有修订标记的文件,但更改也只有一个空格差异。
答案 0 :(得分:1)
您有合并冲突。这是正常的,并且会不时发生。那时两个分支改变了相同的行(或相邻行),因此计算机不知道使用哪一行。即使像空白变化一样小的东西也会引发这种情况。
你说你做过这样的事情:
git checkout -b feature
...work commit work commit...
git checkout master
git merge feature
但是这不会导致合并冲突,因为master
从未改变过。我想你这样做了......
git checkout -b feature
...make some commits on feature...
git checkout master
...make some commits on master (or maybe a pull)...
git checkout feature
...make some more commits on feature...
git checkout master
git merge feature
通常在合并时,Git会自动执行并提交更改。这次自动合并失败并且您处于合并冲突中。没有提交任何事情。 Git已经做了最好的编辑和添加代码,然后举手说“帮助,我需要一个人!”并让你处理剩下的事情。
现在完成提交是你的工作。这与进行任何其他提交基本相同。 Git已经添加了它成功合并的所有文件。其余的都改变了但没有分期。修复未分段的文件,添加它们并提交是你的工作。
非分段文件将具有冲突标记,显示两个分支之间存在冲突的行。就是这样。
<<<<<<< f03b9ee0db23cbe39ff231d8fcc3b37bac20cc3d¬
1 public static function findTopParent($tid, $domaine_tree) {¬
2 =======¬
3 public static function findTopParent($tid,$domaine_tree) {¬
4 >>>>>>> Version 8 - last extraction¬
您必须决定选择该行的哪个版本,或者您可以完全重写该行。第一个来自提交f03b9ee0
,第二个来自分支Version 8
。只需删除所有冲突标记内容和您不想要的行的版本。或写一个新行。
public static function findTopParent($tid, $domaine_tree) {
这里没有魔法,你只是像平常一样编辑文件。结果应该是您要提交的代码。
对文件中的所有冲突完成后,git add
文件。
重复直到没有更多冲突的文件并添加所有内容。然后提交。
You can read more about merge conflicts in the Pro Git。并here's another question covering resolving conflicts in Git。