Gitコマンド入門::rebase(-i,edit,コミット分割)「第二十三回」
みなさん、こんにちは! 今日は、コミット分割に挑戦して行きます。rebase コマンドで任意の過去のコミットに戻り、それを分割しますよ! まあ、実務で使うときがくるのかどうかは分かりませんけど、、、「rebaseコマンドは、こんなこともできるんですね!」って感じで体験しておくと、gitに慣れていくのが楽しくなることだけは間違いありませんよ!(爆笑)
ちなみに、ここまでは、README.md 単体ファイルのみを扱って来ましたけど、当然、普段の開発では、複数ファイルですね。その点を省いて学習してきましたから、実は、コマンドの習得過程に置いても、手落ちの部分が残っています。そのあたりの補足も、徐々に追加して行きたいとも考えておりますので、どうぞ、よろしくお願いいたします。
前回の記事はこちらから!
git本家本元の情報はこちらから!
初期値は、このようになっています。
ハッシュ値 | コメント | 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とのマージと続きます。ただ、おそらく実務においては、正しい処理なのでしょう。それが分かるようになるまでは、まだまだ先の事かもしれませんが、こうやって試して置けば、いざという時に動揺しなくなりますので、この機会に体験して置くことは、無駄にならいと思います。
それでは、今回はここまで、お疲れ様でした!
Discussion