赞
踩
由于需要切换到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
$ 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
见鬼,之前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
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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。