我想将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
由于
答案 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 C
会D
,但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