Posted on Wed May 21 22:41:31 +0900 2008 by nabeken
別のブランチで作業をしていて、また、ブランチを作って作業をしようと思い
# git checkout -b moge // これは別のブランチからさらにブランチを作る操作で、やりたかったのは以下の操作 # git checkout -b moge master // master からもう1つブランチを作りたかった
前者でブランチを作ったことに気がつかず、masterにマージしてしまった。まだ公開予定ではない記事がマージされてしまった。さて、どうしよう。
gitk コマンドで戻すべきHEADを捜しだす。その commit-ish を master にすればよい。ただし、masterでなかったことにしたい期間のコミットを含むブランチがまだ残っていることを確認すること。さもなければ、コミットを失ってしまう(辿れなくなる)。
# git reset --hard commit-ish // commit-ish は戻したい地点のID // hard は working tree などお構いなしに戻す
なお、この作業は gitk でもできる。戻したい地点で右クリックをすると、 "Reset master branch to here" とあるので、それをクリックすると戻ることができる。(後になって気がついたので試してはいない)
ORIG_HEAD というものをTwitter経由で教えてもらった。ありがとうございます。(http://twitter.com/kana1/statuses/814834025)
ORIG_HEAD は pull, merge のたびに、そのときのオリジナルの HEAD を残すようです。
# git reset --hard ORIG_HEAD
git-reset のドキュメントにそのままあった。http://www.kernel.org/pub/software/scm/git/docs/git-reset.html (Undo a merge or pull)
すでに、間違った HEAD を push した場合は push 時にリモートのリポジトリの履歴と齟齬が発生するので、-f で強制的に行わなければならない。