10

我正在使用 Git 来跟踪一些 matlab 代码。一个玩具例子最能说明这个问题。到目前为止的项目看起来像这样。

    C
   /
A--
   \
    B

A的内容是x=5

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

然后我们提交 B,我们的内容如下

if flag==1
    x=5
end

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

    C
   / \
A--   D
   \ /
    B

与 D 中的合并结果,我们会遇到冲突,因为两者的主线都已更改(在 B 中添加了缩进,在 C 中将 5 更改为 6)。

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

我已经阅读了https://stackoverflow.com/a/5262473/288545中的一种策略,虽然这可以避免冲突,但它会丢弃缩进以支持内容更改(这是一种改进,但仍然使更难阅读代码)。

我想我可以在编写代码时吸收它而不改变缩进。这使得它的可读性降低,但在 matlab 中并不是什么大问题。然而,在 python 中,缩进真的很重要,那么 python 人如何处理它呢?如果我们稍后将大块代码更改为控制结构内部,这会变得更加丑陋,因此差异涉及很多行并使合并冲突成为一个非常令人头疼的问题。

是否有一种合并策略可以分别处理间距变化和内容变化,然后将它们整合起来?我希望合并的结果是

if flag==1
    x=6
end
4

2 回答 2

4

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

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

这种哲学意味着“不要在不属于它们的提交中转储空白更改。” 如果你正在重写 touch 函数,当然,改进间距。否则将其留给自己的提交,并确保处理该文件的其他人知道空白更改即将到来。这将在集成时为您省去麻烦。

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

mv .git/hooks/pre-commit.sample .git/hooks/pre-commit

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

于 2012-09-11T23:55:10.543 回答
4

一些差异工具比其他工具更好。我使用KDiff3,并将其设置为使用git mergetool. 它仍然不完美,但它通常可以检测到您描述的那种合并并自动产生合理的合并。

于 2012-09-12T10:00:46.150 回答