工作流练习

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

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

为什么会有问题?

git merge --squash master_dev 的逻辑是计算 master 和 master_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 (比如从 start 到 end):
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 值太累,推荐使用 WebStorm 或 SourceTree 等图形化工具。

  • 在工具里右键点击你的 Commit -> 选择 Cherry Pick -> 勾选 No Commit 选项,这比敲命令快得多。
相关推荐
前端精髓3 分钟前
动态选择工具
python·langchain
开开心心就好30 分钟前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节
你看我名字42 分钟前
Redis 高可用、持久化与故障切换:从缓存组件到云上基础设施
数据库·redis·缓存
weixin199701080161 小时前
官方授权通道和灰色爬虫,做数据服务该选哪条路(附 python 源码)
c++·爬虫·python
Ryan-Zhong1 小时前
数字人口播视频 API 实战:Python 跑通模板合成、异步轮询与批量出片
开发语言·python·音视频
quantdash_cc1 小时前
个人开发者用 QuantDash 读取港股行情:00700.HK 的 Python 函数封装与校验实践
python·数据分析·pandas·量化交易·股票数据·quantdash
fengci.1 小时前
CTF2困难部分
开发语言·网络·python·安全·php
小小张说故事1 小时前
Python 的 0.1 + 0.2 为什么不等于 0.3?拆开 IEEE 754 与那串死循环小数
后端·python
honsor1 小时前
以太网温湿度传感器|动环监控核心采集设备,协议、组网、Zabbix接入实战
linux·服务器·ubuntu