如何使用git撤消所有空格更改

Luc*_*jer 38 git

我有一个git repo,我在本地替换了很多文件.

git status现在显示许多修改过的文件.

有些是"真正修改过",有些只是因行结尾而有所不同.

我希望那些只有行结尾不同的东西消失(git重置它们),但我似乎无法找到linux-piping-foo来实现它.

关于如何删除唯一区别为可执行位的文件的奖励要点.

Ari*_*zis 46

这样做:

  git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| xargs git checkout HEAD --
Run Code Online (Sandbox Code Playgroud)
  1. 针对索引运行工作副本的diff,并为每个文件提供机器可读的摘要,忽略空格中的更改.
  2. 找到根据没有变化的文件diff -b.
  3. 取他们的名字.
  4. 将它们传递到git checkout分支尖端.

这个管道将为你离开的每个步骤做一些合理的事情,所以你可以从第一行开始,然后添加更多以查看每一步发生的事情.

一个可能有用的替代最后一行:

| git checkout-index --stdin
Run Code Online (Sandbox Code Playgroud)

这会将文件重置为其暂存内容而不是其上次提交状态.

您可能还希望git diff HEAD在第一行使用,以获得针对上次提交而不是针对索引的工作副本的差异.


注意:如果您的文件名中包含空格,则首先需要添加tr:

  git diff -b --numstat \
| egrep $'^0\t0\t' \
| cut -d$'\t' -f3- \
| tr '\n' '\0' \
Run Code Online (Sandbox Code Playgroud)

然后,您必须将-0/ -zswitch 添加到您想要使用的最终命令:

| xargs -0 git checkout HEAD --
# or
| git checkout-index --stdin -z
Run Code Online (Sandbox Code Playgroud)


Yus*_*hio 9

虽然看起来您最初是在寻找基于管道的解决方案并且是从 @aristotle-pagaltzis 那里得到的,但由于它有点难以记住,我认为这种替代方案值得注意:

git diff -b > gitdiffb
git stash  # or git reset --hard if you feel confident
git apply --ignore-space-change gitdiffb
Run Code Online (Sandbox Code Playgroud)

如果不仅更改空白数字,而且还应忽略全新或完全删除的空白,请替换-b-w.

结果与基于管道的解决方案不同,即使在也包含相关更改的文件中删除空白更改也是如此。因此,这与您描述的方式不完全相同,但对于通过搜索引擎来到这里的大多数人来说,可能更愿意寻找这一点。

  • 这是更好的答案:没有黑魔法,没有额外的工具,可以在任何平台上工作。 (3认同)