Git 合并对一行内的空格感到困惑



我最近在合并 2 个分支时遇到了一个非常令人费解的 Git 问题。当自动合并尝试合并 2 个内容"大部分"空格插入一行内的文件时,出现了问题。例如,在 git 合并(或 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 合并后,我的网站停止处理各种函数重新定义错误。打开文件,我看到代码块到处重复,上面的原始代码和下面的函数中带有空格彪态的"新"代码。那到底是什么?????为什么像这样的简单修改会被 Git 解释为新行甚至更糟糕的新代码块?

几天来,我到

处都是这些变化,现在我与我的主要分支重新合并的时间非常糟糕。现在,我有点害怕对我的文件进行这种"小"更改,因为害怕在复制代码中产生奇怪的错误。我检查了 git merge doc,但只发现与行尾空格、行首(而不是制表符(或空格用于制表符(core.whitespace(相关的空格问题。但是没有关于内部空间添加的问题。:-( 需要一些新鲜的眼光来看待这一点!

编辑:

为了清楚和更容易理解,这里从真实文件中提取了一个,之前和之后。

在合并前的主控中:

// 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);

并且还找到了带有修订标记的文件,但更改也只有一个空格差异。

您有合并冲突。 这是正常的,会不时发生。 那时两个分支更改了同一行(或相邻行(,因此计算机不知道要使用哪一条。 即使是像空格更改这样小的事情也会触发这种情况。

说你做了这样的事情:

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文件。

重复此操作,直到不再有冲突的文件并添加所有内容。 然后提交。

您可以在 Pro Git 中阅读有关合并冲突的更多信息。 这是另一个问题,涉及解决 Git 中的冲突。

相关内容

最新更新