工作流练习

你的担心非常正确,必须立刻停止使用 merge --squash

在多人协作的共享分支(master_dev)上,直接对 master 使用 merge --squash 是一个极其危险的操作。

为什么会有问题?

git merge --squash master_dev 的逻辑是计算 mastermaster_dev 两个分支头部(Tip)之间的所有差异

如果 master_dev 上除了你的代码,还有同事 A 的功能代码、同事 B 的 Bug 修复(而这些代码目前都在测试中,还没准备好上生产),一旦你执行了这个命令:

  1. 你会在不知情的情况下,把同事 A 和 B 的代码全部"偷"过来。
  2. 这些未经验证的代码会被混在你的 MR 里一起上线。
  3. 这将导致严重的生产事故(污染生产环境)。

正确方案:使用"拣选模式" (Cherry-Pick Strategy)

针对你的场景(多人混杂分支 + 需要 Squash + 只需要合入你的代码),最安全、专业的做法是:基于生产基线,只"挑"出你自己的 Commit。

推荐使用带 -n 参数的 Cherry-Pick。

第一步:准备干净的生产基线分支

这就相当于准备一个干净的盘子,用来装你的菜。

bash 复制代码
# 1. 切换到 master 并保证最新
git checkout master
git pull upstream master

# 2. 基于 master 创建一个新的发布分支(用于提MR)
git checkout -b feature/release-my-feature
第二步:精准"拣选"你的代码 (核心步骤)

我们需要把你散落在 master_dev 上的那几十个 Commit 挑出来,同时利用 -n 参数实现"Squash"的效果。

命令解释:

  • git cherry-pick <commit-id>: 把某个提交再重放一遍。
  • -n (no-commit): 关键参数 。它会把代码改动拿过来放到"暂存区",但不自动生成 Commit

操作方式:

  1. 查看你的提交记录
    先去 git log 或者在 VS Code / SourceTree 里找到你所有提交的 Commit Hash(哈希值)。
  2. 执行拣选
    假设你开发该功能一共提交了 3 次,Hash 分别是 aaaaa, bbbbb, ccccc (按时间顺序)。
bash 复制代码
# 注意:一定要按提交的时间顺序,从最早的开始挑
# 加上 -n 参数,这样它们不会产生 3 个 commit,而是全部堆在暂存区
git cherry-pick -n aaaaa
git cherry-pick -n bbbbb
git cherry-pick -n ccccc
  • 如果是连续的一大段 Commit (比如从 startend):
bash 复制代码
# 拣选一个范围 (注意:左开右闭,start 本身不包含,如果包含 start 需要用 start^)
git cherry-pick -n start_commit_hash^..end_commit_hash
第三步:解决冲突

在 Cherry-Pick 的过程中,如果你的代码和 master 上的现有代码有冲突,Git 会停下来让你解冲突。

  • 解完冲突后,不要 运行 git commit
  • 运行 git add . 把解完的文件标记好。
  • 如果是中途停下,可能需要 git cherry-pick --continue(但在 -n 模式下,通常你只需要保证最后暂存区是对的即可)。
第四步:一次性提交 (实现 Squash)

当你把你所有的 Commit 都 Pick 完之后,现在你的暂存区里就是:
最新生产代码 + 你的完整功能代码(同事的代码完全没被包含进来)。

此时,执行一次提交:

bash 复制代码
git commit -m "feat: [生产合入] 完成某某核心功能,已自测通过"
第五步:推送到远程提 MR
bash 复制代码
git push origin feature/release-my-feature

总结

  • Merge --squash :是"一网打尽",适合单人分支合并。共享分支严禁使用。
  • Cherry-pick -n :是"精准萃取",适合从大杂烩分支里只把你的功能提取出来,并且还能顺便把 Commit 合并成一个,完美符合你的需求。

Tips:

如果在命令行里找 Hash 值太累,推荐使用 WebStormSourceTree 等图形化工具。

  • 在工具里右键点击你的 Commit -> 选择 Cherry Pick -> 勾选 No Commit 选项,这比敲命令快得多。
相关推荐
007张三丰4 小时前
软件测试专栏(11/20):测试框架开发:pytest深度解析与插件体系
运维·服务器·自动化测试·pytest·测试框架
biter down4 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
weixin_604236675 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
鹤落晴春6 小时前
【Linux复习】管理SELinux安全性
linux·运维·服务器
肖永威6 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册
yz_aiks6 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
不知名的老吴6 小时前
线程的生命周期之线程“插队“
java·开发语言·python
xsc6996757 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
无风听海9 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者9 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链