反转git reset --soft

时间:2016-09-04 11:56:40

标签: git

git reset --soft将保留您当前的更改,但将HEAD移至另一个提交。

我正在寻找此操作的反转,以便HEAD保持静止,但所有文件的状态将设置为与commit CommitX中相同。

我找到了解决方法:

git diff --no-prefix HEAD..CommitX | patch -p0

但我想知道是否有一个简单的git命令来做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以使用git read-tree命令将特定树读入索引。使用-m -u选项,它还将更新工作目录。

git read-tree -m -u CommitX

答案 1 :(得分:0)

git read-tree -m -u的替代方法是git read-tree --reset -u,它已记录在Git 2.22(2019年第二季度)中,如果“所有文件的状态都设置为与提交{{ 1}}”包括合并提交。

请参见commit b5a0bd6Nguyễn Thái Ngọc Duy (pclouds)(2019年4月1日)。
(由Junio C Hamano -- gitster --commit 87e20f8中合并,2019年4月22日)

  

CommitX:阐明read-tree.txt和工作树更改

--reset的描述适用于第一个实现 438195c(git-read-tree:添加“ --reset”标志,2005-06-09,Git v0.99)。
也就是说, --reset丢弃未合并的条目
或至少对提交消息正确,因为我不确定读取树在本地更改方面的行为。

  

但是在fcc387d--reset中:请勿覆盖或删除未跟踪的   工作树文件。,2006年5月17日,Git v1.4.0-rc1),很明显“ read-tree -m -u”会尝试保留本地更改,而-m -u会被选中并会继续覆盖   工作树文件。
  提交消息中没有对此进行说明,但是从补丁中可以明显看出。

     

我之所以走得这么远,并不是因为我有很多空闲时间,而是因为我不相信我对unpack-trees.c代码的阅读。到目前为止,我认为   历史的相关变化与我对当前的理解相吻合   代码“ --reset”丢失本地更改。

     

--reset中未提及此行为,即使   旧时可能只是根据“重置”名称来猜测它。
  更新git-read-tree.txt

     

旁注。关于git-read-tree.txt的另一项变化不是   很明显是关于局部变化的,b018ff6(解包树:使用冲突索引修复“ --reset”,2012-12-29,Git v1.8.5.2)。
  但是我很确定这与read-tree -u --reset A B的第一个功能有关,可以正确丢弃未合并的条目。

所以documentation now states

--reset
     

`--reset`: 相同,只是未合并的条目将被丢弃而不是失败。
  与-m一起使用时,导致丢失工作树更改的更新不会中止该操作。