首页 > 解决方案 > git 是否有一个命令可以将工作树重置为 HEAD 但保留索引的分阶段更改?

问题描述

我知道有很多关于这个主题的帖子,但我似乎找不到这个具体的答案。

显然,这样做的一种方法是git commit分阶段更改,git reset --hard HEAD,然后git reset --soft HEAD~,然后git add -u,这是非常冗长的。

的默认行为reset--mixed完成我所要求的相反。当然必须有一个单一的命令解决方案,或者至少是一个更好的方法。

标签: git

解决方案


在 Git 2.23 之前,没有。

在 Git 2.23 或更高版本中,git restore可以完成这项工作:

git restore -s HEAD

请注意,这git stash -k并不能解决问题:它使工作树与index匹配,而不是HEAD提交。1

git worktree add在自 2.5 以来的所有 Git 版本中,根据当前提交创建第二个工作树可能更容易和/或更好:

git worktree add --detach <path> HEAD

<path>您希望新工作树出现的位置在哪里。这样做的好处是不会触及您现有的工作树。(在 2.15 之前的 Git 版本中,我建议在两周内完成你在这个添加的工作树中所做的任何事情,然后将其删除,因为在这些版本的 Git 中关于添加的工作树有一个令人讨厌的小错误。如果你只是对工作树文件执行此操作,但错误本身是无害的。)

在 2.23 之前的 Git 版本中,您可以执行以下操作:

git stash
# do whatever your job is here, followed by `git reset --hard` if needed
git stash apply --index
git stash drop

(或者git stash pop --index; 我只是想把申请和删除分开)。


1git stash -k以通常的方式进行两次存储提交,因此它们与往常一样。但是,git reset --hard它不是像常规的非-k git stash那样做,而是强制调整工作树以匹配存储提交。

重点git stash -k是允许您运行某种使用工作树内容的测试,而不必将隐藏的索引提取到另一个工作树。例如,如果您有一个使用工作树中的内容而不是索引中的内容的自动化测试系统,您可以git stash -k运行测试,然后git reset --hard使存储再次适用并应用和删除存储。

令人讨厌的是,如果索引和工作树匹配,则git stash 不会进行存储,因此很难用于进行这种自动化测试,因为无法保证它确实进行了存储。HEADgit stash -k


推荐阅读