我不小心用git add -A添加了很多临时文件
我设法使用以下命令取消文件,并设法删除脏索引。
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
以上命令在git帮助rm中列出。但遗憾的是,我的文件在执行时也被删除了,即使我给了缓存选项。如何在不丢失内容的情况下清除索引?
此外,如果有人能解释这个管道操作的工作方式,这将是有帮助的。
我不小心用git add -A添加了很多临时文件
我设法使用以下命令取消文件,并设法删除脏索引。
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
以上命令在git帮助rm中列出。但遗憾的是,我的文件在执行时也被删除了,即使我给了缓存选项。如何在不丢失内容的情况下清除索引?
此外,如果有人能解释这个管道操作的工作方式,这将是有帮助的。
当前回答
使用git reset HEAD重置索引而不删除文件。(如果你只想重置索引中的一个特定文件,你可以使用git reset HEAD——/path/to/file来这样做。)
在shell中,管道操作符从左边的进程中获取标准输出,并将其作为标准输入传递给右边的进程。它本质上相当于:
$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out
但是它是$ proc1 | proc2,第二个进程可以在第一个进程输出数据之前开始获取数据,并且不涉及实际的文件。
其他回答
去重置
如果你只想撤销一个过度热心的“git add”运行:
git reset
您的更改将被取消,并准备好供您重新添加。
不要运行git重置——很难。
它不仅会取消您添加的文件,还会恢复您在工作目录中所做的任何更改。如果你在工作目录中创建了任何新文件,它不会删除它们。
如果你想取消所有的更改使用下面的命令,
git reset --soft HEAD
如果您想取消阶段更改并从工作目录恢复它们,
git reset --hard HEAD
2019年更新
正如其他人在相关问题中指出的(参见这里,这里,这里,这里,这里,这里,这里和这里),你现在可以用git restore—staging <file>取消文件的阶段。
要取消项目中的所有文件,从存储库的根目录运行以下命令(该命令是递归的):
git restore --staged .
如果你只想取消一个目录中的文件,在运行上述操作之前导航到它或运行:
git restore --staged <directory-path>
笔记
git restore was introduced in July 2019 and released in version 2.23. With the --staged flag, it restores the content of the working tree from HEAD (so it does the opposite of git add and does not delete any change). This is a new command, but the behaviour of the old commands remains unchanged. So the older answers with git reset or git reset HEAD are still perfectly valid. When running git status with staged uncommitted file(s), this is now what Git suggests to use to unstage file(s) (instead of git reset HEAD <file> as it used to prior to v2.23).
使用git reset HEAD重置索引而不删除文件。(如果你只想重置索引中的一个特定文件,你可以使用git reset HEAD——/path/to/file来这样做。)
在shell中,管道操作符从左边的进程中获取标准输出,并将其作为标准输入传递给右边的进程。它本质上相当于:
$ proc1 > proc1.out
$ proc2 < proc1.out
$ rm proc1.out
但是它是$ proc1 | proc2,第二个进程可以在第一个进程输出数据之前开始获取数据,并且不涉及实际的文件。
git stash && git stash pop