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


当前回答

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

git checkout eb917a1 YourFileName

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

git reset HEAD YourFileName
git checkout YourFileName

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

其他回答

假设你想要的承诺的哈希是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 到 HEAD. 您也可以:

git checkout HEAD^ foo

一次重新审查等。

git revert <hash>

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

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

git checkout ref♰commitHash -- filePath

吉。

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

下面是Rebase如何工作:

git checkout <我的分支> git rebase 主 git checkout 主 git merge <我的分支>


假设你有

───────────────────

... 查看你想向大师分支申请的变革分支。 退缩命令从 <我的分支>(不在大师中找到)采取命令,并将其重新应用到大师的头部。 换句话说,在 <我的分支>中的第一个命令的父母不再是大师历史中的先前命令,而是当前大师的头部。

git rebase master <my branch>

这可能更容易记住这个命令,因为“基础”和“修改”分支都明确。

历史的最终结果是:

────────────────────


git checkout master
git merge <my branch>

...做一个快速前进的合并,将所有 <我的分支> 变更应用于主人. 没有这个步骤,退缩承诺不会添加到主人. 最终结果是:

───────────────────

git branch -d <my branch>