【问题标题】:Reset Git to commit without changing HEAD to detached state重置 Git 以提交而不将 HEAD 更改为分离状态
【发布时间】:2012-12-15 21:10:54
【问题描述】:

我想将 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

谢谢

【问题讨论】:

  • 不会在C 之上提交,而不是B?您打算如何处理合并冲突?
  • 不确定您真正想要实现的目标,也不确定您将如何处理合并冲突/工作树更改,但您是否尝试过git checkout &lt;commit&gt; .
  • 是的,它应该挂在 C 上,我的错。我会编辑这个问题。我的意图是用提交“C”中的文件替换我工作区的所有文件,WHITOUT 将 C 设置为我的头部提交。如果将“C”设置为我的 HEAD 提交,它将处于分离的头部状态。

标签: git


【解决方案1】:

应该这样做:

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 仍会在历史记录中可见,这可能是您不想要的。

【讨论】:

  • Commit D 不会被替换(据我所知)。 reset --hard 也将删除任何工作树更改(但这可能是必要的)
  • 没错。像魅力一样工作。
  • 太棒了!正是我需要从另一个分支取回变更集作为另一个分支的工作树中的未分级增量。
【解决方案2】:

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

git checkout C ./

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

【讨论】:

  • @JamesJohnston:这个答案不处理文件在分支 C 中被删除或移动的情况,它只是将它们留在那里。
【解决方案3】:

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

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

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

git update-index -q --refresh

【讨论】:

  • 刚才关于git update-index -q --refresh 的部分帮了我一些完全不相关的事情。谢谢:-)
  • 不错。请注意,这会将来自C 的文件留在索引中(read-tree 将它们放入索引中,checkout-index 更新工作树),而其他答案仅更改工作树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2020-04-29
  • 2015-03-03
  • 2023-03-28
  • 2019-11-27
  • 2014-03-17
  • 1970-01-01
相关资源
最近更新 更多