Gitコマンド入門::rebase(-i,--root)「第十四回」

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

rebase にリニューアル!(笑)

みなさん、こんにちは~ 今日からサブタイトル名を、restoreから、rebaseに変更しましたよ! 過去を振り返れば、そうそう、第三回で、restoreコマンドでの謎解きから始まり、それからは、怒涛の流れにのった勢いだけで、一気に、ここまで学習してきましたね。そして今回からは、新サブタイトル名の、rebaseを取り上げました。本来なら、まだまだ先にやっておくことも、たくさんあるのですが、やはり、このrebaseコマンドも、この時点で少しだけでも学習して置いた方が、宜しいかと思った次第です。restoreと同じく、rebaseは、re-xxx なんとかだけに、これもしっかり覚えて置かないと、どこかで行き詰ったときに頭が真っ白になってしまって、さらにドツボにハマることになりかねません。今のうちに少しだけでも慣れて置きましょう!

リモートリポジトリ、githubの操作関連の、push,pull等のコマンドを先にするか、少し悩みましたけど、まずは自分のローカルリポジトリーの管理を、きちっと!整理整頓する方が、先かなあ~と思った次第です。

前回は、第十三回は、こちらです!

https://zenn.dev/shiozumi/articles/1575ce6eeffea8

rebaseは、コミットを編集するコマンドです!

いままでの操作は、README.md ファイルの変更が主なテーマでしたね。そして、任意のコミット時点に戻せば、README.md は、いつのバージョンにも自由に戻すことができます。gitの性質のひとつでもあり、柔軟なバックアップシステムを体験、習得できたことでしょう。
そして、rebaseコマンドは、コミット履歴そのものを、一括編集するコマンドですね。[1]

コミット履歴を編集する理由は?

まあ、想像できることは、とても単純ですが、commit の整理整頓ですね。開発期間が長くなると、どこかで一度は、大掃除したくなりますよね~(笑)そもそも、git log とかで見る部分は、上位の10行程度ですからね。フォルダー構造のように、ツリー状に展開できるわけでもなく、コマンドラインのgit logは、ベタ表示ですからね。

機能別だと、こんなメニュー項目かな?

  1. コミットメッセージ変更
  2. コミット内容修正
  3. コミット分割
  4. コミットマージ「合体」
  5. コミット削除

それでは、初歩的なメッセージ変更から試してみましょう! 今回は、新規にフォルダーを作成して、ローカルリポジトリーを作成してみました。

$ mkdir rebase // rebase学習用の新規フォルダーを作成
$ cd rebase

$ git init // まずは、ローカルのリポジトリー作成から!
Initialized empty Git repository in /home/shiozumi/mygit/rebase/.git/

$ echo "# rebase" > README.md
$ git add README.md

$ git commit -m "1st"
[master (root-commit) 445c067] 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

git branch -M main
git remote add origin https://github.com/shiozumi-makoto/rebase.git
git push -u origin main

 

Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 224 bytes | 224.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/rebase.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

$ git log --oneline
445c067 (HEAD -> main, origin/main) 1st

まっさらになって、気持ちいいですね。気持ちもリフレッシュ! また、余計な情報があると、思わぬ誤動作が起きたり、関係ないファイルや履歴も表示されて理解しずらくなるので、基本は、シンプルイズベスト! ですね。

git rebase -i コマンドで対話型での編集実行![2]

~/mygit/rebase/.git/rebase-merge/git-rebase-todo
$ git rebase -i // vi エディターが自動的に起動されます。

// ファイル名は、git-rebase-todo ですね!
// まずは、何もしないで、Quitしましょう!
// Escキーを押したら、q! で、viを終了させます!

Successfully rebased and updated refs/heads/main.
// こんなメッセージがでますね!

$ cat .git/refs/heads/main
445c067462a0b0a3cd8f21c40798dfd60750c6fb
// まあ~、現在のHEADが指しているハッシュ値が格納されているんですね。

それでは、vi で表示された画面をどうぞ!

まあ~最初なので、軽く、helpを眺めて置きましょう!(笑)

$ git log --oneline
445c067 (HEAD -> main, origin/main, origin/HEAD) 1st

git rebase -i --root

git rebase -i --root このrootは、特殊な指定です、最初のコミットを指定するときにだけ利用します。2つ目、3つ目以降は、そのコミットの一つ手前を指定してください。[3]

~/mygit/rebase/.git/rebase-merge/git-rebase-todo
pick 445c067 1st   // <-- 先頭行にカーソルがありますので、編集!

// ↓↓↓ 以下のように変更してください。

reword 445c067 1st // <-- pickを、rewordに変更したら、Esc + :wq で保存して終了!

// 更に又再び、viエディターが起動されて、変更後のコメントを求められます。

1st  // <-- 現在のコメント内容!

// ↓↓↓ 以下のように変更してください。

1st reword ok!  // <-- 1st の後ろに、reword ok! を、今回は追加しました!

// Esc + :wq で保存して終了!

[detached HEAD 304c8f4] 1st reword ok!
 Date: Tue Feb 16 14:37:03 2021 +0900
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
Successfully rebased and updated refs/heads/main.
// おお!無事に成功しましたね!

// では、確認しましょう!
$ git log --oneline
304c8f4 (HEAD -> main) 1st reword ok!

// ハッシュ値も変更されましたね~

さあ、これで、最初の一歩が成功しましたね。コメントが変更されて、さらに、ハッシュ値も変更されました。ということは、元の状態にも戻せるってことですね。また、今回は、--root を使いましたけど、これは、最初のコミットを編集するときにだけ使う特別な指定方法です。そもそもの指定の方法が、編集するコミットの一つ手前を設定するので、最初のコミットの前は、存在しませんからね。(苦笑)

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

https://zenn.dev/shiozumi/articles/1a60ea4c20c5d5
https://twitter.com/esmile2013
脚注
  1. 現時点での筆者のイメージです。後日、さらに学習が進むと変わることもあるかもしれませんので、悪しからず。(苦笑) ↩︎

  2. -i は --interactive の略で、対話的に実行ですね。 ↩︎

  3. 次回以降で、取り上げます。今回は、最初のコミットのみを変更します。 ↩︎