为什么';git stash apply';上演我的改变?
我做了一个更改,然后我为什么';git stash apply';上演我的改变?,git,Git,我做了一个更改,然后我git stash然后我git stash apply 我的问题是 为什么在我git stash apply之后,我的更改变为“暂存”?i、 e.如果我执行git diff,我将看不到任何东西,我只看到我执行git diff--cached时的差异 是否仍然可以通过git stash apply命令“取消显示”我的更改 是否有任何git命令基本上允许我“备份我的更改,将其重置为头部并将我的备份复制回来”?我想,git stash然后,git stash apply就是这个命
git stash
然后我git stash apply
我的问题是
git stash apply
之后,我的更改变为“暂存”?i、 e.如果我执行git diff
,我将看不到任何东西,我只看到我执行git diff--cached
时的差异git stash apply
命令“取消显示”我的更改git stash
然后,git stash apply
就是这个命令,但是它是如何“暂存”我所有的更改的呢?是否有任何等价物允许我在不使用“我的更改”部分的情况下应用git stash
如果您发现您的更改被意外转移,请执行以下操作:
git reset HEAD
我通常只在应用隐藏的更改时出现冲突时才会看到这一点。在执行git重置
之前,您需要检查情况是否如此
git stash
命令是最适合您的用例的命令。我一直使用它就是为了这个目的。我认为您的配置可能有问题,因为在重置为最新提交之前,git stash
记录索引和工作树的状态,git stash apply
仅当使用--index
选项时,才应尝试恢复索引的状态
一个可能的混淆点是,如果您有冲突(即,由于存储应用于另一个提交,而受存储影响的文件自提交后已更改),则如果您使用mergetool
解决冲突,mergetool
将在成功解析时自动对文件进行阶段性更改
正如格雷格·休吉尔(Greg Hewgill)所说,一次简单的重置将取消所有阶段性更改的显示
git reset
为什么git stash应用我的更改
任何会影响工作树()的内容都会首先影响索引
索引是将对象从工作树移动到对象存储以及将对象从对象存储移动到工作树的中间人
git stash apply
也使用该索引记录合并冲突,例如。见:
对于冲突路径,索引文件最多记录三个版本:
- 阶段1存储来自共同祖先的版本
- 从HEAD开始的第2阶段,以及
- 合并头的阶段3(您可以使用
检查阶段)李>git ls文件-u
git stash--apply
的发展历史中,需要注意两个有趣的事件:
2011年4月(Git 1.7.5.1,),stash
放弃了对apply的脏工作树检查
在应用隐藏之前,请确保工作树中没有不在索引中的更改。此检查可追溯到原始的git stash.sh
,大概是为了防止工作树中的更改在合并过程中意外丢失
但是,此检查存在两个问题:
foo
”,但“bar
”在工作树中变脏,则会阻止我们应用隐藏但它有自己的(更准确的)检查以避免丢失工作树数据,并且将中止合并,并显示一条更好的消息,告诉我们哪些路径存在问题
隐藏
:需要一个干净的索引才能应用
如果您在索引中暂存了内容并运行“stash apply
”,我们可能会遇到冲突并将新条目放入索引中。恢复到原始状态在这一点上是很困难的,因为像“
git reset--keep
”这样的工具会吹走任何分段的内容我们可以通过在有阶段性更改时拒绝应用来确保安全性
git reset
git stash apply
不会为我暂存已保存的更改。你能发布你正在做的事情的更多细节吗?我有与OP完全相同的问题。当git stash apply出现冲突时,更改被转移。我不使用任何解决冲突的工具,只使用我的代码编辑器。关于谁在进行隐藏的更改,还有其他建议吗?注意:windows上的msysgit!唯一一个远程接近罪魁祸首的配置是core.logallrefupdates=true,但我怀疑,它一定与此有关。