给定一个带有一些提交的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感动。
答案 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
而不更改任何文件。
此方法的优点是您不处于分离头状态,B
和C
之间的所有差异只会显示为上次实际提交的反向差异。你仍然会在原来的分支上。
您可能必须将C
指定为SHA-1而不是引用名称,除非您专门为此目的创建了一个。
答案 2 :(得分:2)
只需使用git checkout
:
$ git checkout HEAD~
$ # Or
$ git checkout HEAD^
$ # Or
$ git checkout B
这将使您进入一个分离的头部状态,其中HEAD与分支分离。