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

jje*_*jei 2 git

我需要将本地计算机中的所有文件还原到早期版本,并按原样保留未跟踪的文件.我使用Git找到了这个Rollback文件到更早的版本并且先做

git reset <hash>
Run Code Online (Sandbox Code Playgroud)

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

git checkout <hash>
Run Code Online (Sandbox Code Playgroud)

这也没有帮助.然后我注意到git log没有显示修改后完成的修订.

我很困惑该怎么做恢复早期修改的状态,任何建议?

Jan*_*dec 10

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

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

它遵循:

git reset <rev>
git checkout <rev>
Run Code Online (Sandbox Code Playgroud)

等同于

git reset --mixed <rev>
Run Code Online (Sandbox Code Playgroud)

并且不会修改磁盘上的状态.你应该做的任何一件事:

git reset --hard <rev>
Run Code Online (Sandbox Code Playgroud)

要么

git checkout <rev>
Run Code Online (Sandbox Code Playgroud)

第一个将修改当前分支指向的位置,而后者将切换分支.也不会触及非版本化文件.

如果你这样做了

git reset <rev>
Run Code Online (Sandbox Code Playgroud)

已经想要的效果了

git reset --hard <rev>
Run Code Online (Sandbox Code Playgroud)

跟进吧

git checkout .
Run Code Online (Sandbox Code Playgroud)

(pathspec表单而不是修订表单).

更新:请注意

git reset --hard <rev>
Run Code Online (Sandbox Code Playgroud)

将使当前分支指向<rev>,所以它将像<rev>从未发生过的提交.这被称为"倒带",如果某人已经在分支上开展自己的工作,将会造成一些麻烦,因为他们的历史仍然会有这些修改.如果您想要创建一个撤消所有更改的新提交<rev>,您可以执行以下操作:

git revert <rev>..
Run Code Online (Sandbox Code Playgroud)

此命令创建一个新提交,撤消在指定的提交中完成的所有更改.它无法还原合并.要在合并之前恢复到修订内容并保留历史记录,您可以尝试:

git reset --mixed <rev>
git reset --soft HEAD@{1}
git commit
Run Code Online (Sandbox Code Playgroud)

第一次重置将移动HEAD 索引,第二次重置将返回HEAD到之前一次操作的位置,因此在此之后你有索引<rev>和HEAD返回原来的位置.所以你现在可以提交.操作将保持工作树不变.您可以在git checkout .之后,或者只是进行第一次重置--hard以获取工作树内容<rev>.