何か作業をしてコミットして別のブランチに移動すると、コミットしたはずの内容が消えていました。もう、何がどうなっているのかさっぱりわからず、作業をやり直す羽目に。実際には、消えたわけではなく、ログから見えなくなっていただけだったんですが、気づくまで苦労しました。
それで、なぜコミットが見えなくなっていたのか、ということなんですが、まず、git ではブランチに所属した状態でコミットしないと、そのコミットはどのブランチにも所属していないコミットとなり、ログから見えなくなってしまうんです。で、ブランチに所属した状態というのは、git では「ローカルブランチ」の「先頭」にいる状態のことなんです。
なので、ブランチの途中をチェックアウトしたり、または "origin/ブランチ名" という名前のついたブランチをチェックアウトすると(origin/ の名前がついたブランチはサーバにあるブランチであって、ローカルブランチではない)、ブランチに所属していない状態となり、コミットしてもそのコミットはどのブランチにも所属してないものとなってしまうのです。
git を説明する人は、こういうルールをまず真っ先に書いておいて欲しい…マジで…。
ということで、git で作業する際のルール:
- 基本的にチェックアウトは、ローカルブランチの先頭をチェックアウトする。
- ブランチの途中や origin/ ブランチから作業を始めたい場合は、チェックアウトした後必ずその場で新しいブランチを作成する。
それと、上に書いたような見えなくなったコミットも消えてしまったわけではないので、復旧することは可能です。
コマンドラインから、
>git reflogとすると、見えなくなっていたログも表示されます。この中から復旧したい場所のハッシュを控えておいて、
>git checkout ハッシュで、復帰します。ここで、新しくブランチを作成すれば、見えなくなっていた履歴がすべてこの新しいブランチに含まれた状態になります。
※git では、ブランチの作成は、作った時点から先が新しいブランチになるのではなく、リポジトリの先頭から作成した時点まですべてが新しいブランチに含まれる、という考え方のようです。これを利用して、後からブランチを作るということもできます。
わかってしまえば問題はないんですが、やっぱり Mercurial の方が簡単でいいなあという印象です。他のコマンドについても、git はどうもわかりにくいというか、やってはいけないこともできてしまうという点で、かなり人には勧めにくいです。
0 件のコメント:
コメントを投稿