🗝️

Gitコマンド入門::rebase(-i,edit,コミット分割)「第二十三回」

2021/02/24に公開

みなさん、こんにちは! 今日は、コミット分割に挑戦して行きます。rebase コマンドで任意の過去のコミットに戻り、それを分割しますよ! まあ、実務で使うときがくるのかどうかは分かりませんけど、、、「rebaseコマンドは、こんなこともできるんですね!」って感じで体験しておくと、gitに慣れていくのが楽しくなることだけは間違いありませんよ!(爆笑)

ちなみに、ここまでは、README.md 単体ファイルのみを扱って来ましたけど、当然、普段の開発では、複数ファイルですね。その点を省いて学習してきましたから、実は、コマンドの習得過程に置いても、手落ちの部分が残っています。そのあたりの補足も、徐々に追加して行きたいとも考えておりますので、どうぞ、よろしくお願いいたします。

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

https://zenn.dev/shiozumi/articles/8d7d6a31f562f4

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

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

初期値は、このようになっています。

ハッシュ値 コメント README.md 補足事項
cea1250 1st # rebase edit *
442e07d A # A -
aa9df74 B # B -
d133082 C # C -
5fd3d26 D # D -

git log --oneline --reverse -p

$ git log --oneline --reverse
cea1250 1st
442e07d A
aa9df74 B
d133082 C
5fd3d26 (HEAD -> main) D

// さらに、差分も表示!
$ git log --oneline --reverse -p

cea1250 1st
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8c0227d
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# rebase

442e07d A
diff --git a/README.md b/README.md
index 8c0227d..7f3b95d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# rebase
+# A

aa9df74 B
diff --git a/README.md b/README.md
index 7f3b95d..399d883 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# A
+# B

d133082 C
diff --git a/README.md b/README.md
index 399d883..57b8895 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# B
+# C

5fd3d26 (HEAD -> main) D
diff --git a/README.md b/README.md
index 57b8895..60afb60 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# C
+# D

Aを分割後のイメージは、こうしましょう!

ハッシュ値 コメント README.md 補足事項
cea1250 1st # rebase edit *
* A:new # A:new Aを、edit分割して、A:new
* A:org # A Aの内容は、変更せず。
aa9df74 B # B -
d133082 C # C -
5fd3d26 D # D -

コミットAの初期設定では、README.mdのファイルの中身は、"# A" となっています。
これを、"# A:new" と変更して、コメント、A:new で保存
次に、"# A"と変更して、コメント、A:org で保存してみましょう! こちらは、元のAと同じ内容にしているだけです。

git rebase -i --root

pick cea1250 1st
edit 442e07d A // <-- ここを、edit に変更
pick aa9df74 B
pick d133082 C
pick 5fd3d26 D

Esc + wq で、viの保存終了!

Stopped at 442e07d...  A // <-- このHEADの位置で、処理が止まっています!
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue

まずは、Stopped at 442e07d... A でHEADの位置、ハッシュ値の確認から!
実作業では、ついつい焦ってしまい、間違ったコマンドを入力する最悪のケースにも成りかねませんからね。(苦笑)

git log --oneline --reverse

$ git log --oneline --reverse
cea1250 1st
442e07d (HEAD) A // <-- HEADの位置を再確認!

$ cat README.md
# A // <-- README.md のファイルの中身も!

README.mdの中身も確認して、しっかり今のHEAD位置から、README.mdが取り出されていることも、理解を深める為に、最初は意識してくださいね。ちょっと、周り口説くなりますけど・・・

git status + git diff で、しっかりと認識!

$ git status
interactive rebase in progress; onto 9170e8e
Last commands done (2 commands done):
   pick cea1250 1st
   edit 442e07d A
Next commands to do (3 remaining commands):
   pick aa9df74 B
   pick d133082 C
  (use "git rebase --edit-todo" to view and edit)
