我想将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
谢谢
我想将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
谢谢
git reset --hard C
git reset --soft D
首先,你需要将 HEAD
、索引和工作目录重置为 C
。
然后,你需要将 HEAD
重置为 D
(只重置 HEAD
,这与 "git reset --soft 的实用用途" 中所解释的一样)。
请注意,在此时进行提交将创建一个具有 C
内容的新提交,将 D
替换为看起来像 C
的 D'
。
这将改变历史记录,与简单的 git reset --hard C
没有太大区别。
另一种选择是在 D
之上使用 git revert C
,但是 D
仍将出现在历史记录中,这可能不是你想要的。
D
不会被替换(据我所见)。另外 reset --hard
会删除所有工作树更改(但可能是必要的)。 - knittlVonC的答案需要您执行一个回合旅程。 您可以通过单个“git checkout”实现相同的效果。
git checkout C ./
请注意,您必须提供./
,否则git将实际检出指定的分支或提交。
如果需要脚本化此操作,相关的管道命令如下:
git read-tree C
git checkout-index -f -a
git update-index -q --refresh
git update-index -q --refresh
的那部分帮了我解决一个完全无关的问题。谢谢 :-) - JanC
的文件保留在索引中(read-tree
将它们放入索引中,而checkout-index
则更新工作树),而其他答案仅更改工作树。 - Scott McPeak
B
的顶部吗?你打算如何处理合并冲突? - Benjamin Banniergit checkout <commit> .
命令吗?请注意,此命令需要谨慎使用。 - knittl