🏹

Gitコマンド入門::Gitブランチ機能(rebase -i 復活)第六十四回

2021/03/26に公開

みなさんこんにちは! 前回に続いて、rebase をやっていきます! で、そうそう、かなり前になりますけど、git rebase -i を学習しましたね。過去の記事をみたら、第十四回でした。えっ?!・・・今から50回も前でしたね。あの時、rebaseとmergeの学習も、なる早で取り上げたいなあ~と、考えていたんですけどね。気が付けばその間50回分も投稿していたとは、、、時の流れるのは、ほんと早いですね!

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

https://zenn.dev/shiozumi/articles/3ceb2ce5bab157

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

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

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

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

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

何故に今回は、git rebase -i なのか?!

実は、先日の第六十二回で、merge後のmainブランチに対して、試しに、git rebase -i --root を実行したみたところ、なんと勝手にコミットの履歴を一本化してくれました! それをちょっとご紹介してみますね。

それでは、前回の環境づくり!

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

// いつもの git init
$ git init

// README.md を作成!
$ echo "func0064" > 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

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

こちらにも、UPしてあります!

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

以下のような環境になっていればOK!

$ git log main --oneline --graph
* 886c8d3 (HEAD -> main) 2nd main
* 95f09b0 1st

$ git log sub --oneline --graph
* fb76f48 (sub) 3rd sub
* 95f09b0 1st

git merge sub を実行!

$ git merge sub
// viエディターが起動して、コメントもそのまま!

Merge made by the 'recursive' strategy.
 sub.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 sub.txt

$ git log main --oneline --graph
*   bed89b8 (HEAD -> main) Merge branch 'sub' into main
|\
| * fb76f48 (sub) 3rd sub
* | 886c8d3 2nd main
|/
* 95f09b0 1st

git rebase -i --root

// viエディターが起動して、例のハッシュ値が表示されます。

pick 95f09b0 1st
pick 886c8d3 2nd main
pick fb76f48 3rd sub

// 何も変更せずに、そのまま、Esc + wq

$ git rebase -i --root
Successfully rebased and updated refs/heads/main.

$ git log main --oneline --graph
* 4e88172 (HEAD -> main) 3rd sub
* 886c8d3 2nd main
* 95f09b0 1st
// rebase されていて、履歴が一本化されました!

$ git log main --oneline --graph --all
* 4e88172 (HEAD -> main) 3rd sub
* 886c8d3 2nd main
| * fb76f48 (sub) 3rd sub
|/
* 95f09b0 1st
// --all オプションを付けると、
// (sub) 3rd sub の残骸が表示されますけど・・・?

さあ、今回の動作ついては、私もよく分かりませんけど、git rebase -i は、なんていうのかな? ある程度まで自動処理できる時は、勝手にやってくれそうです。私もたまたま、何気なくコマンドを打ったら、こんなことが起こったので、思わず何度か試しましたけど、必ず、同じ結果になりますから、完全に仕様ですね!

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

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

Discussion