git 是否有一个命令可以将工作树重置为 HEAD 但保留索引中的分阶段更改?

ram*_*ram 1 git

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

显然,执行此操作的一种方法是git commit分阶段更改 、git reset --hard HEADthen git reset --soft HEAD~、then git add -u,这是相当冗长的。

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

tor*_*rek 5

在 Git 2.23 之前,没有。

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

git restore -s HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

git worktree add --detach <path> HEAD
Run Code Online (Sandbox Code Playgroud)

where<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
Run Code Online (Sandbox Code Playgroud)

(或者git stash pop --index;我只是喜欢将 apply 和 drop 分开)。


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

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

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