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

Jos*_*pez 16 git

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

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

A
|
B
|
C  
| \
D  E
Run Code Online (Sandbox Code Playgroud)

虽然我想获得的行为是:

A
|
B
|
C
|
D
| <- git command so my files are restored to C, but my HEAD still points to D
E
Run Code Online (Sandbox Code Playgroud)

谢谢

Von*_*onC 17

这应该这样做:

git reset --hard C
git reset --soft D
Run Code Online (Sandbox Code Playgroud)

首先,您将HEAD索引和工作树重置为C.
然后你重置HEAD(并且只有HEAD,如" 实际用途git reset --soft "中所述)D.

请注意,此时提交将创建一个包含内容的提交C,替换DD'类似的内容C.
这改变了历史,与简单的差别不大git reset --hard C.

另一种选择可以在历史git revert CD,但D仍然可以在历史中看到,这可能是你不想要的.


Wil*_*eer 16

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

git checkout C ./

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

  • @JamesJohnston:这个答案不处理在分支 C 中删除或移动文件的情况,它只是将它们留在那里。 (3认同)

joa*_*him 5

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

git read-tree C
git checkout-index -f -a
Run Code Online (Sandbox Code Playgroud)

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

git update-index -q --refresh
Run Code Online (Sandbox Code Playgroud)