重置Git以在不将HEAD更改为分离状态的情况下提交

时间:2012-12-15 21:10:55

标签: git

我想将git工作副本的文件恢复到给定的提交,而不将该提交设置为HEAD提交。

如果我git checkout到给定的提交,我获得一个分离的HEAD,并在提交更改后,提交树看起来像:

A
|
B
|
C  
| \
D  E

虽然我想获得的行为是:

A
|
B
|
C
|
D
| <- git command so my files are restored to C, but my HEAD still points to D
E

由于

3 个答案:

答案 0 :(得分:16)

这应该这样做:

git reset --hard C
git reset --soft D

首先,您将HEAD,索引和工作树重置为C 然后,您重置HEAD(仅HEAD},如“Practical uses of git reset --soft?”中所述,重置为D

请注意,此时提交会创建一个包含C内容的提交,将D替换为D',如C
这改变了历史,与简单的git reset --hard C没什么不同。

另一个选项git revert CD,但D仍会在历史记录中显示,这可能是您不想要的。

答案 1 :(得分:13)

VonC回答要求您进行往返。你可以用一个'git checkout'来实现同样的目标

git checkout C ./

请注意,您必须提供./,否则git将实际检出指定的分支或提交。

答案 2 :(得分:4)

这方面的管道命令(适用于编写此类内容的任何人)是:

git read-tree C
git checkout-index -f -a

虽然由于某些原因我无法理解,但是当我从脚本运行时,我还必须在上述命令之后执行以下操作,否则我收到有关不适用于索引的补丁的错误:

git update-index -q --refresh