🗝️

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

2021/02/17に公開

みなさんこんにちは! 前回は、ひとつだけコミットして、そのコメントを修正しましたね。今日は、2つ以上のコメントを修正してみましょう! ちなみに、git rebase --help コマンドを、入力した人は、どれだけいるか分かりませんけど、ものすごい量のテキストが出力されるので、、、こりゃ~、全部を覚えるのは大変だなあ~なんて感じると思います。こういうときこそ、体系的に、もしくは利用目的シーンに合わせて、コツコツと試していくしかないですね。

ということで、まずは、[-i | --interactive] こちらに慣れるところからですね!
尚、編集するエディターの指定は、$ git config --global core.editorで可能です。

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

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

3つのコミット、そして3つのコメント修正から!

まあ~、プログラムでもそうですが、単体の次は、複数処理ですね。2つよりは、3つぐらいを試すと、最初、その間、最後というように、3つの要素の意味も出てきます。
それでは、早速、以下のコマンドでテスト用のリポジトリーを作成しましょう!

// 現状は、ここからスタートです!
$ git log --oneline
36bba7c (HEAD -> main) 1st

// 私は、前回の復習も兼ねて、git rebase -i --root コマンドを使い、
// コメントを元の状態に「1st」戻してみましたよ!(笑)

// では、以下、3つのコミットを追加!

$ echo '# AAA' >> README.md
$ git add README.md
$ git commit -m 'A'

$ echo '# BBB' >> README.md
$ git add README.md
$ git commit -m 'B'

$ echo '# CCC' >> README.md
$ git add README.md
$ git commit -m 'C'

$ git log --oneline
0425233 (HEAD -> main) C
61ed2a3 B
ac69810 A
445c067 (origin/main, origin/HEAD) 1st

前回覚えたコマンド、git rebase -i --root

pick 445c067 1st
pick ac69810 A
pick 61ed2a3 B
pick 0425233 C

// 古いものから、順番に並んでいますね。
// git log --oneline とは逆順になるので、一瞬、戸惑いますけど・・・

では、次に、git rebase -i 省略形で!

pick ac69810 A
pick 61ed2a3 B
pick 0425233 C

// 1st は対象外になりましたね!
// その他は、全て選択対象になっています。

次は、git rebase -i HEAD

// vi での編集画面では、noop と表示されます。
noop

// まあ~なにもしない!(苦笑)
// どのコミットも選択できていませんね。

git rebase -i HEAD^ or git rebase -i HEAD~1

// vi での編集画面では、Cのみが選択表示されています。
pick 0425233 C

// 以下は、git log --online の出力
// 0425233 (HEAD -> main) C
// 61ed2a3 B <-- HEAD~1 で、Bを指定すると、C の編集が可能! 
// ac69810 A
// 445c067 (origin/main, origin/HEAD) 1st

git rebase -i HEAD^^ or git rebase -i HEAD~2

// vi での編集画面では、B+Cが選択表示されています。
pick 61ed2a3 B
pick 0425233 C

// 以下は、git log --online の出力
// 0425233 (HEAD -> main) C
// 61ed2a3 B 
// ac69810 A <-- HEAD~2 で、Aを指定すると、B+C の編集が可能!
// 445c067 (origin/main, origin/HEAD) 1st

git rebase -i HEAD^^^ or git rebase -i HEAD~3

// vi での編集画面では、A+B+Cが選択表示されています
pick ac69810 A
pick 61ed2a3 B
pick 0425233 C

// 以下は、git log --online の出力
// 0425233 (HEAD -> main) C
// 61ed2a3 B 
// ac69810 A 
// 445c067 1st <-- HEAD~3 で、1st指定すると、A+B+C の編集が可能!

次は、ハッシュ値で選択してみましょう![1]

git rebase -i 445c067
git rebase -i ac69810~1
git rebase -i 61ed2a3~2
git rebase -i 0425233~3

この4つは、同じ選択結果になりますね!

// vi での編集画面では、A+B+Cが選択表示されています
pick ac69810 A
pick 61ed2a3 B
pick 0425233 C
// 選択範囲は、全て同じですね。

まとめると、HEADでもハッシュ値のどちらでも指定が可能です。そして編集したいコミットがあったら、そのひとつ前のコミットを指定する。すると、それより後のコミットが、編集対象となりますね。

$ git rebase -i HEAD~3

// vi での編集画面で、pick を、reword に変更する。3つとも、pickから、reword へ
reword ac69810 A
reword 61ed2a3 B
reword 0425233 C

// 保存すると、今度は、1つのコミットに対しての新しいコメントを求められます。
A --> Aaa に変更して、ファイルを保存。[ Esc + wq ] 
B --> Bbb に変更して、ファイルを保存。[ Esc + wq ]  
C --> Ccc に変更して、ファイルを保存。[ Esc + wq ]  

$ git log --oneline
1839466 (HEAD -> main) Ccc
9a7ea35 Bbb
41965df Aaa
445c067 (origin/main, origin/HEAD) 1st

これで、コメント一括修正ができましたね。

実際の作業でも、コメント文は、気になったときに、ちょこちょこと変えると思いますので、まずは、ここから学習ですね。そして、おそらくは、HEAD~「チルダ+数字」での指定より、ハッシュ値を使って、直接、編集したいコミットの一つ手前を指定する方が、簡単かな?

$ git log --oneline
1839466 (HEAD -> main) Ccc
9a7ea35 Bbb  // <-- ここから後のコミットを選択したいなら、git rebase -i 9a7ea35~1 
41965df Aaa
445c067 (origin/main, origin/HEAD) 1st

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

https://zenn.dev/shiozumi/articles/6c462fac625cd2
https://twitter.com/esmile2013

脚注
  1. 一意のハッシュ値+「~」チルダ+数字「そこからの相対位置」で指定できますから、いろいろ書き方はできますけど、、、直感的には、編集したいコミットのハッシュ値を指定して、その後ろに、~1 「チルダ1」を付けて実行するのが、一般的かな?! ↩︎

Discussion