恢复早期状态,保持未跟踪的文件

时间:2011-08-17 12:50:53

标签: git

我需要将本地计算机中的所有文件还原到早期版本,并按原样保留未跟踪的文件。我找到了这个Rollback file to much earlier version using Git并且先做了

git reset <hash>

我的文件仍然和以前一样,所以我做了

git checkout <hash>

这也无济于事。 然后我注意到git log没有显示修改后的修订版。

我很困惑该怎么办恢复早期修订的状态,有什么建议吗?

1 个答案:

答案 0 :(得分:10)

resetcheckout命令都有多种含义,具体取决于参数,含义略有不同。

  • 复位:
    • with revision参数:将当前分支设置为指向指定的修订版本:
      • reset --soft <rev>:保留索引和文件原样
      • reset --mixed <rev>(这是rev的默认值):使索引反映修订时的状态,但文件保持不变
      • reset --hard <rev>:使用指定修订版的状态覆盖索引和文件。
    • with path参数:使索引包含指定文件的已检入内容,但不更改磁盘上的文件(= undoes git add)。
  • 结帐:
    • with revision参数:切换到指定的分支或修订,但保留本地修改。如果某个文件被修改并且当前HEAD与指定的修订版本不同,则拒绝运行。
    • with path参数:修改指定的文件以匹配索引,即还原un 添加的更改。

由此得出:

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>获取工作树内容。