git stashでハマる。

原稿を書いている途中で、打ち合わせの議事録を取るのに別のファイルで議事録を作成したときのこと。議事録だけを取り合えずcommitしようと思ったら、

$ git add meeting-memo-20091119.txt
$ git commit -sm "Add meeting memo 20091119."

とした。pushするのに他者の新規commitを確認する。

$ git fetch

変更があれば、ワーキングコピーにcommitしないままの変更があるのは具合が悪いので、一時的に避けて、rebaseし、pushする。

$ git stash
$ git rebase origin
$ git push origin master

で、退避させた変更を元に戻したときに、先ほどrebaseした他者のcommitとのconflictが発生したわけだ。本当かなぁ?

$ git stash pop

で、conflictが発生した部分を、手動で変更したところまでは良かったのだけど、この後が良くなかった。このまま作業していて、また別の会議の議事録を作成した。

$ git add meeting-memo-20091124.txt
$ git commit -sm "add meeting memo 20091124."

先ほどと同じようにすると、

$ git fetch
$ git stash
$ git rebase origin
cannot rebase: you have unstaged changes
M    genkou.txt

となり、rebaseできない。なんでだと思い、gitk –allすると、git stashで退避したのが何世代か前のcommitから枝分かれしているので、git stashの状態をみてみると、

$ git stash list
stash@{0}: WIP on master: 4ea807c Add 20091119 meeting memo.

となって、先ほどpopで行ったのにクリアされていないわけだ。先ほどのconflictが原因だろうか?なので、

$ git stash clear
$ git stash list

でクリアされたことを確認したら、最新の議事録をcommitし、ワーキングコピーに残っている変更を再度退避して、rebase。

$ git add meeting-memo-20091124.txt
$ git commit -sm "add meeting memo 20091124."
$ git stash
Saved working directory and index state WIP on master: e429864 add 20091124 meeting memo.
HEAD is now at e429864 add 20091124 meeting memo.
$ git rebase origin
First, rewinding head to replay your work on top of it...
Applying: add 20091124 meeting memo.

あとは、pushして、popして終わり。

$ git push origin master
$ git stash pop

git stash popしてconflictが発生したらstashのキューから削除されないのは、本当にそういう動きをするのか再度確認してみよ。