工作流练习

你的担心非常正确,必须立刻停止使用 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 小时前
Python 内存手术刀:sys.getrefcount 与引用计数的生死时速
后端·python
明月_清风2 小时前
Python 消失的内存:为什么 list=[] 是新手最容易踩的“毒苹果”?
后端·python
Flittly16 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent
千寻girling20 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
databook1 天前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
明月_清风1 天前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风1 天前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
helloweilei2 天前
python 抽象基类
python
用户8356290780512 天前
Python 实现 PPT 转 HTML
后端·python
zone77392 天前
004:RAG 入门-LangChain读取PDF
后端·python·面试