🗝️
Gitコマンド入門::rebase(-i,squash,fixup)「第二十五回」
みなさん、こんにちは! ここまで、dropやコミット分割、コミットの入れ替えと、かなり複雑な操作から初めてしまい、ちょっと選択の順番を誤った感じもしています。(苦笑)
ということで今回は、おそらく特に問題なく、スパッと完了しそうなコマンド、squash,fixup を試して行きましょう!
前回の記事は、こちら!
git本家本元の情報はこちらから!
今回は、前回のサンプルに似たリポジトリーで試します。
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つのファイルになりました。
さあ、いかがでしょうか? とても簡単にコミットをまとめることができますね。後で、複数行を、squash の設定をしてみたりなど、みなさんも、いろいろ試してください。尚、使い方としては、自分のローカルでの修正作業にて小まめにコミットしたとき、ローカルのリポジトリーの整理として使うことになりそうです。まあ、リモートリポジトリーに、なんでもかんでも闇雲に全てのコミットをpushするのも、マナー違反なんでしょうね。[1](苦笑)
それでは、今回はここまで、お疲れ様でした!
-
尚、この時点での私は、実務でgitを使っている訳ではありませんので悪しからず。 ↩︎
Discussion