使git撤消任何仅限空白的更改?

Sop*_*unk 16 git

有没有一种简单的方法可以自动对任何只有空格更改的文件进行git checkout?我正在处理从Eclipse运行的Windows和一些代码生成,所以我得到了新行更改和空白更改,这些更改阻碍了我的工作流程中的噪音,并且难以跟踪实际更改.

即使只是一种很好的方式来报告哪些文件有真正的变化而哪些不是一个开始,而不是必须为每个文件做一个diff -w

Ken*_*sen 37

如果您的更改未上演

要暂存不仅仅是空白更改的更改,您可以执行以下操作:

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

之后,要删除所有未分级的更改(仅在空格中有所不同的更改),您可以执行以下操作:

git checkout .

如果您的更改已上演

通过执行a git reset --mixed并从此答案的顶部继续来取消您的更改.请注意,这mixed是默认模式,可以省略.

  • 起初,这对我不起作用,因为我不在存储库的根目录中(尽管我认为不应该要求在根目录中)。因此,如果 `git apply` 没有做任何事情就返回成功 (0),请尝试转到存储库的根目录。 (2认同)
  • 这为我节省了十亿年......在我的例子中需要注意的是 - 它不会忽略添加/删除的完整空白行。要包含这一点,请将“--ignore-blank-lines”添加到差异中。 (2认同)

rum*_*pel 7

如果您的更改已提交

\n\n

(there\xe2\x80\x99s可能是一种更聪明的方法,但这对我有用)

\n\n
mybranch=master\ngit checkout -b tmp origin/master\n\n# compute the non-ws diff to mybranch and apply it\ngit diff -U0 -w --no-color $mybranch | git apply -R --cached --ignore-whitespace --unidiff-zero -\n\ngit commit -m "non ws changes"\ngit reset --hard  # discard all non-staged data\n
Run Code Online (Sandbox Code Playgroud)\n\n

您现在位于新的“tmp”分支上。您可能想要清理(注意:这会丢失历史记录$mybranch

\n\n
git checkout $mybranch\ngit reset --hard tmp\ngit branch -D tmp\n
Run Code Online (Sandbox Code Playgroud)\n


mip*_*adi 5

这很可能是行尾问题;Windows 使用 CRLF(回车 + 换行,或\r\n)换行符,而大多数其他系统使用 LF(换行,或\n)。幸运的是,Git 可以规范化文件,以便它们在 repo中始终存储为 LF,但在 Windows 上将作为 CRLF 检出。您可以通过在 Windows 上设置core.autocrlf为来执行此操作true

$ git config --global core.autocrlf true
Run Code Online (Sandbox Code Playgroud)

并在 Mac 和 Linux 上设置core.autocrlfinput

$ git config --global core.autocrlf input
Run Code Online (Sandbox Code Playgroud)

此处提供更多信息(向下滚动到标题为core.autocrlf的部分)。

  • 我知道*为什么*它这样做,并且我知道 core.autocrlf 并将其设置为 true 。这些事情都不容易丢弃代码生成所做的仅包含空格的更改(例如 GraniteDS 的插件即使在 Windows 上也会吐出 unix 换行符) (2认同)