管理git中的代码更改

管理git中的代码更改,git,version-control,dvcs,Git,Version Control,Dvcs,我发现我对我的源代码做了很多小的修改,通常这些修改几乎没有任何功能上的效果。例如: 改进或纠正评论 在类中移动函数定义以获得更自然的读取顺序 间隔和排列一些声明以确保可读性 使用多行将某物折叠为一行 删除一段已注释掉的旧代码 更正一些不一致的空格 我想我对代码中的细节非常关注。但问题是,我不知道如何处理这些更改,它们使得在git中很难在分支之间切换。我发现自己不知道是否要提交这些小的更改,将它们隐藏起来,或者将它们放在一个单独的小调整分支中,然后再将其合并。这些选择似乎都不理想 主要问题是这

我发现我对我的源代码做了很多小的修改,通常这些修改几乎没有任何功能上的效果。例如:

  • 改进或纠正评论
  • 在类中移动函数定义以获得更自然的读取顺序
  • 间隔和排列一些声明以确保可读性
  • 使用多行将某物折叠为一行
  • 删除一段已注释掉的旧代码
  • 更正一些不一致的空格
我想我对代码中的细节非常关注。但问题是,我不知道如何处理这些更改,它们使得在git中很难在分支之间切换。我发现自己不知道是否要提交这些小的更改,将它们隐藏起来,或者将它们放在一个单独的小调整分支中,然后再将其合并。这些选择似乎都不理想


主要问题是这些变化是不可预测的。如果我要提交这些,那么会有这么多的提交,其中包含“代码美学上的微小变化”的消息,因为在我第二次提交时,我注意到了另一个类似的问题。当我做了一个小的改变,一个重大的改变,然后又做了一个小的改变,我该怎么办?我想把三个小改动合并成一个提交。看到文件在
git status
中被修改也很烦人,而更改几乎不值得我注意。我知道git commit--amend,但我也知道这是一种不好的做法,因为它会使我的回购与远程不一致。

我认为你不应该将它们与其他“真正的”更改一起包括在内。这样做会使合并分支时难以查看更改

也许您将这些微小的更改保留在自己的分支上的想法是有好处的


当我使用Perforce(它有多个变更列表)时,我可以将这些编辑保存在一个单独的变更列表中,直到我“足够”保证签入。签入将包含多个文件,每个文件可能有多个布局更改,但没有“真正的”更改。

一方面,我认为适度频繁的小更改不会对任何人或任何人或事造成很大伤害。我总是马上做出一些小的修饰性的改变,在我们的团队中,我们已经同意在我们的承诺信息中使用“修饰性”这个词,就是这样

我不推荐的是将化妆品和其他改变一起使用


另一方面,如果这对你来说是一个问题,并且你想改变一些事情,我建议你做一些整容手术,你可以立刻修复你提到的清单中的所有事情。只在某个时间点专注于化妆品也可能更有效。否则,表面上的更改可能会成为一种拖延行为。

我认为您应该单独提交这些更改,并提供更好的提交消息。你应该写一些东西,比如“在X视图的X部分改变了标题的间距”


这不会对您造成任何伤害。

在git中,请记住,在推送(或以其他方式发布)您的提交之前,您可以根据需要自由编辑它们。在您的示例中,假设您还没有推动您的主要更改,我认为您完全有理由合并这两个次要更改。如果您担心会污染主代码库,那么您可以像往常一样进行工作,提交,然后在推送之前编辑提交,以便将较小的更改作为最新的提交一起进行,检查它是否足够大,可以推送,但不能推送该提交(目前)如果它看起来太小。

我建议将它们分开,并坚持这样做,这样至少其他开发人员可以将它们合并在一起而不用太担心。:-)我也倾向于做你描述的事情

另一个可行的建议是定义代码的标准格式,并使用IDE或其他一些过程(构建/签入)在保存或签入时自动格式化代码。这样,如果您是叛逆者,您仍然可以在本地使用自己的格式:-),但签入时所有代码看起来都一样


我认为git有能力定义预签入钩子,但也有ant目标、maven插件和IDE函数/插件,它们将以一种不受干扰的方式自动格式化。

您很幸运能够使用git!正如其他人所指出的,在将变更推送到回购之前,您可以将其合并。这是git更酷的与众不同之处之一。如果你在树枝上工作,我可以陪你走过去:

> git checkout dev  # branch for work
>> ... do some stuff
> git commit -am 'cosmetic only 1'
>> ... do some more stuff
> git commit -am 'cosmetic stuff I missed last time'
>> ... do some real stuff
> git commit -am 'real work'
> git checkout master && git pull && git checkout dev 
  # optional, if you repo is out of date
> git rebase --interactive master 
此时,您可以重新安排提交,并将它们组合在一起——这正是您想要的。最后:

> git checkout master && git merge dev && git push && git checkout dev
所以秘密是:

  • git轻松处理分支的能力
  • git经常登记的便利性
  • git在系统中已经具备了编辑提交的能力
老实说,我通常不太担心提交日志。我只是翻查了一下历史,很少有人认为这样的维护是值得的


顺便说一句,如果你不在分支机构工作,我肯定有办法做到这一点,但我不知道。这里有一个处理分支的参考:

这是所有源代码管理系统的常见问题。我还没有找到系统内置的答案。如果您保留了从不推送/提交修补程序的本地分支(例如,化妆品分支),那么类似于
commit--amend
rebase--interactive
(可以对提交进行重新排序、编辑和挤压)突然之间,这些都是潜在的好实践——它们可以使您的开发历史更清晰!使用mercurial的MQ扩展来获得mercurial中的git重基功能git中的模拟功能是保留一个外观分支,并可能在最后以交互方式重基,以便在合并之前很好地将内容压缩在一起,或者保留一个外观隐藏,定期应用它,添加更多更改,然后再次隐藏。Unfo