如何在不删除内容的情况下取消大量文件

sar*_*rat 425 git version-control

我不小心添加了很多临时文件 git add -A

我设法使用以下命令取消暂存文件,并设法删除脏索引.

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Run Code Online (Sandbox Code Playgroud)

上面的命令列在git help rm.但遗憾的是,我的文件在执行时也被删除了,即使我已经给出了缓存选项.如何在不丢失内容的情况下清除索引?

如果有人能解释这个管道操作的工作方式,也会有所帮助.

tiz*_*.io 929

git reset

如果你想要的是撤消一个过于热心的"git add"运行:

git reset
Run Code Online (Sandbox Code Playgroud)

您的更改将无法进行,并随时可以重新添加.


不要跑git reset --hard.

它不仅会取消暂存您添加的文件,还会还原您在工作目录中所做的任何更改.如果您在工作目录中创建了任何新文件,它将不会删除它们.

  • 我欠你一品脱伊恩 (12认同)

seh*_*ehe 33

如果你有一个原始的回购(或未设置HEAD)[1]你可以简单

rm .git/index
Run Code Online (Sandbox Code Playgroud)

当然,这需要你重新添加你的文件想加入.


[1]注意(如评论中所述)这通常只会在回购是全新的("原始")或没有提交时才会发生.更技术上,只要没有结账或工作树.

只是让它更清楚:)


pro*_*tos 20

2019年更新

正如其他人在相关问题中所指出的(请参阅此处此处此处此处此处此处此处),您现在可以使用 取消暂存文件git restore --staged <file>

要取消暂存项目中的所有文件,请从存储库的根目录运行以下命令(该命令是递归的):

git restore --staged .
Run Code Online (Sandbox Code Playgroud)

如果您只想取消暂存目录中的文件,请在运行上述命令之前导航到该目录或运行:

git restore --staged <directory-path>
Run Code Online (Sandbox Code Playgroud)

笔记

  • git restore于2019 年 7 月推出,并在 2.23 版本中发布。
    使用该--staged标志,它从 HEAD 恢复工作树的内容(因此它执行相反的操作git add并且不删除任何更改)。

  • 这是一个新命令,但旧命令的行为保持不变。git reset因此,带有或 的旧答案git reset HEAD仍然完全有效。

  • 当使用git status暂存的未提交文件运行时,Git 现在建议使用此方法来取消暂存文件(而不是像git reset HEAD <file>v2.23 之前那样)。


Amb*_*ber 15

使用git reset HEAD不删除文件重置索引.(如果您只想重置索引中的特定文件,则可以使用git reset HEAD -- /path/to/file此方法.)

管道操作符在shell stdout中从左侧获取进程,并将其传递stdin给右侧的进程.它基本上相当于:

$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out
Run Code Online (Sandbox Code Playgroud)

但是相反$ proc1 | proc2,第二个进程可以在第一个进程输出数据之前开始获取数据,并且不涉及实际文件.

  • 只需键入`git reset HEAD`而不指定任何其他内容,它将重置整个索引.然后,您只需重新添加所需的文件即可. (3认同)

Bij*_*jan 9

git stash && git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 我会做'git stash && git stash pop'以便隐藏也被删除.'apply'会将藏匿处留在藏匿列表中. (2认同)

jjl*_*lin 8

如果未设置HEAD,您也可以这样做

git rm -rf --cached .
Run Code Online (Sandbox Code Playgroud)

展开一切.这实际上与sehe的解决方案相同,但避免与Git内部结合.


SQB*_*SQB 5

警告:除非您想丢失未提交的工作,否则请勿使用以下命令!

使用git reset已经解释过了,但你也要求对管道命令进行解释,所以这里有:

git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Run Code Online (Sandbox Code Playgroud)

该命令git ls-files列出了git知道的所有文件.该选项-z对它们施加特定格式,即期望的格式xargs -0,然后调用rm -f它们,这意味着删除它们而不检查您的批准.

换句话说,"列出git知道并删除本地副本的所有文件".

然后我们进入git diff,它显示了git知道的不同版本的项目之间的变化.这些可以是不同树之间的更改,本地副本和远程副本之间的差异,等等.
如此处所示,它显示了未分级的变化; 您已更改但尚未提交的文件.该选项--name-only意味着您只需要(完整)文件名,这--diff-filter=D意味着您只对已删除的文件感兴趣.(嘿,我们不是只删除了一堆东西吗?) 然后通过管道进入xargs -0我们之前看到的,它们会调用git rm --cached它们,这意味着它们会从缓存中删除,而工作树应该保持不变 - 除了那个您刚刚从工作树中删除了所有文件.现在它们也从索引中删除了.

换句话说,所有已暂存或未暂存的更改都将消失,并且您的工作树为空.哭泣,从原产地或远程检查你的文件,并重做你的工作.诅咒写下这些地狱线的虐待狂; 我不知道为什么有人想要这样做.


TL; DR:你只是灌输了一切; 重新开始并git reset从现在开始使用.


归档时间:

查看次数:

204500 次

最近记录:

7 年,2 月 前