惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
S
SegmentFault 最新的问题
量子位
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
博客园 - Franky
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
B
Blog RSS Feed
C
Check Point Blog
The Cloudflare Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
V
Visual Studio Blog
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

吐槽大王部落格

群宠 Bot 塑料碗开发记 (Phase 1) 在 X (Twitter) 上找 IT 工作靠谱吗? 我的 2025 我在经营自己的社交帐号,但可能「玩脱了」 我依然没有学会怎么在网上提出技术问题 我是怎么差点被恶意 npm 包攻击的 我对 Vue Router「动态路由」的一点暴论 不用 eas-cli 编译 React Native (Expo) 应用的 Android 版本 【更正版】简单实现类型安全的、能触发 CustomEvent 的 EventTarget 在 IE11 使用 CSS Grid 实现多列卡片列表布局 自建云游戏服务的尝试(2024 更新) 在 Termux 编译和使用 bwm-ng(需要 root) 如何在已有的 Vue CLI 项目使用 esbuild 我的 2021 npm、镜像源与 package-lock.json 新的桌面工作站:HP Z2 G5 Tower 我的 2020 在 Intel 版 MacBook Pro 以 EFI 的形式安装 Windows 10 为什么大家都在安利这一样东西? 新的家庭服务器:MicroServer Gen10 我的 2019 在树莓派(Raspbian)上安装最新稳定版 nginx 驾照 宿舍用小型 UPS 电源与新台灯 拆解我爸 2010 年装的廉价 PC 我的 2018 2018 厦门面基记 我(曾经)设想过的外置智能大脑 没用的无懈可击 tcdw 与 ECMAScript
如何在上游分支被反复重写时优雅地 Rebase
tcdw · 2026-01-02 · via 吐槽大王部落格

最近在处理代码合并时踩了一个大坑,花了 1 小时 20 分钟才解决完冲突。

背景

我的开发分支 feature/my-feature 是基于同事的分支 feature/their-feature 开发的。按计划,同事的分支会先合并进 master。 棘手的地方在于,同事在合并前对他的分支进行了大量的重写操作(Squash、Drop、Reorder),导致 commit hash 全部变了。

如果这时候我硬生生地直接 git rebase 他的新分支,Git 会试图去合并那些其实已经存在但 hash 不同的提交,导致冲突处理起来简直是灾难。

后来我发现,正确的方法是使用 Linux 项目同款的、听起来很古早的方法:手动打 Patch(补丁)。与其在混乱的提交历史中痛苦 Rebase,不如把我的改动剥离出来,再重新打上去。

具体步骤

首先把我的独有改动导出为 patch 文件。假设我基于他之前的版本新增了 18 个 commit:

git format-patch -18 HEAD
# 建议把生成的 .patch 文件移动到一个临时目录,保持清爽

然后,放弃当前混乱的时间线,重置到旧版本,并拉取最新的上游代码:

git reset --hard <某个足够旧的commit>
git fetch
# 这一步把基准切换到同事重写历史后的新分支
git rebase origin/feature/their-feature

接下是最重要的一步,使用 git am 应用补丁,并加上 -3 参数

git am -3 /path/to/0001-foo.patch

-3 参数在这里非常关键。开启这个参数以后,当补丁冲突时,我可以打开 Sublime Merge,看着熟悉的界面从容地解决冲突,而不是对着一堆 .rej 文件发呆。

解决完冲突后直接 git am --continue,检查功能正常,再把第二个、第三个补丁……用同样的方式打上去。

所有补丁打好以后,直接 git push --force-with-lease 就可以了!好耶!