🗝️

Gitコマンド入門::rebase(-i,edit,一括更新?)「第二十二回」

5 min read

みなさん、こんにちは! 今日は、rebase edit で、Aを更新したら、その後のコミット、B,C,Dにも、変更内容が更新されるケースを試して見たいと思います。どのような状況で使用するのかは、まだ分かりませんが、前回から伝えているように、git自身は差分管理をしていますから、その元の親となるコミットが更新されると、その後に続く、子のコミットにも、変更内容が繁栄されるのでしょう。ただし、ファイルの差分が、親子間で減ったり増えたりしてしまうとNGのようですけど・・・><;;

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

https://zenn.dev/shiozumi/articles/4c1f2260f886ad

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

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

まずは、テスト環境の設定から!

echo "# rebase" > README.md
echo "# test" >> README.md
git add README.md
git commit -m "1st"echo "# A+" >> README.md
git add README.md
git commit -m "A+"

echo "# B+" >>README.md
git add README.md
git commit -m "B+"echo "# C+" >>README.md
git add README.md
git commit -m "C+"
git log -p

echo "# D+" >>README.md
git add README.md
git commit -m "D+"

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

https://gist.github.com/01d8da2a9d08192633d56400aa0caa12.git
$ git log --oneline --reverse
ae2f46b 1st
a985545 A+
fb52375 B+
6af2a1e C+
7641566 (HEAD -> main) D+

このような状態になります!

ハッシュ値 コメント README.md 補足
ae2f46b 1st # rebase # test -
c0407d3 A+ # rebase # test # A+ ここを変更します
d5907ab B+ # rebase # test # B+ -
dc32304 C+ # rebase # test # C+ -
9ebc383 D+ # rebase # test # D+ -

"# test" が、A+,B+,C+,D+のすべて共通と内容になっています。
ここで、rebaseを使って、A+の、"# test" の文字列を、# test + edit " に、置き換える実験です!

$ git rebase -i --root

pick ae2f46b 1st
edit a985545 A+ // ここを、edit に変更して、Esc + wq
pick fb52375 B+
pick 6af2a1e C+
pick 7641566 D+

// vi エディターの内容は、省略!

// ここで、A+の修正を求められます。
//  以下のハッシュ値と、コメント確認! a985545 と A+
Stopped at a985545...  A+
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue
  
// まずは、HEADの位置を再確認!
$ git log --oneline --reverse
ae2f46b 1st
a985545 (HEAD) A+
// ハッシュ値、コメントが一致しています。当たり前ですけど。

// 現在のREADME.mdの中身を確認!
$ cat README.md
# rebase
# test // ここを、# test + edit と変更します!
# A+

$ cat README.md
# rebase edit
# test + edit // vi エディターでの変更後!
# A+
  
$ git add README.md
$ git commit --amend
[detached HEAD c0407d3] A+ edit
 Date: Mon Feb 22 21:24:36 2021 +0900
 1 file changed, 2 insertions(+), 1 deletion(-)
 
$  git log --oneline --reverse
ae2f46b 1st
c0407d3 (HEAD) A+ edit
// 変更されましたね!

一応、git diff でも確認して置きましょう!

$  git log --oneline --reverse -p

ae2f46b 1st
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0998780
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# rebase
+# test
c0407d3 (HEAD) A+ edit
diff --git a/README.md b/README.md
index 0998780..7f52881 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 # rebase
-# test
+# test + edit
+# A+

これで無事、A+コミットは、"# test" から、"# test + edit" に更新されました!

git rebase --continue

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

$ git log --oneline --reverse
ae2f46b 1st
c0407d3 A+ edit // <!-- ここを更新しました!
d5907ab B+
dc32304 C+
9ebc383 (HEAD -> main) D+

git log で確認![1]

shiozumi@ovs-009 20210218]$ git log --oneline --reverse -U10
ae2f46b 1st
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0998780
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# rebase
+# test

c0407d3 A+ edit
diff --git a/README.md b/README.md
index 0998780..7f52881 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
 # rebase
-# test
+# test + edit // <!-- ここを、更新しました!
+# A+

d5907ab B+
diff --git a/README.md b/README.md
index 7f52881..410257b 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # rebase
 # test + edit // <!-- 自動で更新されています!
 # A+
+# B+

dc32304 C+
diff --git a/README.md b/README.md
index 410257b..f99dd46 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
 # rebase
 # test + edit // <!-- 自動で更新されています!
 # A+
 # B+
+# C+

9ebc383 (HEAD -> main) D+
diff --git a/README.md b/README.md
index f99dd46..eca1b48 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
 # rebase
 # test + edit // <!-- 自動で更新されています!
 # A+
 # B+
 # C+
+# D+

A+を更新した後は?!

ハッシュ値 コメント README.md 更新
ae2f46b 1st # rebase # test -
c0407d3 A+ # rebase # test + edit # A+ 手動で変更!
d5907ab B+ # rebase # test + edit # B+ 自動更新
dc32304 C+ # rebase # test + edit # C+ 自動更新
9ebc383 D+ # rebase # test + edit # D+ 自動更新

A+ を更新したら、B+,C+,D+ も、自動で更新されていますね。

理由は、さておき、まずは、こうなる!

さあ、どうして、こうなるのかは、ひとまず置いておいて、、、(^^;;
まずは、こういう動作をするっていう事だけは、認識して置きましょう!
ちなみに、開発歴30年以上の私が直感的に思うのは、元を修正したら、その後も当然そういう風に変更したいと思うので、そう動作する仕様にしたのだと直感的に思います。つまり、その方が便利だから、、、いちいち、その後に続く、子供のファイルを、すべて手作業で変更するのも、只の手間ですからね。(苦笑) ただ、それが正しいのか間違いなのかは、まあ、いまのところは気にしないで置きましょう。気にしだしたら、それはそれで、切りもありません。特に現状は、それで行きましょう!(爆笑)・・・というか違ったら、そのとき思考や認識をリプレースすれば、それで良いと思います。最初から正解に辿り着けることも、そう多くはありませんからね~、、、天才なんて、超レアなんです。ちなみに私は、凡人ですよ! 期待した人には、ほんと、ごめんなさいね。[2]

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

https://zenn.dev/shiozumi/articles/ff5ba26a567308
https://twitter.com/esmile2013
脚注
  1. -U10 を指定すると、diffの差分を、10行まで表示します! デフォルトでは、3行ぐらいかな? ↩︎

  2. たまにですけど、自己評価が低いと、指摘されることがありますが、、、自己評価が低い人ほど、成長度も高いものなんですよね~ いわゆる、コンプレックスが、飛躍のバネになるのでしょう!(笑) ↩︎