Git 壓縮分支上的所有提交

Stewart Nguyen 2023年1月30日 2022年4月22日
  1. Git 軟重置更改
  2. 新增回更改
  3. 提交
Git 壓縮分支上的所有提交

本文將指導將所有已完成的提交壓縮為單個提交。

假設我們在一個特性分支上做了一堆提交,現在我們需要通過將這個分支上的所有提交分組到一個提交中來清理它。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 9265e3bd97863fde0a13084f04163ceceff9a9d0git 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