我如何将修改的文件转换为以前的修订,在一个特定的 commit hash (我通过 git log 和 git diff 确定)?


当前回答

git checkout ref♰commitHash -- filePath

吉。

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

其他回答

但是,请注意, git checkout./foo 和 git checkout HEAD./foo 并不完全相同; 案例在点:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(第二个添加步骤是指数中的文件,但它不会被承诺。

Git checkout./foo 是指从指数中转向./foo 路径; 添加 HEAD 指示 Git 将指数中的路径转向其 HEAD 修订之前。

如果您想要将文件转换为以前的承诺(并且您想要转换已承诺的文件),您可以使用

git checkout HEAD^1 path/to/file

git checkout HEAD~1 path/to/file

然后,只是步行,并采取“新”版本。

武装着一个承诺可以有两个父母在合并的情况下,你应该知道,头1是第一个父母,头1是第二个父母。

或者它会工作,如果树上只有一个父母。

要转到文件的先前命令版本,请获取命令号,然后说EB917a1

git checkout eb917a1 YourFileName

如果你只需要回到最后的承诺版本

git reset HEAD YourFileName
git checkout YourFileName

这只会带你到文件的最后一个承诺状态。

对我来说,没有一个答案看起来很清楚,所以我想添加我的,看起来很容易。

我有一个承诺 abc1 之后我做了几个(或一个修改)到一个文件 file.txt。

1.git checkout file.txt : 这将删除本地变更,如果你不需要它们

2.git checkout abc1 file.txt : 这将使您的文件到您想要的版本

3.git commit -m “Restored file.txt to version abc1” : 这将承诺您的转换。

git push : 这将把一切推到远程存储库中

在步骤2和3之间,当然,你可以做 git 状态来了解正在发生的事情。 通常你应该看到 file.txt 已经添加了,这就是为什么不需要添加 git。

有趣的是, git checkout foo 如果工作副本在一个名为 foo 的目录中工作,则不会工作;但是, git checkout HEAD foo 和 git checkout./foo 都会:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo