HOWTO · Git

Git Squash ブランチのすべてのコミット

すべてのコミットを 1つのコミットに押しつぶす

この記事では、実行されたすべてのコミットを 1つのコミットにまとめる手順を説明します。

機能ブランチで多数のコミットを行ったとすると、このブランチのすべてのコミットを 1つのコミットにグループ化してクリーンアップする必要があります。Git はそれを押しつぶしと呼んでいます。

すべてのコミットを潰すためのアイデアは次のとおりです。

  1. ソフトリセットですべての変更をリセットします。
  2. 変更を追加し直します。
  3. 新しいメッセージでコミットします。

Git ソフトリセットの変更

ソフトリセットは、新しく追加されたファイルを削除せずに、すべてのコミットを元に戻します。

そのためには、機能ブランチのベースとなるオリジンコミットを見つける必要があります。これは通常、main などのオリジンブランチの名前です。

$ git log
commit a856ee456967a942ab379b27a4839962f88b92ce (HEAD -> feature/long-features)
Author: Cuong Nguyen
Date:   Mon Dec 27 20:53:18 2021 +0700

    Feature 2.3

commit 6f1599a18691906ed148dc40d2d290aaeceeaa5c
Author: Cuong Nguyen
Date:   Mon Dec 27 20:53:03 2021 +0700

    Subfeature 2

commit 94e35bae85f395c62fdaaa1aeaedbb11d2c94375
Author: Cuong Nguyen
Date:   Mon Dec 27 20:52:39 2021 +0700

    Subfeature 1

commit 9265e3bd97863fde0a13084f04163ceceff9a9d0 (grafted, tag: v1.0.0, branch-off-from-tag-v1.0.0)
Author: Cuong Nguyen
Date:   Sun Dec 19 19:33:07 2021 +0700

    Merge pull request #1 from stwarts/feature/shared-branch

この例では、ブランチ feature/long-features がコミット SHA 9265e3bd97863fde0a13084f04163ceceff9a9d0(またはブランチ名 branch-off-from-tag-v1.0.0 からチェックアウトされていることがわかります。

すべての変更をリセットするには、git reset --soft 9265e3bd97863fde0a13084f04163ceceff9a9d0 または git reset --soft branch-off-from-tag-v1.0.0 のいずれかを使用します

$ git reset --soft 9265e3bd97863fde0a13084f04163ceceff9a9d0
$ git status
On branch feature/long-features
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   sub_feature_1.txt
	new file:   sub_feature_2.txt

--soft オプションは、コミットをリセットして新しいファイルを保持する git を指定します。

変更を追加し直す

git add -A は使用するコマンドです

-A オプションは、すべての変更が追加されることを指定します。

コミット

最後のステップは、git commit -m <message> を使用して新しいコミットを生成することです。

$ git commit -m 'Squash 3 commits into 1'
[feature/long-features 8cc336c] Squash 3 commits into 1
 2 files changed, 2 insertions(+)
 create mode 100644 sub_feature_1.txt
 create mode 100644 sub_feature_2.txt
$ git log
commit 8cc336c6d1b2e6ed55470f99b040d6835ec655e5 (HEAD -> feature/long-features)
Author: Cuong Nguyen <cuong.nguyen@oivan.com>
Date:   Mon Dec 27 21:07:54 2021 +0700

    Squash 3 commits into 1

commit 9265e3bd97863fde0a13084f04163ceceff9a9d0 (grafted, tag: v1.0.0, branch-off-from-tag-v1.0.0)
Author: Nguyễn Phú Cường <npcuong.011308@gmail.com>
Date:   Sun Dec 19 19:33:07 2021 +0700

    Merge pull request #1 from stwarts/feature/shared-branch