Python 集成缩进&;合并期间Git中的内容更改:最佳实践?
我正在使用Git跟踪一些matlab代码。一个玩具的例子最能说明这个问题。到目前为止,这个项目看起来是这样的Python 集成缩进&;合并期间Git中的内容更改:最佳实践?,python,git,matlab,merge,indentation,Python,Git,Matlab,Merge,Indentation,我正在使用Git跟踪一些matlab代码。一个玩具的例子最能说明这个问题。到目前为止,这个项目看起来是这样的 C / A-- \ B A的内容是x=5 我们使用commit C,其中行更改为x=6 然后我们进行提交B,其中我们的内容如下 if flag==1 x=5 end 如果我们尝试合并项目的目标如下 C / \ A-- D \ / B 合并结果在D中,我们将得到一个冲突,因为主线在这两个方面都已更改(缩进在B中添加,
C
/
A--
\
B
A的内容是x=5
我们使用commit C,其中行更改为x=6
然后我们进行提交B,其中我们的内容如下
if flag==1
x=5
end
如果我们尝试合并项目的目标如下
C
/ \
A-- D
\ /
B
合并结果在D中,我们将得到一个冲突,因为主线在这两个方面都已更改(缩进在B中添加,5在C中更改为6)
是否有一种最佳实践方法来集成一个分支的缩进更改和另一个分支的内容更改,以获得合并结果
我在中读到过一个策略,虽然这可以避免冲突,但它会放弃缩进,而支持内容更改(这是一个改进,但仍然会使代码更难阅读)
我想我可以在编写代码时吸收它而不改变缩进。这使其可读性降低,但在matlab中并不是什么大问题。然而,在python中,缩进确实很重要,所以python人员如何处理缩进呢?如果有大量代码块我们后来将其更改为控制结构中的代码块,那么这会变得更加丑陋,因此差异会涉及许多行,并使合并冲突成为一个巨大的难题
是否有一种合并策略可以分别处理间距更改和内容更改,然后将其集成?我希望合并的结果是
if flag==1
x=6
end
解决问题的关键是将空白清理和函数重写视为单独的提交 作为一个做过大量分支集成的人,我可以诚实地说,对于集成商来说,最烦人的两件事是:1)喜欢重新格式化他们没有编写的文件或他们没有重写的函数的编码器,以及2)只需打开并保存整个文件就可以重新格式化的IDE。当然,在这两种情况下,文件都更具可读性,但它完全违背了版本控制的要点:提交应该智能地调整大小、构造和审查。他们的顺序应该有意义。厨房里的水槽会让历史变得毫无用处,历史应该是有用的 这一理念意味着“不要在不属于它们的提交中转储空格更改。”如果您要重写touch函数,当然要改进空格。否则,让它自己提交,并确保处理该文件的其他人知道将要进行空白更改。这将在集成时为您节省麻烦 此外,使用git的stock pre-commit钩子可以避免意外的空白错误(尾随空格、空格后的制表符等)。在存储库中发出以下命令以进行设置:
mv .git/hooks/pre-commit.sample .git/hooks/pre-commit
它或多或少会出现问题
git diff--check
,这对于检测这些类型的问题也非常有用。一些diff工具比其他工具更好。我使用,并将其设置为使用自动调用。它仍然不是完美的,但它通常可以检测到您描述的那种合并,并自动生成合理的合并。在python中,我们将所有人引导到pep8
,它告诉他们将代码缩进4个空格。然后,因为我们都在用4个空格的缩进来编写代码,所以我们不必再担心如何更改缩进…;-)@mgilson如果您的代码最初是独立的(未插入),然后将其嵌入到控件结构中,那么问题仍然会出现,因此必须缩进。即使你只做了4个空格,你仍然会遇到合并冲突,因为一个分支引入了4个新空格,而另一个分支引入了内容更改。我的评论大多是开玩笑的。你当然是对的。然而,在这种情况下,它也不必是缩进。每当对同一代码块进行任何不兼容的更改时,就会出现合并冲突。这就是为什么git强制您处理这些不兼容的更改并手动合并它们。。。当然,有很多工具可以尝试使用git mergetool
。@DanielKessler从a到D,即使忽略空格,每行的内容也会发生变化。自动合并程序应该如何知道您想要什么?在我看来,这是不可能的。@DanielKessler在您的示例中,没有不更改内容的分支……请尝试git diff-w
在查看提交时忽略仅更改空格。