如果你的序列是......
git pull
git stash apply
git push
...没有干预提交,那么它就不可能是藏匿处。这就是为什么。
让我们重建您所说的内容以及存储库的样子...
- 我正在处理本地主分支上的一些错误。(我知道我应该使用不同的分支,但在这种情况下我没有)
你会开始看起来像这样:
A - B [origin/master] [master]
- 提交我为这些错误所做的更改,但仍有其他工作尚未准备好提交。
A - B [origin/master] - D - E [master]
这里的 D 和 E 是您的错误修复,您正在执行正常的添加/提交过程。其他工作位于您的索引或磁盘中,此处未表示。
- 当谈到推动这些错误的修复时,我做了一个隐藏来保存我所有其他的工作......
git stash save
将存储挂起您当前的提交。
A - B [origin/master] - D - E [master]
\
F [stash@{0}]
然后从遥控器上拉。(在这个阶段我的假设是我与其他人所做的工作是内联的,并且当前的头部与遥控器是内联的)
拉取是提取加合并。获取后,如果有其他人将工作推送到远程,您的 repo 将如下所示:
G - H - I [origin/master]
/
A - B - D - E [master]
\
F [stash@{0}]
然后 origin/master 合并到 master 中。
G - H - I [origin/master]
/ \
A - B - D - E - J [master]
\
F [stash@{0}]
然后我应用存储并推送假设只有我提交的更改将被推送
Apply 不是像git merge
合并历史那样的合并,它更像git cherry-pick
是应用补丁。它将获取 E 和 F 之间的差异并用它修补 J。可能存在您必须解决的冲突。Git 可能会默默地弄错。
这是学术性的,因为git stash apply
不承诺,这取决于你。只要您在申请后没有提交,您的存储库就不应该有任何更改。当您推送时,您正在推送 D、E(您的错误修复)和 J(与 origin/master 的合并点)。
您在 D 和 E 中所做的某些事情完全有可能将合并与 G、H 和 I 混淆,所以 J 将是我开始寻找的地方。我会git log --stat --decorate --graph J
查看添加和删除的内容以及何时添加和删除(--decorate 和--graph 将生成我一直在使用的那些行和标签,以便更好地理解存储库)。
您可以通过查看git reflog
已移动 HEAD 的所有命令的历史记录以及它指向的 ID来恢复 J。Git 垃圾收集非常无趣,而且可能还会持续数周。