🗝️

Gitコマンド入門::rebase(-i,squash,fixup)「第二十五回」

3 min read

みなさん、こんにちは! ここまで、dropやコミット分割、コミットの入れ替えと、かなり複雑な操作から初めてしまい、ちょっと選択の順番を誤った感じもしています。(苦笑)
ということで今回は、おそらく特に問題なく、スパッと完了しそうなコマンド、squash,fixup を試して行きましょう!

前回の記事は、こちら!

https://zenn.dev/shiozumi/articles/2b6df7943f8640

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

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

今回は、前回のサンプルに似たリポジトリーで試します。

echo "# squash fixup" >> README.md
git add README.md
git commit -m "1st"

echo "A" >a.txt
git add a.txt
git commit -m "A"

echo "B" >b.txt
git add b.txt
git commit -m "B"

echo "C" >c.txt
git add c.txt
git commit -m "C"

squash,fixup は、コミットをまとめる操作なので、ファイルの差分があれば、当然、マージコンフィクトになりますから、まずは、簡単なケースで試しましょう!

こんな感じに初期化してあります!

ハッシュ値 コメント ファイルの中身 補足事項
3d996c0 1st # quash fixup README.md を追加
1a4dbc4 A A a.txt を追加
cbfc283 B B b.txt を追加
8abaa05 C C c.txt を追加
$ git log --oneline --reverse
3d996c0 1st
1a4dbc4 A
cbfc283 B
8abaa05 (HEAD -> main) C

$ git log --oneline --reverse -p
3d996c0 1st
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..78babe5
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# quash fixup

1a4dbc4 A
diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..f70f10e
--- /dev/null
+++ b/a.txt
@@ -0,0 +1 @@
+A

cbfc283 B
diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..223b783
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+B

8abaa05 (HEAD -> main) C
diff --git a/c.txt b/c.txt
new file mode 100644
index 0000000..3cc58df
--- /dev/null
+++ b/c.txt
@@ -0,0 +1 @@
+C

それでは、squash fixup を試して行きましょう!


$ git rebase -i --root

// vi エディター起動!

pick 3d996c0 1st
squash 1a4dbc4 A  // <-- ここを、squash に変更!
pick cbfc283 B
pick 8abaa05 C

Esc + wq // 編集内容を更新して終了!

// また、viが起動して、コメントの変更を求められる

# This is a combination of 2 commits.
# This is the 1st commit message:

// コメント文章のマージを求めらるので、以下の5行を削除!
-1st
-
-# This is the commit message #2:
-
-A

// まとめたコメントを追加!
+1st + A

Esc + wq // 編集内容を更新して終了!

[detached HEAD 717986f] 1st + A
 Date: Wed Feb 24 13:02:18 2021 +0900
 2 files changed, 2 insertions(+)
 create mode 100644 README.md
 create mode 100644 a.txt
Successfully rebased and updated refs/heads/main.

// 最終確認をして完了!
$  git log --oneline --reverse
717986f 1st + A
bc99c63 B
940b150 (HEAD -> main) C

// それぞれのコミットにHEADを移動させて、ファイルの存在を確認
$ git reset --hard 717986f
HEAD is now at 717986f 1st + A
$ ls
README.md  a.txt // <-- 思ったイメージ通り、2つのファイルになりました。

$ git reset --hard bc99c63
HEAD is now at bc99c63 B
$ ls
README.md  a.txt  b.txt // <-- b.txt が追加されて、3ファイル

$ git reset --hard 940b150
HEAD is now at 940b150 C
$ ls
README.md  a.txt  b.txt  c.txt // <-- c.txt が追加されて、4ファイル

同じように、fixup も実行してみてください。

// 初期状態の位置にHEADを戻して!
git reset --hard 8abaa05

// rebase 実行!
$ git rebase -i --root

// vi エディター起動!
pick 3d996c0 1st
fixup 1a4dbc4 A // <-- ここを、fixup に変更!
pick cbfc283 B
pick 8abaa05 C

Esc + wq // 編集内容を更新して終了!

// 今回は、squashと動作が異なり、コメントの変更は、求められません。

Successfully rebased and updated refs/heads/main.

$ git log --oneline --reverse
c418110 1st
d72e657 B
c7c9fe4 (HEAD -> main) C

$ git reset --hard c418110 
HEAD is now at 717986f 1st + A
$ ls
README.md  a.txt // <-- 思ったイメージ通り、2つのファイルになりました。

fixupも動作は、ほぼ同じですね。コメントのマージが、省略されてしまうだけです。

さあ、いかがでしょうか? とても簡単にコミットをまとめることができますね。後で、複数行を、squash の設定をしてみたりなど、みなさんも、いろいろ試してください。尚、使い方としては、自分のローカルでの修正作業にて小まめにコミットしたとき、ローカルのリポジトリーの整理として使うことになりそうです。まあ、リモートリポジトリーに、なんでもかんでも闇雲に全てのコミットをpushするのも、マナー違反なんでしょうね。[1](苦笑)

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

https://zenn.dev/shiozumi/articles/ae04f108c6948d
https://twitter.com/esmile2013
脚注
  1. 尚、この時点での私は、実務でgitを使っている訳ではありませんので悪しからず。 ↩︎

Discussion

ログインするとコメントできます