目录
Git 基础概念
Git 是一个分布式版本控制系统,它跟踪文件随时间的变化,并允许多人协作开发。
核心区域
文件状态
Git 工作流程
基本工作流程包括:
- 克隆/初始化仓库
- 创建/切换分支
- 修改文件
- 暂存更改
- 提交更改
- 推送到远程
- 拉取远程更新
常用命令
# 初始化仓库
git init
# 克隆仓库
git clone <repository-url>
# 查看状态
git status
# 添加文件到暂存区
git add <file>
git add . # 添加所有更改
# 提交更改
git commit -m "提交信息"
# 查看提交历史
git log
git log --graph --oneline --all # 图形化展示所有分支
# 创建分支
git branch <branch-name>
# 切换分支
git checkout <branch-name>
# 或使用新命令(Git 2.23+)
git switch <branch-name>
# 创建并切换分支
git checkout -b <branch-name>
# 或使用新命令
git switch -c <branch-name>
# 推送到远程
git push origin <branch-name>
# 拉取远程更新
git pull origin <branch-name>
Git Pull 与合并处理详解
git pull
实际上是 git fetch
和 git merge
的组合操作。
Pull 的不同方式
- 普通合并 (默认)
git pull origin master
# 等同于
git fetch origin master
git merge origin/master
- 使用 rebase 方式
git pull --rebase origin master
# 等同于
git fetch origin master
git rebase origin/master
Pull 策略选择
合并冲突解决方案
当 git pull
或 git merge
遇到冲突时,需要手动解决。
冲突解决流程
解决冲突的详细步骤
- 识别冲突文件
git pull
# 如果有冲突,会显示类似信息
# CONFLICT (content): Merge conflict in <filename>
# Automatic merge failed; fix conflicts and then commit the result.
# 查看冲突文件
git status
- 理解冲突标记
冲突文件中会包含类似标记:
<<<<<<< HEAD
本地修改的内容
=======
远程修改的内容
>>>>>>> branch-name
-
解决冲突方法
a. 手动编辑:直接编辑冲突文件,删除冲突标记,保留需要的内容
b. 使用合并工具:
git mergetool
c. 选择其中一个版本:
# 使用当前分支(HEAD)的版本 git checkout --ours <filename> # 使用合并进来的分支版本 git checkout --theirs <filename>
-
标记为已解决并提交
# 标记文件冲突已解决
git add <filename>
# 完成合并提交
git commit
# 此时会自动生成合并提交信息,可以修改或直接保存
高级合并策略
# 在合并时指定策略
git pull -s recursive -X ours # 冲突时优先保留本地修改
git pull -s recursive -X theirs # 冲突时优先保留远程修改
git pull -s recursive -X patience # 使用patience算法,更智能地处理代码移动
# 放弃合并
git merge --abort
使用 Rebase 处理冲突
# 拉取并使用rebase方式合并
git pull --rebase
# 当遇到冲突时
# 1. 解决冲突
# 2. 标记为已解决
git add <conflicted-files>
# 3. 继续rebase
git rebase --continue
# 放弃rebase
git rebase --abort
Git 分支策略
Gitflow 工作流
推荐的分支策略
高级技巧
交互式变基
# 对最近的 3 个提交进行重新整理
git rebase -i HEAD~3
常用选项:
pick
:保留该提交reword
:修改提交信息edit
:修改该提交squash
:将该提交融合到前一个提交fixup
:将该提交融合到前一个提交,丢弃提交信息drop
:删除该提交
暂存工作区
# 暂存当前工作
git stash save "工作描述"
# 查看暂存列表
git stash list
# 应用最近的暂存
git stash apply
# 应用指定暂存
git stash apply stash@{1}
# 应用并删除暂存
git stash pop
# 删除所有暂存
git stash clear
精确查找
# 查找引入特定代码的提交
git log -S "代码片段"
# 查找某行代码的修改历史
git blame <file>
# 查找特定作者的提交
git log --author="作者名"
撤销操作
# 撤销工作区修改
git checkout -- <file>
# 或使用新命令
git restore <file>
# 撤销暂存区修改
git reset HEAD <file>
# 或使用新命令
git restore --staged <file>
# 修改最近的提交
git commit --amend
# 撤销提交(生成新提交)
git revert <commit-hash>
# 重置到指定提交
git reset --soft <commit-hash> # 保留修改在暂存区
git reset --mixed <commit-hash> # 保留修改在工作区
git reset --hard <commit-hash> # 丢弃所有修改
Git 内部原理
Git 的核心是一个简单的键值存储数据库,对象存储在 .git/objects
目录中。
Git 对象类型
分支与引用
分支本质上是指向某个提交对象的可移动指针,存储在 .git/refs/heads/
目录中。
上图中:
main
分支指针移动到合并提交 C5feature
分支指针仍然指向 C4
合并原理
- 快进合并(Fast-forward):
快进合并只是简单地将当前分支指针向前移动到目标分支的最新提交。
- 三方合并(3-way merge):
三方合并会生成一个新的合并提交,它有两个父提交。
Rebase 原理
Rebase 会找到共同祖先(B),然后依次应用 feature 分支上的更改(C、D)到 main 分支的最新提交(E)之上,生成新的提交(C’、D’)。
Git Pull 完整流程
实战技巧
处理大型合并冲突
当面临大型项目合并时:
-
提前同步:定期从主分支拉取更新
# 在特性分支上定期执行 git fetch origin master git merge origin/master # 或 git rebase origin/master
-
分块合并:复杂功能分多个小分支开发
# 创建子功能分支 git checkout -b feature/part1 git checkout -b feature/part2 # 逐个合并到开发分支 git checkout develop git merge feature/part1 git merge feature/part2
-
使用合并工具:配置好的合并工具能极大提高效率
# 配置合并工具 git config --global merge.tool vscode git config --global mergetool.vscode.cmd 'code --wait $MERGED' # 使用 git mergetool
Git Pull 冲突处理流程图
高效处理合并冲突的最佳实践
-
提前了解变更范围:
# 查看将要合并的分支有哪些变更 git log --oneline master..feature # 查看具体文件变更 git diff master...feature
-
预先检查潜在冲突:
# 模拟合并,不实际提交 git merge --no-commit --no-ff feature # 检查后取消 git merge --abort
-
合并前先清理工作区:
# 检查工作区状态 git status # 暂存当前工作 git stash # 合并后恢复 git stash pop
-
使用特定合并策略:
# 冲突时优先采用本地版本 git merge -X ours feature # 冲突时优先采用合入版本 git merge -X theirs feature
-
大型项目合并建议:
# 先创建临时分支进行合并测试 git checkout -b temp_merge git merge feature # 测试成功后再合并到主分支
总结
Git 是一个功能强大的版本控制系统,掌握合并冲突处理是高效使用 Git 的关键技能。通过理解 Git 的内部原理,采用合适的分支策略,使用正确的合并方法,可以大大提高团队协作效率,减少合并冲突带来的麻烦。