一ヶ月前にはじめて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











