一ヶ月前にはじめてGitを使い始めた原始人として言わせてもらうと、正直、Gitは難しい。
なぜ難しいかというと、コマンドを実行して何が起きるのか、コマンドを実行したけど何が起きたのか、裏側が見えないから。ネットで調べたコマンドを実行するものの、いったい何が起きたのかよく分からず、しばしばパニックに陥っていた。
一ヶ月経った今振り返ると、Gitの入りとしてはまず「ブランチ」と呼ばれるポインタの操作に慣れることが先ではないかと感じた。あとはgit log --graph
の見方に慣れれば、独り立ちできる気がする。
そこで本記事では、merge/rebaseのコマンド実行前後でのコミットグラフを示してみた。ここに挙げたパターンで一通り練習すれば、Gitに対する恐怖感も薄れて、パズルを解くようなポインタ操作の楽しさに目覚めるかもしれない(僕はそれになった)。
(1) No-FF マージ
master
ブランチ(カレントブランチ)に、parent
ブランチとchild
ブランチを合流させる。
git checkout master
git merge parent child
before
after
(2) Fast Forwardマージ
git checkout master
git merge parent
before
after
(3) 基本的なリベース
git rebase master parent
または
git checkout parent
git rebase master
before
after
(4) 子連れブランチの子ブランチをスライスしてリベース
master
ブランチからchild
ブランチを生やすつもりだったが、誤ってparent
ブランチから生やしてしまった。master
ブランチに移植したいケースで使用する。
$ git rebase --onto master parent child
before
after
(5) 子連れブランチの親ブランチをrebase
--onto
をつけないとどうなるか?のifストーリーです。
$ git rebase master parent
before
after
(6) 子連れブランチの子ブランチをrebase
--onto
をつけないとどうなるか?のifストーリーです。
$ git rebase master child
before
after
(7) ブランチを任意のコミットに移動
開発メンバーAがparent
をmaster
にrebaseし、origin/parent
にpushしたとする。
以前からparent
ブランチで作業していた開発メンバーBが、origin/parent
をfetchする。
すると、Bのローカルにあるparent
ブランチは、rebase前の古いブランチ(H)を指したままとなってしまう。
この時、単純にparent
ブランチをorigin/parent
ブランチに移動したい。
もちろん、コミットは引き連れずに、ブランチのみを移動したい。
ブランチを再作成するという手もあるけど、以下のコマンドでも実現できる。
git rebase --onto origin/parent parent parent
before
after
上ではparent
をorigin/parent
に移動させたが、移動先にSHA1-ハッシュ値を指定して、parent
が任意のコミットを指すようにすることも可能である。
git rebase --onto SHA1-ハッシュ値 parent parent