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

时间:2012-12-10 00:01:24

标签: git

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

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

5 个答案:

答案 0 :(得分:24)

如果您的更改未上演

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

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

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

git checkout .

如果您的更改已暂存

通过执行git reset --mixed取消暂停您的更改,然后从此答案的顶部继续。请注意,mixed是默认模式,可以省略。

答案 1 :(得分:2)

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

$ git config --global core.autocrlf true

并在Mac和Linux上将core.autocrlf设置为input

$ git config --global core.autocrlf input

有更多信息here(向下滚动到标题为 core.autocrlf 的部分)。

答案 2 :(得分:2)

如果您的更改已提交

(可能有一种更聪明的方法,但这对我有用)

mybranch=master
git checkout -b tmp origin/master

# compute the non-ws diff to mybranch and apply it
git diff -U0 -w --no-color $mybranch | git apply -R --cached --ignore-whitespace --unidiff-zero -

git commit -m "non ws changes"
git reset --hard  # discard all non-staged data

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

git checkout $mybranch
git reset --hard tmp
git branch -D tmp

答案 3 :(得分:0)

另一种方法是在unix上使用dos2unix命令或(将Windows pc作为特殊安装)转换行尾并提交并压入

答案 4 :(得分:0)

rumpel's answer是适合我的解决方案。我只想完成一点:

如果您的更改已被推送

一旦您遵循了rumpel的程序,请勿再次在分支机构上推送。 Github会要求您先拉,然后您将再次获得每个空格差异。而是从当前分支创建一个新分支,然后推送新分支:

# From $mybranch
git checkout -b $mybranch-v2
git push --set-upstream origin $mybranch-v2

然后在GitHub上关闭并删除$ mybranch