元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
概念理解
版本控制系统介绍
Git与其他VCS的区别
仓库、工作区与暂存区
▶
安装配置
各平台安装指南
初始配置与别名设置
SSH密钥管理
▶
常用命令
提交工作流(add/commit)
分支操作(branch/checkout)
合并与变基(merge/rebase)
远程仓库操作(remote/push/fetch)
▶
高级技巧
标签管理
子模块使用
钩子脚本开发
历史重写(reflog/reset)
▶
故障排除
常见错误解决方案
二分法调试(bisect)
恢复丢失的提交
发布时间:
2025-03-23 12:07
↑
☰
# Git合并与变基 ## 概述 Git提供了两种整合不同分支的方法:合并(merge)和变基(rebase)。这两种方法各有优势,选择合适的方法可以让代码历史更加清晰,提高团队协作效率。 ## 分支合并(Merge) ### 1. 基本概念 合并是将两个或多个开发历史连接在一起的操作。当你完成某个功能的开发,需要将其整合到主分支时,就需要进行合并操作。 ### 2. 合并类型 #### 快进合并(Fast-forward) - 当前分支的提交是目标分支的直接后继时 - 不会创建新的提交 - 直接将当前分支指针向前移动 ```bash # 执行快进合并 git merge feature-branch # 禁用快进合并 git merge --no-ff feature-branch ``` #### 三方合并(Three-way Merge) - 当两个分支都有新的提交时 - 创建一个新的合并提交 - 包含两个父提交 ### 3. 合并命令 ```bash # 基本合并命令 git merge <branch-name> # 使用指定的提交信息 git merge -m "merge message" <branch-name> # 压缩合并历史 git merge --squash <branch-name> # 中止合并 git merge --abort ``` ### 4. 合并策略 - resolve: 两个分支的合并 - recursive: 多个分支的合并(默认) - octopus: 多于两个分支的合并 - ours: 忽略其他分支的修改 - subtree: 子树合并 ## 变基(Rebase) ### 1. 基本概念 变基是将一系列提交按照原有次序依次应用到另一分支上,使得提交历史呈现出更加线性的样子。 ### 2. 基本用法 ```bash # 将当前分支变基到目标分支 git rebase <target-branch> # 交互式变基 git rebase -i <commit> # 中止变基 git rebase --abort # 继续变基 git rebase --continue ``` ### 3. 交互式变基命令 - pick: 保留该提交 - reword: 修改提交信息 - edit: 修改该提交 - squash: 将提交融合到前一个提交 - fixup: 将提交融合到前一个提交,丢弃提交信息 - drop: 删除该提交 ## 合并与变基的比较 ### 1. 优势对比 #### 合并的优势 - 保留完整的历史记录 - 不会改变提交的SHA值 - 操作简单,风险低 - 适合多人协作的分支 #### 变基的优势 - 提交历史更加线性 - 避免不必要的合并提交 - 更容易进行代码审查 - 适合本地分支整理 ### 2. 使用建议 #### 适合使用合并的场景 - 合并发布分支 - 合并团队公共分支 - 合并长期维护的分支 - 需要保留完整历史记录 #### 适合使用变基的场景 - 整理本地提交历史 - 同步上游分支更新 - 整理功能分支提交 - 准备提交代码审查 ## 最佳实践 ### 1. 合并最佳实践 - 合并前先更新本地分支 - 使用--no-ff保留分支信息 - 编写清晰的合并信息 - 及时处理合并冲突 ### 2. 变基最佳实践 - 不要对公共分支执行变基 - 变基前备份重要分支 - 使用交互式变基整理提交 - 解决冲突后使用--continue ### 3. 冲突解决 ```bash # 查看冲突文件 git status # 使用工具解决冲突 git mergetool # 标记冲突已解决 git add <conflicted-files> # 继续合并/变基 git merge --continue git rebase --continue ``` ## 高级技巧 ### 1. 拣选(Cherry-pick) ```bash # 拣选单个提交 git cherry-pick <commit> # 拣选多个提交 git cherry-pick <commit1> <commit2> # 拣选范围 git cherry-pick <start-commit>..<end-commit> ``` ### 2. 子树合并 ```bash # 添加子树远程仓库 git remote add -f subtree-origin <repository-url> # 添加子树 git subtree add --prefix=<prefix> subtree-origin master # 拉取子树更新 git subtree pull --prefix=<prefix> subtree-origin master ``` ### 3. 压缩提交 ```bash # 使用squash合并 git merge --squash feature-branch # 使用reset压缩提交 git reset --soft HEAD~3 git commit -m "squashed commits" ``` ## 故障排除 ### 1. 合并冲突 - 使用git status查看冲突文件 - 手动编辑解决冲突 - 使用git add标记解决 - 完成合并或变基操作 ### 2. 变基问题 - 保存重要分支的备份 - 使用git reflog恢复误操作 - 使用--abort放弃操作 - 谨慎处理公共分支 ### 3. 合并回滚 ```bash # 回滚到合并前 git reset --hard ORIG_HEAD # 还原合并提交 git revert -m 1 <merge-commit> ``` ## 总结 合并和变基是Git中两种重要的分支整合方法,它们各有优势和适用场景。合并保留完整历史,适合团队协作;变基创造线性历史,适合本地分支整理。选择合适的方法并遵循最佳实践,可以让代码历史更加清晰,提高团队协作效率。记住在处理公共分支时要谨慎使用变基,在必要时为重要分支创建备份。