メモの日々


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