Help us understand the problem. What is going on with this article?

merge、rebase実行時のコミットグラフのbefore&after

一ヶ月前にはじめてGitを使い始めた原始人として言わせてもらうと、正直、Gitは難しい。

なぜ難しいかというと、コマンドを実行して何が起きるのか、コマンドを実行したけど何が起きたのか、裏側が見えないから。ネットで調べたコマンドを実行するものの、いったい何が起きたのかよく分からず、しばしばパニックに陥っていた。

一ヶ月経った今振り返ると、Gitの入りとしてはまず「ブランチ」と呼ばれるポインタの操作に慣れることが先ではないかと感じた。あとはgit log --graphの見方に慣れれば、独り立ちできる気がする。

そこで本記事では、merge/rebaseのコマンド実行前後でのコミットグラフを示してみた。ここに挙げたパターンで一通り練習すれば、Gitに対する恐怖感も薄れて、パズルを解くようなポインタ操作の楽しさに目覚めるかもしれない(僕はそれになった)。

(1) No-FF マージ

masterブランチ(カレントブランチ)に、parentブランチとchildブランチを合流させる。

git merge
git checkout master
git merge parent child

before

image.png

after

image.png

(2) Fast Forwardマージ

git merge
git checkout master
git merge parent

before

image.png

after

image.png

(3) 基本的なリベース

git rebase master parent

または

git checkout parent
git rebase master

before

image.png

after

image.png

(4) 子連れブランチの子ブランチをスライスしてリベース

masterブランチからchildブランチを生やすつもりだったが、誤ってparentブランチから生やしてしまった。masterブランチに移植したいケースで使用する。

childブランチをparentブランチの派生元からスライスしてrebase
$ git rebase --onto master parent child

before

image.png

after

image.png

(5) 子連れブランチの親ブランチをrebase

--ontoをつけないとどうなるか?のifストーリーです。

$ git rebase master parent

before

image.png

after

image.png

(6) 子連れブランチの子ブランチをrebase

--ontoをつけないとどうなるか?のifストーリーです。

$ git rebase master child

before

image.png

after

image.png

(7) ブランチを任意のコミットに移動

開発メンバーAがparentmasterにrebaseし、origin/parentにpushしたとする。
以前からparentブランチで作業していた開発メンバーBが、origin/parentをfetchする。
すると、Bのローカルにあるparentブランチは、rebase前の古いブランチ(H)を指したままとなってしまう。

この時、単純にparentブランチをorigin/parentブランチに移動したい。
もちろん、コミットは引き連れずに、ブランチのみを移動したい。
ブランチを再作成するという手もあるけど、以下のコマンドでも実現できる。

git rebase --onto origin/parent parent parent

before

image.png

after

image.png

上ではparentorigin/parentに移動させたが、移動先にSHA1-ハッシュ値を指定して、parentが任意のコミットを指すようにすることも可能である。

git rebase --onto SHA1-ハッシュ値 parent parent
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away