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


当前回答

使用 git log 获取特定版本的 hash 密钥,然后使用 git checkout <hashkey>。

注意:不要忘了在最后一个之前输入哈希,最后一个哈希标记了您的当前位置(头部)并不会改变任何东西。

其他回答

假设你想要的承诺的哈希是c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

git checkout man 页面提供更多信息。

如果你想在 c5f567 之前返回承诺,添加 ~1 (在 1 是你想返回的承诺的数量,它可以是任何东西):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

作为一个侧面注意事项,我一直对这个命令不舒服,因为它用于普通事物(分支之间的变化)和不寻常的破坏性事物(工作目录的变化)。


有一个新的 git 恢复命令,它是专门设计的恢复工作复制文件已被修改。 如果你的 git 足够新,你可以使用这个命令,但文档来了一个警告:

这个命令是实验性的,受害者可能会改变。

git-aliases, awk 和 shell 功能到救援!

git prevision <N> <filename>

在 <N> 是对 <filename> 文件进行回复的文件修订的数量. 例如,要检查单个文件 x/y/z.c 的即时以前修订,请运行

git prevision -1 x/y/z.c

GIT预测是如何工作的?

将以下内容添加到您的 gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

命令基本上在指定的文件上执行一个 git 登录,并在文件历史中查定适当的 commit-id,并执行指定的文件的 commit-id 的 git 支票。

基本上,每个人都会在这种情况下手动做的一切,包装在一个美丽而高效的吉特阿利亚 - 吉特预测

这里有很多建议,主要沿着 git checkout $revision - $file 的线条。

git show $revision:$file > $file

而且,我使用这个很多只是暂时看到一个特定的版本:

git show $revision:$file

git show $revision:$file | vim -R -

(OBS: $ 文件需要预定为./ 如果它是 git 显示 $ 修订的相对路径: $ 文件工作)

更奇怪的是:

git archive $revision $file | tar -x0 > $file
git revert <hash>

它听起来像你认为 git revert 只会影响最新的承诺。

它不会解决你的问题,如果你想转换一个更改在一个特定的文件,并承诺更改超过该文件。

但是,请注意, 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 修订之前。