~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

git で間違って merge してしまった場合 (fast forward でマージしてしまったのを取り消したい)

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

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 で強制的に行わなければならない。

更新履歴

  • ORIG_HEADのタイミングを追記 (Wed, 21 May 2008 22:41:31 +0900)
  • ORIG_HEAD について追記 (Wed, 21 May 2008 22:30:42 +0900)
  • push時の注意を追加 (Mon, 19 May 2008 18:22:36 +0900)
  • git-7: 初稿 (Mon, 19 May 2008 18:21:12 +0900)