如何让 Git 不列出修改过的更改?

tus*_*ker 1 git

Git status 会给我已更改的文件列表,其中我有一些已更改但我不想提交,只需将其保留在工作目录中即可。令人烦恼的是,在提交之前,如果有新的更改,我必须扫描这些文件的差异,或者这些修改只是我知道的并且不想提交的修改。

有没有办法告诉 Git 这些修改不要提交,但让我知道是否有任何其他更改?虽然恐怕不存在需要另一种索引来放置这些“不想暂存此更改”版本文件的情况,但如果有类似的情况,请告诉我。

hlo*_*dal 5

我有一些已更改,但我不想提交,只需将其按原样保留在工作目录中即可。...有没有办法告诉 Git 这些修改不要提交,但让我知道是否有任何其他更改?

您需要接受临时提交!

您绝对应该在分支上签入这些临时更改,同时将其作为单独的临时提交进行处理(并使用明确表明它们是临时的提交消息)。然而,稍后,当完成分支上的工作时,可以删除这些临时提交。

假设您关心的更改是各种调试打印语句(使用printf_logger.infoconsole.log任何适当的日志记录机制),分布在多个文件中的各处。

  • 公理 1:在处理某些功能时添加此类临时打印语句是完全正常的。
  • 公理 2:不希望这些临时打印语句污染项目的历史记录是件好事。

但不为这些临时更改创建提交是错误的,因为

  • 公理 3:处理此类临时更改的唯一明智方法是将它们作为临时提交签入 git !

作为一个例子,假设您一直在努力添加一些foo功能,对bar 进行了一些修改,现在准备完成工作。您已经创建了几个临时提交(全部以字符“====” 1开头和结尾),因此要删除这些临时提交,您需要启动交互式变基并显示以下列表:

pick 10001 Started implementing foo
pick 10002 ==== debug foo ====
pick 10003 Finished implementing foo
pick 10004 Improved bar
pick 10005 ==== debug bar ====
pick 10006 ==== more foo debug ====
pick 10007 Removed unused baz
pick 10008 ==== more bar and foo debug ====
Run Code Online (Sandbox Code Playgroud)

削减到以下内容很简单:

pick 10001 Started implementing foo
pick 10003 Finished implementing foo
pick 10004 Improved bar
pick 10007 Removed unused baz
Run Code Online (Sandbox Code Playgroud)

满足公理 2。

如果你没有不断地重写 git 中的(本地)历史记录,那么你的 git 操作就是错误的。

如果您将提交和分支视为不可变对象,那么您就错过了 git 的绝大多数好处。

将临时更改作为临时提交进行签入的好处有很多:

  • 没有任何突出的更改阻止您切换到不同的分支。
  • 它们可以被精心挑选。
  • 它们可以重新定位。
  • 可以使用 git revert 快速暂时禁用它们。
  • 它们可以通过交互式变基快速删除(例如,您不再需要 foo 调试消息,但希望保留 bar 调试)。
  • 它们最终可以与其他人共享(他们只需要注意您的命名约定)。
  • 没有 git repo 特定配置。
  • 例如,稍后运行 git bisect 时,您可以使用调试打印语句。
  • 它们与git log和中的其他提交具有相同的可见性gitk

因此,您不需要“另一种索引”,事实上临时提交是并且应该被视为正常提交。唯一的“特殊”处理是使提交消息足够不同,使它们作为临时提交脱颖而出,并在最后通过交互式变基过滤掉它们。

但是交互式变基过程中发生冲突怎么办?

使用我的脚本git-resolve-conflict-using-kdiff3KDiff3自动解析在更改的上方/下方行旁边删除的行(如果需要手动解决冲突,KDiff3 也是一个很棒的工具)。


1您可以使用任何您想要的指标,“====”只是一个建议。在进行交互式变基时,它只需要在提交列表中清楚地脱颖而出即可。