我需要将本地计算机中的所有文件还原到早期版本,并按原样保留未跟踪的文件。我找到了这个Rollback file to much earlier version using Git并且先做了
git reset <hash>
我的文件仍然和以前一样,所以我做了
git checkout <hash>
这也无济于事。 然后我注意到git log没有显示修改后的修订版。
我很困惑该怎么办恢复早期修订的状态,有什么建议吗?
答案 0 :(得分:10)
reset
和checkout
命令都有多种含义,具体取决于参数,含义略有不同。
reset --soft <rev>
:保留索引和文件原样reset --mixed <rev>
(这是rev的默认值):使索引反映修订时的状态,但文件保持不变reset --hard <rev>
:使用指定修订版的状态覆盖索引和文件。git add
)。由此得出:
git reset <rev>
git checkout <rev>
等同于
git reset --mixed <rev>
并且不会修改磁盘上的状态。你应该做的任何一个:
git reset --hard <rev>
或
git checkout <rev>
其中第一个将修改当前分支指向的位置,而后者将切换分支。也不会触及非版本化文件。
如果你做了
git reset <rev>
已经想要
的效果了git reset --hard <rev>
只需跟进
即可git checkout .
(pathspec表单而不是修订表单)。
更新:请注意,
git reset --hard <rev>
会使当前分支指向<rev>
,因此它就像<rev>
之后从未发生的提交一样。这被称为“倒带”,如果某人已经在分支上开展自己的工作,将会造成一些麻烦,因为他们的历史仍然会有这些修改。如果您想创建一个撤消自<rev>
以来所有更改的新提交,您可以执行以下操作:
git revert <rev>..
此命令创建一个新提交,撤消在指定的提交中完成的所有更改。它无法还原合并。要在合并之前恢复到修订内容并保留历史记录,您可以尝试:
git reset --mixed <rev>
git reset --soft HEAD@{1}
git commit
第一次重置将移动HEAD 和索引,第二次重置将返回HEAD到之前的一次操作,所以在此之后你有<rev>
的索引和HEAD返回它曾经在哪里。所以你现在可以提交。操作将保持工作树不变。您可以git checkout .
之后,或者只是首先重置--hard
以从<rev>
获取工作树内容。