通常,要放弃对文件的更改,您可以执行以下操作:
git checkout -- <file>
如果我想放弃的更改是删除文件,该怎么办?上面的一行将给予一个错误:
error: pathspec '<file>' did not match any file(s) known to git.
什么命令可以恢复单个文件而不撤消其他更改?
**加分:**另外,如果我想放弃的更改是 * 添加 * 一个文件怎么办?我也想知道如何改变这种变化。
8xiog9wr1#
假设你想撤销git rm <file>或rm <file>后跟git add -A或类似的效果:
git rm <file>
rm <file>
git add -A
# this restores the file status in the index git reset -- <file> # then check out a copy from the index git checkout -- <file>
要撤消git add <file>,假设您还没有提交,上面的第一行就足够了。
git add <file>
xxe27gdn2#
这两个问题都在git status中得到了回答。要取消暂存添加新文件,请使用git rm --cached filename.ext
git status
git rm --cached filename.ext
# Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: test
要取消暂存删除文件,请使用git reset HEAD filename.ext
git reset HEAD filename.ext
# Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: test
另一方面,git checkout --从不取消暂存,它只是丢弃未暂存的更改。
git checkout --
nnt7mjpx3#
如果它已暂存并提交,则以下操作将重置该文件:
git reset COMMIT_HASH file_path git checkout COMMIT_HASH file_path git add file_path
这将适用于几次提交前发生的删除。
a2mppw5e4#
从git v2.23开始,您有另一个选择:git restore --staged -- <file>
git restore --staged -- <file>
dgtucam15#
你的两个问题的答案是相关的。我从第二个开始:一旦你暂存了一个文件(通常使用git add,尽管其他一些命令也隐式暂存了更改,如git rm),你可以使用git reset -- <file>取消更改。在本例中,您必须使用git rm删除文件,这相当于简单地使用rm删除它,然后暂存更改。如果您首先使用git reset -- <file>取消暂存它,则可以使用git checkout -- <file>恢复它。
git add
git rm
git reset -- <file>
rm
7fyelxc56#
我尝试了上述方法,但仍然遇到了困难。我有其他文件与被意外删除的两个文件分期。要撤消两个已删除的文件,我不得不取消所有的文件:
git reset HEAD .
在这一点上,我能够做删除的项目的结帐:
git checkout -- WorkingFolder/FileName.ext
最后,我能够重新暂存其余的文件并继续提交。
flmtquvp7#
从手册页,
git-reset - Reset current HEAD to the specified state git reset [-q] [<tree-ish>] [--] <paths>... In the first and second form, copy entries from <tree-ish> to the index.
例如,当我们使用git reset HEAD~1时,它会将当前HEAD重置为HEAD~1所以当我们使用git reset 'some-deleted-file-path'时,git假设'some-deleted-file-path'为某个提交点,并尝试将当前HEAD重置到那里。最后以失败告终
git reset HEAD~1
git reset 'some-deleted-file-path'
fatal: ambiguous argument 'some-deleted-file-path': unknown revision or path not in the working tree.
6gpjuf908#
答案here已经解决了取消暂存特定文件删除的基本情况。但是,如果您不小心删除了许多文件,这些文件与您想要保留的更改混合在一起,您可以使用此命令管道:
git diff --staged --name-status | awk '$1=="D"{print $2}' | xargs git restore --staged --
第一部分git diff --staged --name-status显示所有阶段性更改,并使用字母标识更改类型。文件夹有一个“D”。如果状态字母(第一列)为“D”,则第二部分打印文件名。这有效地过滤了列表,只删除了分段删除。最后一行为每个删除的文件调用git restore --staged命令(其他答案已经指出了这一点)。请注意,restore需要git 2.23或更高版本,否则您将需要使用git reset和git checkout的组合(例如在this other answer中完成的)。有关git restore的详细说明,请参阅the git docs或this answer。
git diff --staged --name-status
git restore --staged
restore
git reset
git checkout
git restore
8条答案
按热度按时间8xiog9wr1#
假设你想撤销
git rm <file>
或rm <file>
后跟git add -A
或类似的效果:要撤消
git add <file>
,假设您还没有提交,上面的第一行就足够了。xxe27gdn2#
这两个问题都在
git status
中得到了回答。要取消暂存添加新文件,请使用
git rm --cached filename.ext
要取消暂存删除文件,请使用
git reset HEAD filename.ext
另一方面,
git checkout --
从不取消暂存,它只是丢弃未暂存的更改。nnt7mjpx3#
如果它已暂存并提交,则以下操作将重置该文件:
这将适用于几次提交前发生的删除。
a2mppw5e4#
从git v2.23开始,您有另一个选择:
git restore --staged -- <file>
dgtucam15#
你的两个问题的答案是相关的。我从第二个开始:
一旦你暂存了一个文件(通常使用
git add
,尽管其他一些命令也隐式暂存了更改,如git rm
),你可以使用git reset -- <file>
取消更改。在本例中,您必须使用
git rm
删除文件,这相当于简单地使用rm
删除它,然后暂存更改。如果您首先使用git reset -- <file>
取消暂存它,则可以使用git checkout -- <file>
恢复它。7fyelxc56#
我尝试了上述方法,但仍然遇到了困难。我有其他文件与被意外删除的两个文件分期。
要撤消两个已删除的文件,我不得不取消所有的文件:
在这一点上,我能够做删除的项目的结帐:
最后,我能够重新暂存其余的文件并继续提交。
flmtquvp7#
从手册页,
例如,当我们使用
git reset HEAD~1
时,它会将当前HEAD重置为HEAD~1所以当我们使用
git reset 'some-deleted-file-path'
时,git假设'some-deleted-file-path'为某个提交点,并尝试将当前HEAD重置到那里。
最后以失败告终
6gpjuf908#
答案here已经解决了取消暂存特定文件删除的基本情况。但是,如果您不小心删除了许多文件,这些文件与您想要保留的更改混合在一起,您可以使用此命令管道:
第一部分
git diff --staged --name-status
显示所有阶段性更改,并使用字母标识更改类型。文件夹有一个“D”。如果状态字母(第一列)为“D”,则第二部分打印文件名。这有效地过滤了列表,只删除了分段删除。
最后一行为每个删除的文件调用
git restore --staged
命令(其他答案已经指出了这一点)。请注意,restore
需要git 2.23或更高版本,否则您将需要使用git reset
和git checkout
的组合(例如在this other answer中完成的)。有关git restore
的详细说明,请参阅the git docs或this answer。