Gitコマンド入門::Gitブランチ機能(rebase,その2)第六十七回

4 min read読了の目安(約4400字

みなさんこんにちは! 今日は、第六十二回の続きです。学習課題が、ちょっとあちこちに飛んでしまって、大変、申し訳ないのですが、すっぽり抜けてしまっていましたね。まあ~、これこそまさに課題とおなじ、リベースですね。(^▽^;)

今日の学習は、こちら!

https://git-scm.com/book/ja/v2/Git-のブランチ機能-リベース
こちらのページの中段、Figure 38. masterブランチのFast-forwardの下に移動、スクロールすると、さらに興味深いリベース という項目があるので、ここを学習して行きます。

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/c9a40a20c9b7f7

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

同じ環境のシェルスクリプトも取得できます!

https://gist.github.com/e1b584e81954d06d5148353979e31cce.git

では、いつもの環境づくり!

# --------------------
# フォルダー作成
# --------------------
mkdir func0067 && cd $_

# --------------------
# いつものgit init
# --------------------
git init

# --------------------
# master
# --------------------

echo "c1" > c1.txt
git add c1.txt
git commit -m "C1"

echo "c2" > c2.txt
git add c2.txt
git commit -m "C2"

git checkout -b server

# --------------------
# server
# --------------------

echo "c3" > c3.txt
git add c3.txt
git commit -m "C3"

# --------------------
# client
# --------------------

git checkout -b client

echo "c8" > c8.txt
git add c8.txt
git commit -m "C8"

echo "c9" > c9.txt
git add c9.txt
git commit -m "C9"

# --------------------
# server
# --------------------

git switch server

echo "c4" > c4.txt
git add c4.txt
git commit -m "C4"

echo "c10" > c10.txt
git add c10.txt
git commit -m "C10"

# --------------------
# master
# --------------------
git switch master

echo "c5" > c5.txt
git add c5.txt
git commit -m "C5"

echo "c6" > c6.txt
git add c6.txt
git commit -m "C6"

# --------------------
# branch
# --------------------
git branch -avv
  client a05cedd C9
* master 750bcb0 C6
  server 4d6192c C10

# --------------------
# log
# --------------------
git log --graph master --oneline 

* 93d5511 (HEAD -> master) C6
* cd15c78 C5
* 34476e8 C2
* 50b8965 C1

git log --graph server --oneline

* ba76279 (server) C10
* 4d6cfe0 C4
* f17941b C3
* 34476e8 C2
* 50b8965 C1

git log --graph client --oneline

* 90ca788 (client) C9
* 643c934 C8
* f17941b C3
* 34476e8 C2
* 50b8965 C1

git rebase --onto master server client

ちなみに、このコマンドは、どこのブランチにいても実行できます。利用シーンは、クライアント側の変更を本流にマージしてリリースしたいけれど、サーバー側の変更は繁栄させたくないとき。コマンド処理の流れは、clientブランチに移動する。clientブランチと、serverブランチの共通の先祖からのパッチの取得。ここだと、共通先祖のコミットは、C3 となり、そしてパッチの取得とありますが、それは、どうやら、C8,C9 の2つのコミット値を指しています。まあ~、平たく言って、clientの変更コミットは、C3,C8,C9の3つありますが、C3は、clientもserverも両方のブランチに含まれています。なので、C3を除いて、client変更のみということなので、C8,C9 となるのでしょう。

それでは、早速実行! Figure.39+40

$ git rebase --onto master server client
First, rewinding head to replay your work on top of it...
Applying: C8
Applying: C9
// C8 C9 が、適用されました!

$ git switch master
Switched to branch 'master'

// master に移動してからの、merge

$ git merge client
Updating 3674772..b089d39
Fast-forward
 c8.txt | 1 +
 c9.txt | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 c8.txt
 create mode 100644 c9.txt

// log で確認!

$ git log --graph master --oneline
* b089d39 (HEAD -> master, client) C9
* 1e32d77 C8
* 3674772 C6
* 56e4e00 C5
* 78294d9 C2
* 4e3858c C1
// b089d39 C9 リベースされました!
// 1e32d77 C8 リベースされました!

serverとmaster間でリベース Figure.41+42

$ git rebase master server
First, rewinding head to replay your work on top of it...
Applying: C3
Applying: C4
Applying: C10

// C3 C4 C10 が、適用されました!

$ git checkout master
Switched to branch 'master'

// master に移動してからの、merge

$ git merge server
Updating b089d39..1b3bc00
Fast-forward
 c10.txt | 1 +
 c3.txt  | 1 +
 c4.txt  | 1 +
 3 files changed, 3 insertions(+)
 create mode 100644 c10.txt
 create mode 100644 c3.txt
 create mode 100644 c4.txt

// log で確認!

$ git log --graph master --oneline
* 1b3bc00 (HEAD -> master, server) C10
* 243e5c4 C4
* 90e517d C3
* b089d39 (client) C9
* 1e32d77 C8
* 3674772 C6
* 56e4e00 C5
* 78294d9 C2
* 4e3858c C1

// 1b3bc00 C10リベースされました!
// 243e5c4 C4 リベースされました!
// 90e517d C3 リベースされました!

まとめ

さあ、いかがでしょうか? リベースの動作を簡単にいえば、相手側のmainブランチのHEADの後ろに、自分のclientブランチの追加したコミットを繋げてしまう。そのあと、mainブランチに移動して、mergeする。それに加えて、--onto オプションを付けた場合は、serveとclientの差分と取って、clientの追加のみを繋げる。ここでは、C3,C8,C9 の3つの中から、C8,C9 コミットのみを、masterブランチの後ろに繋げています。まあ~、予想した通りの処理なので、特に問題はありませんけど、そもそも実践で使わないと、なかなかその実感も湧いてきませんね。(^▽^;)

おまけ

ちなみに、私のサンプルスクリプトだと、リベースせずに、マージのみを実行しても、同じ結果になるので悪しからず。git merge client, git merge server のみもお試しあれ~

それでは、今回はここまで、お疲れ様でした!

https://twitter.com/esmile2013