如何避免在git中提交小改动?

14
我想知道如何避免在代码微小更改时提交代码。例如,有时我会错过参数之间的空格或类似的代码格式问题。我问这个问题是因为以后我必须将提交推送到远程存储库,而我不想包括这些小的更改。
有什么想法吗?谢谢

2
请参考以下链接以了解如何压缩Git提交记录:https://dev59.com/OHE95IYBdhLWcg3wdtqj#2302947 - VonC
1
您可能还想考虑添加一个 pre-commit hook 来帮助审查您的编码风格。这样,如果您尝试提交违反您设置的某些标准的代码,git 就会抱怨。您可以在第一时间防止糟糕的提交!示例 pre-commit hook(.git/hooks/pre-commit.sample)查找诸如行末空格之类的内容。例如,您可以在脚本中包装 GNU indent,以强制执行特定的编码风格,并将其放入 pre-commit hook 中。 - David Brigada
4个回答

26

更新:正如其他人指出的那样,如果您已经将代码推送到远程分支并与其他开发人员共享了这些代码,请不要执行任何rebase或者历史重写等操作。简短的答案是:这很危险,也很冒险!

我建议您查看rebase命令来解决这个问题。它可以完全满足您的需求。

这个命令将较小的提交合并成更大的提交。

使用方法如下:

git rebase -i HEAD~5

您的编辑器将弹出当前分支头部最后5个提交记录,并带有一些文档说明。在您的情况下,您将需要使用squash命令。我提供的链接解释得非常清楚,他们有这样一个例子:

pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.

这将打包前面的三个提交,并将它们全部放在你标记为pick的提交下面。然后,您可以修改提交消息等内容。

玩得开心!


+1. 合并提交是正确的方法。更多信息请参见:http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html - Jeet
2
不管你做什么,如果你已经推送了更改,请不要这样做:S - andrewdotnich
即使存储库只是为我自己而不是其他开发人员使用,也需要进行版本控制吗? - Homero Esmeraldo
我刚刚这样做,结果与远程发生了冲突。我不得不进行合并并解决冲突。所以原本应该让历史记录更好的东西,反而让它变得更糟。我不知道是否有任何干净的方法来rebase远程。 - Homero Esmeraldo

18

唯一的更改方式是提交(commit)。但是如果您愿意,您可以修改以前的提交(commit),将新更改包含在其中。这是在您尚未将先前的提交推送到远程存储库时可能是最好的解决方案。

关于修改 Git 提交有很好的信息可以在Git 用户手册博客文章中找到。


感谢提供的链接。然而,我不喜欢“点击这里”这种链接样式。这里有一个有用的书签工具,可以生成描述性链接:复制Markdown链接或编辑它(pastebin链接)。 - takeshin
如果您之前没有将更改push到远程origin,那么commit --amend非常好用。如果您已经推送了更改,则在执行amend之后,您必须使用push --force,这非常危险。 - Danijel

3

解决这个问题的最佳方法之一是在提交前使用Git工具git difftool在每个修改过的文件上运行一个可视化工具,如xdiff或winmerge。这样可以轻松撤销小的更改,并捕获您忘记并未准备好的重大更改。我经常通过这种方式发现很多bug。例如,在查看代码时,缺少或多余的HTML标记可能很难发现,但是通过比较就容易发现。


1
你为什么不直接使用 git diff 呢?这是它的主要用途之一... - Cascabel
@Jefromi,git diff 不允许我编辑代码并还原文件的部分内容。此外,我发现将完整文件内容进行并排对比更有帮助,这可以帮助我捕捉到在逐行对比中可能会错过的错误(我不会感到惊讶如果有这样的选项,但它无法弥补缺少编辑的问题)。 - mikerobi
啊,我以为这主要是在验证上下文中,你不太可能进行编辑,只需从索引中添加/重置更改。很酷。 - Cascabel

0

一种选择是在一个单独的分支上工作,然后当你觉得足够了时,将该分支的所有提交压缩成一个单独的提交,参见this question


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接