工作流练习

你的担心非常正确,必须立刻停止使用 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 选项,这比敲命令快得多。
相关推荐
手握风云-7 小时前
基于 Java 的网页聊天室(三)
服务器·前端·数据库
开开心心_Every8 小时前
限时免费加密、隐藏、锁定文件文件夹好工具
运维·服务器·人工智能·edge·pdf·逻辑回归·深度优先
FL4m3Y4n8 小时前
MySQL缓存策略
数据库·mysql·缓存
smchaopiao8 小时前
Python中字典与列表合并的问题与解决方法
开发语言·python
卡尔特斯8 小时前
Ultralytics YOLO26 自动对指定标注文件夹区分标注素材脚本与训练脚本
python·openai
2501_921649498 小时前
期货 Tick 级数据与基金净值历史数据 API 接口详解
开发语言·后端·python·websocket·金融·区块链
野犬寒鸦8 小时前
Redis复习记录day1
服务器·开发语言·数据库·redis·缓存
njidf8 小时前
实战:用Python开发一个简单的区块链
jvm·数据库·python
龙俊俊8 小时前
服务器模型部署与加载
服务器·人工智能·深度学习
Rick19938 小时前
慢SQL优化
数据库·python·sql