21

I'd like to restore the files of the git working copy to a given commit, without setting that commit as the HEAD commit.

If I git checkout to a given commit I obtain a detached HEAD, and after commiting changes, the commit tree would look something like:

A
|
B
|
C  
| \
D  E

While the behaviour I'd like to obtain is:

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

Thanks

4

3 回答 3

25

这应该这样做:

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

首先,您将HEAD、 index 和 worktree 重置为C.
然后你重置HEAD(并且只有HEAD,如“实际用途git reset --soft ”中所述)到D.

请注意,此时的提交将创建一个带有内容的提交C,替换D为. 这改变了历史,与简单的.D'C
git reset --hard C

另一个选项将git revert C在 之上D,但D仍会在历史记录中可见,这可能是您不想要的。

于 2012-12-16T01:31:15.833 回答
23

VonC 答案要求您进行往返。您可以使用单个“git checkout”来实现相同的目标

git checkout C ./

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

于 2015-08-01T01:31:50.883 回答
6

为此(对于编写此类脚本的任何人)的管道命令是:

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

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

git update-index -q --refresh
于 2016-12-22T15:35:12.900 回答