2011-06-04

gitで迷子になった(no branch)に復帰する方法

gitを使って開発しているときに、以前のコミットのハッシュを直接指定してブランチを切らずにcheckoutすると(no branch)という無名のブランチができます。
どうしてそんなことをするかというと、例えば、開発を進めてる途中で別のやり方を思いついて以前の状態からやり直したいけど、あんまり自信ないからbranch切って名前つけるのはめんどくさい、みたいなときとか。

まあブランチきればすむ話ですが、とにかくno branchで作業しちゃうときもあるのです。そういうときに限ってうまく実装できて、no branchで作業していることを忘れてそのままcommitしてしまったりします。
で、なにげなくmasterに戻ってみるとさっきの作業内容が見えなくなって焦るわけです。

そういうときはno branchでコミットしたときのハッシュ値を直接指定してやればno branchでの状態に戻れます。no branchでコミットしたときのハッシュ値を確認する方法は知る限り2つあります。

1つめは、no branchから別のブランチに移ったときのメッセージから拾う方法です。


% git checkout master
Previous HEAD position was 49aaa59... foo
Switched to branch 'master'

checkoutしたときに直前のハッシュが表示されるので、これが残ってれば問題ありません。
が、そもそもno branchがみえなくなって焦るような人は、こういうメッセージはスルーして迂闊に別作業をやっちゃったりしてると思うので期待できません。

2つめは、.git/logs/HEAD を調べる方法です。(2011-06-26追記:git reflogまたはgit log -g --oneline でも同等のものが確認できます)
.git/logs/HEADはプレーンテキストなのでこれをたどればgit logに表示されないコミットも確認できます


% cat .git/logs/HEAD
0000000000000000000000000000000000000000 2759433440f4206e12ae1f2360e5c37f960e7bb6 takayuki <hoge@gmail.com> 1307189044 +0900      commit (initial): first
2759433440f4206e12ae1f2360e5c37f960e7bb6 4aaac8e7ff28ba47eeb32c312059b7b36fe62617 takayuki <hoge@gmail.com> 1307189060 +0900      commit: second
4aaac8e7ff28ba47eeb32c312059b7b36fe62617 2759433440f4206e12ae1f2360e5c37f960e7bb6 takayuki <hoge@gmail.com> 1307189084 +0900      checkout: moving from master to 2759433440f4206e12ae1f2360e5c37f960e7bb6
2759433440f4206e12ae1f2360e5c37f960e7bb6 49aaa59fb6137ef818a8ca4129fdbad07805586f takayuki <hoge@gmail.com> 1307189119 +0900      commit: third
49aaa59fb6137ef818a8ca4129fdbad07805586f 4aaac8e7ff28ba47eeb32c312059b7b36fe62617 takayuki <hoge@gmail.com> 1307190160 +0900      checkout: moving from 49aaa59fb6137ef818a8ca4129fdbad07805586f to master

これで目的のコミットのハッシュ値を指定してmergeするなりcheckoutしてbranchきるなりすればOKです。

0 件のコメント:

コメントを投稿

ZenBackWidget