合并期间在Git中集成缩进和内容更改:最佳实践?

Dan*_*ler 10 python git merge matlab indentation

我正在使用Git来跟踪一些matlab代码.最好的玩具示例说明了这个问题.到目前为止,该项目看起来像这样.

    C
   /
A--
   \
    B
Run Code Online (Sandbox Code Playgroud)

A的内容是 x=5

我们创建提交C,其中行被更改为 x=6

然后我们进行提交B,其中我们的内容如下所示

if flag==1
    x=5
end
Run Code Online (Sandbox Code Playgroud)

如果我们尝试合并项目的目标看起来像

    C
   / \
A--   D
   \ /
    B
Run Code Online (Sandbox Code Playgroud)

合并结果在D中,我们会发生冲突,因为主线在两者中都有变化(在B中添加缩进,在C中变为6).

是否有最佳实践方法来集成来自一个分支的缩进更改,以及来自另一个分支的内容更改,以获得合并结果?

我在/sf/answers/368373141/上读过一个策略,虽然这样可以避免冲突,但它会丢弃缩进以支持内容更改(这是一个改进,但仍然使为了更难阅读代码).

我想我可以在编写代码时吮吸它而不是更改缩进.这使得它的可读性降低,但在matlab中并不是一件大事.然而,在python中,缩进真的很重要,那么python人们如何处理呢?如果有大块代码我们后来改变为控制结构内部,那么这会变得更加丑陋,因此差异触及许多行并使合并冲突成为一个巨大的麻烦.

是否有合并策略分别处理间距更改和内容更改,然后集成它们?我想要合并的结果

if flag==1
    x=6
end
Run Code Online (Sandbox Code Playgroud)

Chr*_*her 6

解决问题的关键是将空格清理和函数重写视为单独的提交。

作为进行大量分支集成的人,我可以诚实地说,对于集成商来说,最烦人的两件事是:1) 喜欢重新格式化他们没有编写的文件或他们没有重写的函数的程序员,以及 2) 重新格式化的 IDE只需打开并保存整个文件即可。当然,在这两种情况下,文件都更具可读性,但它完全违背了版本控制的要点:应该智能地调整提交的大小、构建和审查。他们的命令应该有意义。厨房水槽的提交会产生无用的历史,而历史应该是有用的。

这一理念意味着“不要将空白更改转储到不属于它们的地方”。如果您要重写触摸功能,当然要改善间距。否则,将其留给自己的提交,并确保处理该文件的其他人知道即将发生空格更改。这将为您省去集成时的麻烦。

此外,您可以使用 git 的库存预提交挂钩来避免意外的空白错误(尾随空格、空格后的制表符等)。在您的存储库中发出此命令进行设置:

mv .git/hooks/pre-commit.sample .git/hooks/pre-commit
Run Code Online (Sandbox Code Playgroud)

它或多或少会出现问题git diff --check,这对于检测这些类型的问题也非常有用。