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


当前回答

假设你想要的承诺的哈希是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 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

如果你曾经有一个版本的文件在承诺 $ A,然后后来做了两个不同的承诺 $ B 和 $ C (所以你正在看到的是第三个字符串的文件),如果你说“我想要返回第一个”,你真的意味着吗?

如果你想摆脱第二个和第三个 iteration 的变化,这是非常简单的:

$ git checkout $A file

命令要求“我想检查由命令A记录的状态的文件”。

另一方面,你指的是摆脱改变的第二个 iteration(即承诺 $B)引入,同时保持什么承诺 $C 做到文件,你会想转换 $B。

$ git revert $B

請注意,任何人創建的承諾 $ B 可能沒有非常規律,並可能在同一承諾中進行了完全無關的變化,而這個逆轉可能會觸摸其他檔案,而不是檔案,你會看到有害的變化,所以你可能想仔細檢查結果,然後做到這一點。

这里是我的路。

在 Android Studio 中,打开文件。

(b) git -> 显示历史,找到我要转向的以前的承诺。

c) git checkout commit_id file_path

这里的许多答案声称要使用 git reset... <file> 或 git checkout... <file> 但这样做,你会放弃每一个修改的 <file> 承诺后承诺你想转换。

如果你想重新转换一个承诺的单一文件的变更,就像 git revert 会做的,但只为一个文件(或说一个承诺文件的子组),我建议使用 git diff 和 git 应用的类似(与 <sha> = 承诺的哈希你想重新转换) :

git diff <sha>^ <sha> path/to/file.ext | git apply -R

基本上,它将首先产生与你想要逆转的变更相匹配的插件,然后逆转应用插件,以放下这些变更。

当然,它不会工作,如果逆转的线条是由 <sha1> 和 HEAD (冲突) 之间的任何承诺改变。

这对我工作:

git checkout <commit hash> file

接下来的改变:

git commit -a