开发时,功能分支落后于 main,需要同步最新代码。你可能会遇到两个命令:git merge 和 git rebase。它们都能整合分支,但处理提交历史的方式不同。

1. git merge:保留分支合并过程
假设你在 feature/login 开发登录功能,而 main 已经有了新的提交。可以把功能分支合并到 main:
bash
git switch main
git merge feature/login
如果需要把 main 的最新改动同步到功能分支,也可以执行:
bash
git switch feature/login
git merge main
merge 会整合两个分支的历史;如果不能快进合并,通常会创建一个新的合并提交(merge commit),保留分支分叉和汇合的记录。
2. git rebase:把提交"接"到新基底上
如果希望功能分支的提交历史更线性,可以在功能分支上执行:
bash
git switch feature/login
git rebase main
Git 会把功能分支上的提交逐个重新应用到 main 最新提交之后。结果看起来就像你是在最新的 main 上开发的一样。
注意:rebase 会生成新的提交对象,因此被重写的提交 ID 通常会改变。它不是简单地把分支指针挪一下。
3. 两者有什么区别?
| 对比 | merge |
rebase |
|---|---|---|
| 提交历史 | 保留分支汇合过程 | 通常更线性 |
| 是否通常创建合并提交 | 非快进合并时会 | 不会因 rebase 本身创建 merge commit |
| 是否重写已有提交 | 不会 | 会重新生成被重放的提交 |
| 常见用途 | 团队协作、整合共享分支 | 整理个人功能分支历史 |
| 共享分支使用 | 通常合适 | 要谨慎,避免改写他人基于其开发的历史 |
4. 冲突怎么处理?
两种操作都可能出现冲突,但继续执行的命令不同。
merge 冲突:
bash
# 手动解决冲突后
git add <file>
git merge --continue
也可以在合并状态下使用 git commit 完成合并,具体按 Git 提示操作。
rebase 冲突:
bash
# 手动解决冲突后
git add <file>
git rebase --continue
如果决定放弃本次 rebase,可以使用 git rebase --abort 返回操作前的状态。
5. 到底应该用哪个?
- 自己的本地功能分支,想让历史更清晰: 可以使用
rebase。 - 需要保留分支汇合过程,或整合团队共享分支: 通常使用
merge。 - 分支已经推送,其他人可能基于它继续开发: 不要随意 rebase;如果确实需要改写历史,先和团队确认并协调后续同步方式。
简单来说,merge 更侧重保留真实的分支整合历史,rebase 更侧重整理成线性的提交历史。两者没有绝对的优劣,关键是遵循项目的协作约定。
总结
git merge feature/login:把功能分支整合到当前分支。git rebase main:把当前分支的提交重新应用到main的最新提交之后。
本地个人分支可以考虑 rebase;共享分支优先避免重写历史。 无论选择哪一种,发生冲突时都要检查最终代码并运行相关测试。