如何在不移动HEAD的情况下重置工作树?

时间:2016-10-17 20:31:24

标签: git

给定一个带有一些提交的git分支(C是最近的提交):

A -> B -> C

如何重置我的工作区以使所有文件都处于提交B的状态,但HEAD仍在C?

我看过git-reset,但没有一个选项似乎有帮助。手册页建议所有不同的模式都会移动HEAD:

--soft
   Does not touch the index file or the working tree at all 
   (but resets the head to <commit>, just like all modes do).

我已经尝试git reset HEAD~,但这会让HEAD感动。

3 个答案:

答案 0 :(得分:8)

  

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...

     

git checkout with <paths>--patch用于从索引中恢复其原始内容的已修改或已删除路径,或者使用来自命名<tree-ish>的内容替换路径(通常是commit-ish) )。

所以你需要在你的存储库的根目录下运行它(适用于任何子树或文件):

git checkout HEAD~ -- .

这将导致git应用将文件还原到HEAD~状态所需的更改,更改将在索引中。

答案 1 :(得分:3)

您可以使用硬重置和软重置的组合:

git reset --hard B
git reset --soft C

第一个会将HEAD移至B并使您的所有文件看起来像B。然后第二个将其移回C而不更改任何文件。

此方法的优点是您不处于分离头状态,BC之间的所有差异只会显示为上次实际提交的反向差异。你仍然会在原来的分支上。

您可能必须将C指定为SHA-1而不是引用名称,除非您专门为此目的创建了一个。

答案 2 :(得分:2)

只需使用git checkout

$ git checkout HEAD~
$ # Or
$ git checkout HEAD^
$ # Or
$ git checkout B

这将使您进入一个分离的头部状态,其中HEAD与分支分离。