Git 压缩分支上的所有提交
Stewart Nguyen
2023年1月30日
本文将指导将所有已完成的提交压缩为单个提交。
假设我们在一个特性分支上做了一堆提交,现在我们需要通过将这个分支上的所有提交分组到一个提交中来清理它。Git 称之为压缩。
压缩所有提交的思路如下。
- 使用软重置重置所有更改。
- 重新添加更改。
- 提交新消息。
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