Gitコマンド入門::Gitブランチ機能(rebase,その2)第六十七回
みなさんこんにちは! 今日は、第六十二回の続きです。学習課題が、ちょっとあちこちに飛んでしまって、大変、申し訳ないのですが、すっぽり抜けてしまっていましたね。まあ~、これこそまさに課題とおなじ、リベースですね。(^▽^;)
今日の学習は、こちら!
こちらのページの中段、Figure 38. masterブランチのFast-forwardの下に移動、スクロールすると、さらに興味深いリベース という項目があるので、ここを学習して行きます。
前回の記事はこちらから!
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ブランチの後ろに繋げています。まあ~、予想した通りの処理なので、特に問題はありませんけど、そもそも実践で使わないと、なかなかその実感も湧いてきませんね。(^▽^;)
おまけ
それでは、今回はここまで、お疲れ様でした!
Discussion