Git で merge や rebase をするときに、失敗したらどうしようと恐れを感じることはありますか?私はあります。reflog + reset --hard や rebase --abort などを用いて操作をする前の状態を再現できることは知っていますが、コンフリクト解消中に別の作業が割り込んできて作業中断したり、コンフリクトしてやり直してを何度も繰り返したりしていると、どこにどう戻せばいいのかわからなくなってしまうことがあります。
私はそういう不安への対策としてこっそりブランチを作って作業しています。「こっそり」の意味はブランチを作って作業した痕跡が最終的に元のブランチの履歴(コミットグラフ)に残らないということです。ここでは
- 一時ブランチで作業して、うまくいったら元のブランチをそれに合わせる
- バックアップを取った上で作業し、うまくいかなかったらバックアップから戻す
の2つの手順を紹介します。これらのフローは merge や rebase に限らず、複数人で開発している状況でこっそり何かを試してみて、うまくいったら採用、うまくいかなかったら破棄としたい時にも、Git の強みである軽量なブランチを活用して、作業内容によらず一定の手順で元に戻せるという利点を与えてくれます。ブランチいちいち作るのは大げさに感じてしまうかもしれないですが、失敗したら元に戻せるという安心感を持って作業できますし、こっそりやるのであれば他人の目を気にする必要もないので気軽にやったらいいと思います。
一時ブランチで作業
1つ目の手順、一時ブランチで作業して、うまくいったら元のブランチをそれに合わせる方法を紹介します。
元のブランチが仮にdevelopという名前だったとして、それに沿った名前でブランチを作成してチェックアウトします。
% git checkout -b develop_temp
ここで作成した一時ブランチ上でやりたかった作業(merge/rebase/その他)をします。
作業がうまく行ったとき
作業の結果をコミットしたら、元のブランチをチェックアウトして作業していたブランチに同期してやれば、元のブランチで作業していたのと履歴上の区別は付きません。
% git commit -a
% git checkout develop
% git reset --hard develop_temp
外部リポジトリへの反映が必要なら push します。
最後に不要になった一時ブランチを削除します。
% git branch -d develop_temp
作業がうまく行かなかったとき
作業がうまくいかなかった時は元のブランチ(例えばdevelopという名前だったとします)を強制チェックアウトして、一時ブランチを消してしまえば、作業前の状態を復旧できます。
% git checkout -f develop
% git branch -d develop_temp
バックアップとってから作業
2つ目の手順、バックアップを取った上で作業し、うまくいかなかったらバックアップから戻す方法を紹介します。
元のブランチが仮にdevelopという名前だったとして、それに沿った名前でブランチ(あるいはタグでもよいと思います)を作成して、現状のバックアップを取っておきます。
% git branch develop_backup
元のブランチでやりたかった作業(merge/rebase/その他)をします。
作業がうまく行ったとき
作業の結果をコミットします。
% git commit -a
外部リポジトリへの反映が必要なら push します。
バックアップブランチがもう不要であれば削除します。もし後で必要になるかもしれない場合は残しておいてもよいです(他の人が後で必要とするかもしれない場合や、バックアップとの差異をレビューしてもらいたい場合など、バックアップブランチを push するケースもあります)。削除する場合は
% git branch -d develop_backup
とします。
作業がうまく行かなかったとき
作業がうまく行かなかった場合は、reset で HEAD をバックアップに合わせ、バックアップを削除すれば、作業前の状態を復旧できます。
% git reset --hard develop_backup
% git branch -d develop_backup
まとめ
Git のブランチをこっそり使う2通りの方法を見ました。こういう使い方をしている人はたくさん居ると思うのですが、他で紹介されているのを見つけられなかった(こっそりやっていて表に出てこないのか、私の探し方が甘いのか)ので紹介してみました。わかりやすい名前でブランチを作っておくことで、reflog から何を探したらいいのかと悩まずに済むという安心感を持って作業を行えますのでよかったら使ってみてください。