🏹

Gitコマンド入門::Gitブランチ機能(rebase,merge)第六十三回

2021/03/25に公開

みなさんこんにちは! 今回も前回に続いて、rebase,mergeの学習を進めて行きますね。前回は、merge と、rebase の違いを体験しましたけど、rebase は、コマンド操作では、ひと手間多くなりますが、コミットの履歴が一本化されて、スッキリするところがメリットですね。今日は、また前回と同じ内容で、rebase を行いますが、その都度、git logで確認しながら、コミットの変化を、もう少し詳しく追ってみたいと思います。

前回、第六十二回の記事はこちらから!

https://zenn.dev/shiozumi/articles/6de6f93b7efa74

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

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

今回からの課題は、ここを参考にしています!

https://git-scm.com/book/ja/v2/Git-のブランチ機能-ブランチとは

3.6 Git のブランチ機能 - リベース

rebase 操作中、git log の確認ポイント!

手順 コマンド 補足事項
rebase 直前 main 1st, main 2nd, sub 3rd main,sub のlog確認
rebase 処理後 git rebase main sub のlog確認
merge 処理前 git switch main main のlog確認
merge 処理後 git merge sub main のlog確認

いつもの環境は、前回と同じです!

// フォルダーを新規に作成します!
$ mkdir func0063 && cd $_

// いつもの git init
$ git init

// README.md を作成!
$ echo "func0063" > README.md

// add,commit
$ git add README.md
$ git commit -m "1st" // <!-- コメントは、1st

// master ブランチから、subブランチ作成
$ git checkout -b sub
Switched to a new branch 'sub'

// sub.txt を作成!
$ echo "3rd sub" > sub.txt

// add,commit
$ git add sub.txt
$ git commit -m "3rd sub"  // <!-- コメントは、3rd sub

$ git switch master
Switched to branch 'master'

// ブランチ名を、master から、main に変更!
$ git branch -M main

// main.txt を作成!
$ echo "2nd main" > main.txt

// add,commit
$ git add main.txt
$ git commit -m "2nd main" // <!-- コメントは、2nd main

// ここまでは、前回と同です!

rebase 直前の、main,sub のlog確認 |

$ git log main --oneline --graph
* fb5b336 (HEAD -> main) 2nd main  <!-- ここに注目!
* c50954b 1st

$ git log sub --oneline --graph
* f2f80bb (sub) 3rd sub  <!-- ここに注目!
* c50954b 1st
  1. fb5b336 2nd main ここに注目!
  2. f2f80bb 3rd sub ここに注目!

rebase 直後の、sub のlog確認 |

$ git checkout sub
Switched to branch 'sub'

$ git rebase main
First, rewinding head to replay your work on top of it...
Applying: 3rd sub

$ git log sub --oneline --graph
* 5704aa1 (HEAD -> sub) 3rd sub <!-- 以前の、f2f80bb から変化!
* fb5b336 (main) 2nd main  <!-- mainブランチ側のコミット値そのまま!
* c50954b 1st
  1. fb5b336 は、rebase前の、mainブランチの 2nd コミットと同じです。
  2. rebase直後のコミット値、以前の f2f80bb から、5704aa1 に新しくなっています。

merge 処理前 main のlog確認

$ git switch main
Switched to branch 'main'

$ git log main --oneline --graph
* fb5b336 (HEAD -> main) 2nd main
* c50954b 1st

merge 処理後 main のlog確認

$ git merge sub
Updating fb5b336..5704aa1
Fast-forward
 sub.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 sub.txt

$ git log main --oneline --graph
* 5704aa1 (HEAD -> main, sub) 3rd sub
* fb5b336 2nd main
* c50954b 1st
// Fast-forward というメッセージが表示されますが、
// その前の、sub側でのrebase処理で、既に、mainと同じなっています。
// 実際のデーターは完成済み。ブランチのコミット値を、コピーしただけですね。

まとめ

如何でしょうか? main 側で、merge する前に、sub側で、rebase のひと手間かけて置けば、main 側でのマージ処理が、Fast-forward となり履歴が一本化する。尚、実際の運用面においては、リモートmainブランチローカルmainブランチにフェッチして置いて、小まめにローカルsubブランチ側で、git rebase mainを実行して置けば、main側でのmerge処理が楽になるってことなんでしょうね。それが、Fast-forward!

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

https://zenn.dev/shiozumi/articles/fb5c76c2f7e2af
https://twitter.com/esmile2013

Discussion