工作流练习

你的担心非常正确,必须立刻停止使用 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 选项,这比敲命令快得多。
相关推荐
云服务器租用费用2 小时前
2026年零基础部署OpenClaw(前身为Clawdbot)+接入微信保姆级教程
服务器·人工智能·云原生·飞书·京东云
西柚云2 小时前
告别命令行!在VSCode中直接使用Claude Code编程
服务器·ide·vscode·编辑器·claude
一次旅行2 小时前
接口自动化测试模板
数据库·python·pytest
Suryxin.2 小时前
从0开始复现nano-vllm「model_runner.py」上半篇之初始化分布式推理环境
人工智能·python·深度学习·机器学习·vllm
奔跑的蜗牛FelixChioa2 小时前
python学习之快速掌握 pandas 数据可视化:「matplotlib+seaborn」极简实战方案
python·pandas·数据可视化
想睡hhh2 小时前
redis的高效工作方式
数据库·redis·缓存
Linux运维技术栈2 小时前
禅道一键包:跨服务器迁移 + 迁移至LVM分区 实战运维笔记
运维·服务器·禅道
桂花饼2 小时前
Sora-2 API 低成本接入指南:Python 实现 0.08 元/次的视频生成方案
人工智能·python·qwen3-next·nano banana pro·gemini-3-pro·sora2pro
一匹电信狗2 小时前
【Linux我做主】从 fopen 到 open:Linux 文件 I/O 的本质与内核视角
linux·运维·服务器·c++·ubuntu·小程序·开源