🗝️

Gitコマンド入門::rebase(-i,drop,#D)「第十七回」

2021/02/18に公開

みなさん、こんにちは! 前回は、rebase -i で、edit を試しましたが、少しは理解できましたか? 私もいくつかのケースに挑戦しましたけど、いやあ~難解な部分が、まだまだ多いイメージですね。ということで、editは後回し、、、(^^;; まずは、簡単な、drop からやって行きますね![1]

前回は、こちらです!

https://zenn.dev/shiozumi/articles/6c462fac625cd2

リポジトリーの初期化!

gitレポジトリーの初期化と設定ファイルは、以下のリンクからどうぞ!
https://gist.github.com/7993d2ea6751c22158407b9bf3669437.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 -ihelp ですね。
//
# 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

https://vim.jp.net/

ファイルを保存すると、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行まとめて削除など、各自、思いついたら復習してくださいね。
尚、一番新しいコミットを削除するのは、超簡単でお手軽です。

・・・だがしかし・・・

途中のコミットを削除すると、いきなり大量のメッセージが表示されて、マージのやり方次第では、泥沼にはまり、頭がカオス化しますので、要注意!
決して、ひとりでは試さないでください。キャー! 次回までのお楽しみ!(爆笑)

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

https://zenn.dev/shiozumi/articles/10c9c294537a24
https://twitter.com/esmile2013

脚注
  1. ちなみに、dropは、ちょっと複雑です。reword の次は、squash を覚えた方が良いと思います。まあ~、取り上げといて言うのもなんですけどね。 ↩︎

  2. 逆に言うと、表を作らないでコマンドを実行していると、頭の中がカオス化しますので、ご注意ください。うぅぅぅ・・・・わあ~!?・・・って感じです。 ↩︎

  3. 私の環境は、CentOS7.xなので、viエディターです。みなさんは、それぞれに合わせてください。 ↩︎

  4. この辺りの理解度は、しっかり身に着けて置きましょう。絶対に損しませんよ! ↩︎

Discussion