[Git] git merge之squash

本文介绍了Git中使用--squash选项进行分支合并的方法与原则。当开发分支提交随意时,使用--squash可以简化历史记录;而当每个提交都有独立意义时,则保持原始历史。文章详细解释了如何使用--squash选项及其实现的效果。

reference : https://www.cnblogs.com/ungshow/p/3515161.html

看CM源码时,发现历史记录里有很多squash,于是google了解了一下。

Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如:

$ git checkout another
# modify, commit, modify, commit ...
$ git checkout master
$ git merge another

 但是,操作方便并不意味着这样操作就是合理的,在某些情况下,我们应该优先选择使用--squash选项,如下:

$ git merge --squash another
$ git commit -m "message here"

 --squash 选项的含义是:本地文件内容与不使用该选项的合并结果相同,但是不提交、不移动HEAD,因此需要一条额外的commit命令。

其效果相当于将another分支上的多个commit合并成一个,放在当前分支上,原来的commit历史则没有拿过来。

    Note:

    判断是否使用--squash选项最根本的标准是,待合并分支上的历史是否有意义。

 

如果在开发分支上提交非常随意,甚至写成微博体,那么一定要使用--squash选项。版本历史记录的应该是代码的发展,而不是开发者在编码时的活动。

只有在开发分支上每个commit都有其独自存在的意义,并且能够编译通过的情况下(能够通过测试就更完美了),才应该选择缺省的合并方式来保留commit历史。

 

### GitMerge、Rebase 和 Squash and Merge 的区别及用法 #### 合并操作 (Merge) 当运行 `git merge` 命令时,会创建额外的合并提交。这有助于保留完整的分支历史记录,在团队协作环境中尤其重要。然而,在本地仓库工作时,过多的合并提交可能会使提交历史变得混乱[^1]。 ```bash # 创建一个新的特性分支 $ git checkout -b feature_branch # 开发完成后切换回主分支准备合并 $ git checkout main # 将特性分支合并到主分支 $ git merge feature_branch ``` #### 变基操作 (Rebase) 为了避免不必要的合并提交,可以采用变基的方式。通过执行 `git rebase` 而不是直接合并,能够将当前分支上的更改应用到目标分支顶部,从而保持线性的项目历史。这种方式使得历史更加清晰易读。 ```bash # 切换至要变基的目标分支上 $ git checkout target_branch # 执行交互式变基来整理提交信息 $ git rebase -i HEAD~N # N表示最近几次提交的数量 ``` #### 平坦化合并 (Squash and Merge) 对于希望简化多条提交的情况,可以选择使用 `git merge --squash` 或者在交互模式下进行变基 (`git rebase -i`) 来实现平坦化的单次大提交效果。这两种方法都可以生成一个压缩后的提交版本[^2]。 ```bash # 使用 squash 方式合并分支 $ git merge --squash source_branch # 提交这些改动作为单一的新提交 $ git commit ``` 或者: ```bash # 进入交互式的变基过程指定哪些提交需要被压平 $ git rebase -i HEAD~N ``` 每种方式都有其适用场景:如果重视维护原始的历史结构,则应优先考虑常规的合并;而对于追求简洁明了的日志展示来说,变基或是平坦化可能是更好的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值