Gitでは、簡単にブランチを切れるようになっていますが、その中身を知れば、より便利に移動できます。なお、この投稿は1分で実現できる有用な技術 Advent Calendar 2015の1記事として投稿しています。
Gitツリーの構造
ちょうどGitのアドベントカレンダーの投稿が参考になりますのでので、詳細についてはそこを参照させていただく形にします。
こちらで必要な程度に要約すれば、
- コミットは、それ自体が過去のコミットとの関連情報を持っている
- 「ブランチ」と呼ばれるものも、自律的につながったコミットのある1箇所を指すポインタに過ぎない
ということです。
微妙に面倒な切り替え→マージ
よくある場面で、「Aブランチの後にBブランチが続いている状況で、BブランチをAブランチに追いつかせた上でチェックアウトしたい」というときがあります。素直にやれば、
git checkout b
git merge a
のようになりますが、いったんワークエリアをBのものに変更して、それからまたAの状態まで戻すというのは、(そこまで速度を食う場面も多くはないでしょうが)なんとも富豪的ですっきりしないものです。
ブランチの位置だけずらす
そこで、git update-ref
というコマンドがあります。これを使えば、チェックアウトしない状態でもブランチの位置だけずらしてしまうことができます。
git update-ref refs/heads/b HEAD
とすることであらかじめBのブランチを先頭までずらしておいて、それからチェックアウトすればワークエリアはそのままにチェックアウトできます。