git reset --soft的逆操作是什么?

3

git reset --hard CommitX将重置所有文件并将HEAD移动到CommitX,但是您将失去当前的更改。

如果您想保留当前更改并将所有文件状态设置为与CommitX相同,则可以使用以下命令:

git stash保存当前更改

git reset --hard CommitX将文件状态设置为CommitX

git stash pop应用之前保存的更改并重新应用它们

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

但我想知道是否有一个简单的git命令来完成这个操作。


2
“git checkout” 是你要找的命令。但是,你必须以不检出(分支)的模式使用它,而是简单地提取(文件:所有文件;如果有文件应该在将工作目录移动到提交 X 时消失,你必须删除那些文件;简单的方法是删除所有内容,然后从顶层运行 “git checkout X -- .”)。 - torek
看一下这个问题: 撤销 git reset - Andrii Abramov
2个回答

3
您可以使用git read-tree命令将特定的树形结构读入索引。通过使用-m -u选项,它还会更新工作目录。
git read-tree -m -u CommitX

谢谢!这正是我在寻找的。 - Michael
请注意,使用“-m”参数执行的是合并操作,这与仅仅用目标提交的内容覆盖索引不同。(尽管您可以先清空索引。) - torek
@torek文档中写道:“如果只指定了1个树,则git read-tree的操作就像用户没有指定-m一样,除非原始索引有给定路径名的条目,并且该路径的内容与正在读取的树相匹配,则使用来自索引的stat信息。”因此,您在具有或不具有-m的情况下都不会在索引内容上有任何区别。 - user4003407
@PetSerAl:啊哈!我错过了“单树合并”的情况。那不是真正的合并,所以-m非常误导人。(顺便说一句,使用git read-tree进行实验,带或不带-m-u会产生有趣的结果:只有在最初执行时才能按预期工作,如果在没有-uread-tree之后再次执行,则git read-tree -m -u无法按预期工作。) - torek
@torek -m -u 只检出受影响的索引条目,否则会保留未暂存的更改。 - user4003407

0

git read-tree --reset -ugit read-tree -m -u的替代方案,现在已经在Git 2.22(2019年第二季度)中记录并且可能对于“所有文件的状态将与提交CommitX中的状态相同”包括合并提交的情况非常重要。

请参见commit b5a0bd6(2019年4月1日),作者为Nguyễn Thái Ngọc Duy(pclouds
(由Junio C Hamano -- gitster --合并于commit 87e20f8,2019年4月22日)

read-tree.txt:澄清--reset和工作树更改

--reset的描述与438195c(git-read-tree: add "--reset" flag, 2005-06-09, Git v0.99)中的第一次实现保持一致。
也就是说,--reset会丢弃未合并的条目
至少对于提交消息而言是正确的,因为我无法确定关于read-tree在本地更改方面的行为。

但在fcc387dread-tree -m -u:不要覆盖或删除未跟踪的工作区文件,2006-05-17,Git v1.4.0-rc1)中,很清楚“-m -u”试图保留本地更改,而--reset则被单独列出并将一直覆盖工作树文件。
虽然提交消息中没有说明,但从补丁中可以看出这一点。
我之所以这么远追溯是因为我不相信自己对unpack-trees.c代码的理解。到目前为止,我认为历史上相关的更改与当前代码的理解是一致的,即“--reset”会丢失本地更改。
尽管老手们可能只是根据“重置”名称猜测它,但这种行为在git-read-tree.txt中没有提及。关于此事要更新git-read-tree.txt
顺便说一句,还有另一个与--reset有关的更改,这并不明显与本地更改有关,即b018ff6(unpack-trees: fix "read-tree -u --reset A B" with conflicted index,2012-12-29,Git v1.8.5.2)。但我非常确定这是关于--reset的第一个函数,正确地丢弃未合并的条目。

所以文档现在说明

`--reset`:

Same as -m, except that unmerged entries are discarded instead of failing.
When used with -u, updates leading to loss of working tree changes will not abort the operation.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接