当前位置:   article > 正文

一次git stash pop引发的血案、、、_git stash pop多了一次

git stash pop多了一次

由于需要切换到master分支,我暂时将本地的working分支(mybranch)工作直接赞存:git stash

然后切换:git checkout master

master上的工作处理完后,现在重新切换回来:git checkout mybranch

$ git stash pop
Auto-merging test.cpp
CONFLICT (content): Merge conflict in test.cpp

没有像我期望的那样回到working dir之前的状态,而是出现了一个auto merge冲突。git status查看一下文件状态:

$ git status
On branch mybranch
Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both modified:   test.cpp

编辑了该冲突文件后,

$ git add test.cpp
然后再次执行:(???注意,我在这里犯了一个严重错误!由于之前的git status命令没有显示之前的working dir状态,我误以为需要再次stash pop)

$ git stash pop

然后在源代码编辑器里检查,发现代码状态不是之前的working dir状态,而是更老的一个。

见鬼,之前stash的数据怎么没了????难道我执行了2次git stash pop导致??????

https://git-scm.com/book/en/v1/Git-Tools-Stashing FK,命令应该是git stash apply stash@{0},不是是git stash pop

apply很有道理,因为pop会丢弃stash生成的伪commit。而apply不会。而且似乎我应该在git stash之后执行git stash list命令看一下stash生成的commit SHA1号的。

查看一下“悬挂提交”:

$ git fsck

列表里有2种:dangling blob和dangling commit。dangling commit就3个,且都不是我想要的。

git fsck相当于git fsck --unreachable

感觉有点绝望了。https://stackoverflow.com/questions/89332/how-to-recover-a-dropped-stash-in-git 上显示似乎还有另外一个选项:

$ git fsck --no-reflog
抱着试一试的想法敲入上面的命令,咦?一下子多出10个dangling commit?挨个git show之,终于找到了之前git stash时创建的正确的commit。

随后遵循命令行提示,使用git checkout -b mynewbranch创建新分支,(直接把无用的老分支mybranch删除掉算了!)


下面是经验教训:

(1)git stash pop在出现auto merge的时候,不会显示dropped stash信息,这个行为很莫名其妙,垃圾设计。

(2)最好不要git stash pop,而是先在之前执行git stash后紧接着git stash list,记住WIP的commit SHA1,然后直接git stash apply这个commit。

git stash pop的不一致行为导致不得不退回到使用保守的git stash apply。

 


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/625981
推荐阅读
  

闽ICP备14008679号