当前位置:首页 > 技术 > 正文内容

git merge --squash 和 git merge 的区别

代码老兵 技术 23

区别

git merge --squash 会把一个分支的所有提交“压扁成一次提交”,但不会保留分支历史;
git merge 会完整保留分支上的每一次提交和分支结构。


区别对比表

对比点git mergegit merge --squash
提交历史保留全部 commit不保留原 commit
是否生成 merge commit通常 ✓(除 fast-forward)不生成
提交作者信息原作者全部保留只保留 squash 后的作者
git log 是否能看到分支能看到看不到
git blame 友好度较低
是否自动 commit否(需手动 commit)
是否记录“已合并状态”

1.  普通 git merge(保留历史)

命令

git checkout main
git merge feature/login

发生什么?

  • feature/login每一个 commit 都进入 main

  • 可能生成一个 merge commit

  • Git 知道这个分支已经合并过

提交历史示意

A---B---C---M
    \     /
     D---E

适合场景

团队协作
需要保留开发过程
代码审计 / 回溯
长期维护项目


2.  git merge --squash(压缩提交)

命令

git checkout main
git merge --squash feature/login
git commit -m "Add login feature"

发生什么?

  • Git 把 feature/login 的代码改动一次性应用

  • 不带任何 commit 历史

  • 需要你 手动提交

提交历史示意

A---B---C---S

S = squash 后的一次提交

Squash merge 不会记录分支已合并

意味着:

git merge --squash feature/login

之后:

git merge feature/login

Git 会认为它从没合并过!

这可能导致:

  • 重复冲突

  • 重复代码

通常 squash 后应删除 feature 分支


3.  fast-forward merge

如果 main 没有新提交:

git merge feature/login

会变成:

A---B---C---D---E

无 merge commit
历史非常干净


4.  GitHub / GitLab 上的 Squash Merge

平台上的 Squash and merge

  • 原理等同 git merge --squash

  • 但:

    • 会记录 PR 关联关系

    • 更安全

    • 更推荐


5.  什么时候用 squash?什么时候不用?

适合用 squash 的场景

功能分支提交杂乱
修 bug 提交很多
“WIP / fix typo / try again”
主分支追求 线性历史

主分支只关心“做了什么”,不关心“怎么的”


不适合 squash 的场景

需要详细开发历史
开源项目
长期维护分支
需要精确 blame


6.  团队策略

最常见、最好用

  • feature 分支:随便 commit

  • 合并到 main:Squash merge

  • main 永远干净、线性


标签: git

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。