You are currently editing a commit while rebasing branch 'main' on '9170e8e'.
  (use "git commit --amend" to amend the current commit)
  (use "git rebase --continue" once you are satisfied with your changes)

nothing to commit, working tree clean

$ git diff
// なにも差分は、なし!
// ここでは、Working tree と、Staging Area との比較です。
// 別名:Working tree = 作業エリア, Staging Area = インデックス

git reset HEAD^ で、HEADを一つ前に!

$ git reset HEAD^

Unstaged changes after reset:
M       README.md

$ git log --oneline --reverse
cea1250 (HEAD) 1st
// これで、HEADの位置が、1stに戻りました!

$ git diff
diff --git a/README.md b/README.md
index 8c0227d..7f3b95d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# rebase
+# A

Aを、A:newに変更して、add,commit --amend

$ echo "# A:new" > README.md
$ cat README.md
# A:new
// たまには、viを使わず、サクッと、echo で!(笑)

$ git add README.md
$ git commit -m "A:new"
[detached HEAD 43beecf] A:new
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git log --oneline --reverse
cea1250 1st
43beecf (HEAD) A:new // <-- A:new になりましたね!

元のAを、コミット add,commit -m "A"


$ echo "# A" > README.md
$ cat README.md
# A

// もちろん、こんな書き方でも、コミットAのREADME.md を、コピーできます!
// git restore --source=442e07d --worktree README.md
// 442e07d は、コミットAのハッシュ値です。

$ git add README.md
$ git commit -m "A:org"
[detached HEAD 0103c73] A:org
 1 file changed, 1 insertion(+), 1 deletion(-)
 
$ git log --oneline --reverse
cea1250 1st
43beecf A:new
0103c73 (HEAD) A:org // <!-- A:org になりました!

git rebase --continue で続きを!

$ git rebase --continue
Successfully rebased and updated refs/heads/main.
// 無事、rebaseが完了しました!

$ git log --oneline --reverse
cea1250 1st
43beecf A:new // <-- 追加されたコミット、README.mdの中身は、# A:new
0103c73 A:org  // <-- 元の内容、# A です。
9705579 B
4d15a77 C
927a1e6 (HEAD -> main) D

さらに、もう一度、差分も確認!

cea1250 1st
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8c0227d
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# rebase

43beecf A:new
diff --git a/README.md b/README.md
index 8c0227d..b06a12e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# rebase
+# A:new

0103c73 A:org
diff --git a/README.md b/README.md
index b06a12e..7f3b95d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# A:new
+# A

9705579 B
diff --git a/README.md b/README.md
index 7f3b95d..399d883 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# A
+# B

4d15a77 C
diff --git a/README.md b/README.md
index 399d883..57b8895 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# B
+# C

927a1e6 (HEAD -> main) D
diff --git a/README.md b/README.md
index 57b8895..60afb60 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# C
+# D

さあ、どうですか? ポイントは、Aの前に、A:newとして、新しい内容でコミットを追加していること、そして元のAを、A:orgとコメント名は変更しましたが、実際のファイルの中身は、"# A"のままで、変更していません。尚、README.mdファイルの中身を変更すると、今度は、AとBがコンフィクトとなり、マージ作業を求められてしまい、マージすると、Bが消えてしまいます。そして、次は、Cとのマージ、さらにDとのマージと続きます。ただ、おそらく実務においては、正しい処理なのでしょう。それが分かるようになるまでは、まだまだ先の事かもしれませんが、こうやって試して置けば、いざという時に動揺しなくなりますので、この機会に体験して置くことは、無駄にならいと思います。

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

https://zenn.dev/shiozumi/articles/2b6df7943f8640
https://twitter.com/esmile2013

脚注
  1. これらのマージが続く流れは、このrebaseのキモですね。毎度の差分管理を意識していれば、当然といえば、当然の事なんですけどね~ ↩︎

  2. git reset コマンドは、後日、またどこかで深堀してみたいと考えています。 ↩︎

Discussion