🗝️
Gitコマンド入門::rebase(-i,drop,#D)「第十七回」
みなさん、こんにちは! 前回は、rebase -i で、edit を試しましたが、少しは理解できましたか? 私もいくつかのケースに挑戦しましたけど、いやあ~難解な部分が、まだまだ多いイメージですね。ということで、editは後回し、、、(^^;; まずは、簡単な、drop からやって行きますね![1]
前回は、こちらです!
リポジトリーの初期化!
gitレポジトリーの初期化と設定ファイルは、以下のリンクからどうぞ!
リポジトリーは、このような状態になります。
$ git log -p --oneline --reverse
c0f998d 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
0fa830d A
diff --git a/README.md b/README.md
index 8c0227d..7f3b95d 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# rebase
+# A
f8b5ccd B
diff --git a/README.md b/README.md
index 7f3b95d..399d883 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# A
+# B
2d138a2 C
diff --git a/README.md b/README.md
index 399d883..57b8895 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# B
+# C
cb468d1 (HEAD -> main, origin/main) D
diff --git a/README.md b/README.md
index 57b8895..60afb60 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# C
+# D
再度、簡易表示で確認。
$ git log --oneline --reverse
c0f998d 1st
0fa830d A
f8b5ccd B
2d138a2 C
cb468d1 (HEAD -> main, origin/main) D
実際のREADME.mdの中身は、以下のようになっています。
ハッシュ値 | コメント | README.md |
---|---|---|
c0f998d | 1st | # rebase |
0fa830d | A | # A |
f8b5ccd | B | # B |
2d138a2 | C | # C |
cb468d1 | D | # D |
git rebase -i --root を実行!
全てのコミットを編集対象とするので、--root で実行します!
$ git rebase -i --root
vi エディターが起動して、このような画面になります!
//
// 左から、コマンド、hash値、コメント、README.mdのファイルの中身です。
//
pick c0f998d 1st // <-- # rebase
pick 0fa830d A // <-- # A
pick f8b5ccd B // <-- # B
pick 2d138a2 C // <-- # C
pick cb468d1 D // <-- # D
// まずは、イメージを固めるためにも、補足事項を付け足しました!
// 並び順も、上から古いもの、一番下が、最新のコミットです。
//
// 以下は、rebase -i の help ですね。
//
# Rebase cb468d1 onto 2d138a2 (5 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
README.md は、後から私が追記してあります。実際には、ファイルの中身は、表示されません。
それでは、初歩の初歩!
まずは、一番下の行、「cb468d1 D」を、pick から、drop に変更してみましょう!
pick c0f998d 1st
pick 0fa830d A
pick f8b5ccd B
pick 2d138a2 C
drop cb468d1 D // <-- pick から、drop に変更
// Esc + wq
ファイルを保存すると、Successfully と表示!
Successfully rebased and updated refs/heads/main.
// さっそく、git log で確認!
$ git log --oneline --reverse
c0f998d 1st
0fa830d A
f8b5ccd B
2d138a2 (HEAD -> main) C
// ファイルの中身も!
$ cat README.md
# C
// これで予想通り、cb468d1 D が削除されました。
// README.md の中身も、# C となりました!!
とっても簡単ですね。もう一度、試してみましょう!
もちろん元に戻すコマンドは、こちらが超便利!
git reset --hard cb468d1
ハッシュ値が分からなくなってしまったら、git reflog
ですね。[4]
$ git reflog
// 中略 ~
cb468d1 (origin/main) HEAD@{47}: commit: D
// commit: D が目印ですよ!
$ git reset --hard cb468d1
HEAD is now at cb468d1 D
$ git log --oneline --reverse
c0f998d 1st
0fa830d A
f8b5ccd B
2d138a2 C
cb468d1 (HEAD -> main, origin/main) D
// はい!元通り!(^^)v
では、再度! git rebase -i 0fa830d を実行!
今度は、--root ではなく、ハッシュ値で、0fa830d を指定して実行してみましょう!
尚、Aを含むためには、ひとつ前を指定する必要がありますので、0fa830d~1 となります。
$ git rebase -i 0fa830d~1
vi エディターが起動して、今度は、こんな画面ですね!
//
// 左から、コマンド、hash値、コメント
//
pick 0fa830d A
pick f8b5ccd B
drop 2d138a2 C // <-- pick から、drop に変更
drop cb468d1 D // <-- pick から、drop に変更
// Esc + wq
// 今度は、1st が選択対象から外れて、A~Dの4コミットですね。
Successfully rebased and updated refs/heads/main.
$ git log --oneline --reverse
c0f998d 1st
0fa830d A
f8b5ccd (HEAD -> main) B
// ファイルの中身も!
$ cat README.md
# B
// これで予想通り、2d138a2 cb468d1 の2コミットが削除されました。
// README.md の中身も、# B ですね!
さあ~、あとで、3行まとめて削除など、各自、思いついたら復習してくださいね。
尚、一番新しいコミットを削除するのは、超簡単でお手軽です。
・・・だがしかし・・・
途中のコミットを削除すると、いきなり大量のメッセージが表示されて、マージのやり方次第では、泥沼にはまり、頭がカオス化しますので、要注意!
決して、ひとりでは試さないでください。キャー! 次回までのお楽しみ!(爆笑)
それでは、今回はここまで! お疲れ様でした!
Discussion