2010年09月17日(金) [長年日記]
■ [howto][dev] git stash pop で衝突が発生したときの対処
gitは未だだましだまし使っている感じ。
git svn rebase を実行しようとしたら未コミットの修正がワークツリーにあってrebaseできなかったので、git stash で修正を退避させ、再度 git svn rebase した。その後で、退避していた修正をワークツリーに戻そうと git stash pop したところで衝突が発生した。
% git stash pop Auto-merging xxx/xxx/XXX.cpp Auto-merging yyy/yyy/YYY.cpp CONFLICT (content): Merge conflict in yyy/yyy/YYY.cpp
yyy/yyy/YYY.cpp で衝突が発生したので、このファイルを手動で修正した。この後どうすればいいのか。あ、git status で出力されるメッセージに方法が書かれていた。
% git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: xxx/xxx/XXX.cpp # # Unmerged paths: # (use "git reset HEAD <file>..." to unstage) # (use "git add/rm <file>..." as appropriate to mark resolution) # # both modified: yyy/yyy/YYY.cpp
git add すればいいのだきっと。
% git add yyy/yyy/YYY.cpp % git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: xxx/xxx/XXX.cpp # modified: yyy/yyy/YYY.cpp
これで衝突は解決された模様。
あとは、エラーになったgit stash popの状態が気になる。
% git stash list stash@{0}: WIP on master: cae1752 ZZZZZZZZZ
まだstashが残っている。popで全部のファイルの修正を取り戻せたのかが気になる。調べると、git stash には show というオプションがあった。
% git stash show xxx/xxx/XXX.cpp | 35 +---- yyy/yyy/YYY.cpp | 34 ++++
ファイル名が一致しているので大丈夫そう。stashを消すのはdropみたい。怖いので、commitした後でdropした。
% git commit -a % git stash drop stash@{0} % git stash list