git reset --soft
将保留您当前的更改,但将HEAD移至另一个提交。
我正在寻找此操作的反转,以便HEAD保持静止,但所有文件的状态将设置为与commit CommitX中相同。
我找到了解决方法:
git diff --no-prefix HEAD..CommitX | patch -p0
但我想知道是否有一个简单的git命令来做到这一点。
答案 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 b5a0bd6的Nguyễ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
的第一个功能有关,可以正确丢弃未合并的条目。
--reset
与
`--reset`:
相同,只是未合并的条目将被丢弃而不是失败。
与-m
一起使用时,导致丢失工作树更改的更新不会中止该操作。