然而,我只想撤消那个文件的工作副本更改,不涉及其他任何内容。
我该如何做到这一点?
你可以使用
git checkout -- file
你可以不使用--
(如nimrodm建议的),但如果文件名看起来像是分支或标签(或其他修订标识符),则可能会混淆,因此最好使用--
。
您还可以查看特定版本的文件:
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
只需要使用
git checkout filename
这将使用当前分支中的最新版本替换文件名。
警告:您的更改将被丢弃,不会保留备份。
git checkout x
,而 x 同时是一个分支名称和文件名,我不确定默认行为是什么,但我认为 git 会假定你想要切换到分支 x。当你使用 --
时,你表明接下来的内容是文件名。" - hasen--
删除。虽然仍然正确,但正如 @hasen 指出的那样,如果文件名和分支名称之间存在歧义,你可能会在这里得到非常不希望的行为! - BrainSlugs83git checkout <commit> <filename>
今天我使用了这个方法,因为我意识到在升级到 Drupal 6.10 时,我的网站图标(favicon)已经被覆盖了几次提交。所以我需要找回它。以下是我所做的:
git checkout 088ecd favicon.ico
git log --oneline <文件名>
可以提供更紧凑的日志,并且仅包括对特定文件所做的更改。 - rjmunrogit reset HEAD <file>
命令。git reset HEAD <file>
那么。git checkout <file>
如果还没有暂存,就使用以下命令:
git checkout <file>
在 Git 2.23 中引入了 restore
命令来实现这一点,我想这是为了让回答这类问题更加简单明了。
git restore [--] <pathspec>...
一如既往地,当文件名以破折号开头时可能需要使用--
。(与分支名称的混淆在这里不可能出现,因为restore
的范围不包括分支,不像全能的checkout
)
完整来说,restore
也可以使用--staged
还原已暂存的文件,并且可以使用--source=<tree>
从不同于HEAD
的提交中还原。
git restore .
- vicegax如果你只想撤销之前提交的对某个文件的更改,可以尝试这个命令:
git checkout branchname^ filename
这将检出文件,就像它在最后一次提交之前的样子。如果你想再回退几个提交,使用 branchname~n
标记。
这个答案是为了解决需要撤销同一或多个文件夹(或目录)中多个特定文件的本地更改而提供的命令。此答案特别针对一个用户有多个文件,但用户不想撤消所有本地更改的情况:
如果您有一个或多个文件,您可以将相同的命令 (
git checkout -- file
) 应用于每个文件,通过列出它们的位置并以空格分隔,如下所示:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
注意name1/name2/fileOne.ext和nameA/subFolder/fileTwo.ext之间的空格。
对于同一文件夹中的多个文件:
如果你需要放弃某个目录下所有文件的修改,可以使用如下的git checkout命令:
git checkout -- name1/name2/*
上述内容中的星号可以撤销name1/name2路径下所有文件的更改。
同样地,以下内容可以撤销多个文件夹中所有文件的更改:
git checkout -- name1/name2/* nameA/subFolder/*
请注意上述名称中的name1/name2/* nameA/subFolder/*之间的空格。
注:name1、name2、nameA、subFolder - 所有这些示例文件夹名称表示可能包含有关文件的文件夹或包。
git
的 bash
脚本:set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
git status
的状态为:$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
git checkout
命令,结果是这样的:$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
git reset
,则结果如下:$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
git reset
没有任何影响,而 git checkout
会覆盖更改。
git add b.txt
。git status
的输出为:$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
git checkout
命令,结果是这样的:$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
git reset
,结果如下:$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
git reset
将使分段更改变为未分段更改,而git checkout
会完全覆盖更改。git checkout <sha hash id> <file name>
。
git reset HEAD <filename> ; git checkout -- <filename>
- OlieHEAD^^
来获取最近两次提交,或者使用HEAD^^^
来获取最近三次提交。你也可以使用HEAD~2
或者HEAD~3
,如果你想要回退更多次提交的话,这样会更加方便。而HEAD^2
表示 "这个提交的第二个父提交";因为合并提交的缘故,一个提交可能有多个前置提交。所以在HEAD^
中使用数字来选择它们中的哪一个父提交,在HEAD~
中则始终选择第一个父提交,并进行相应的回退。有关更多详细信息,请参见git help rev-parse
。 - Brian Campbell