Git 操作指南:分支同步与冲突批量解决
文档概述
本文档基于实际项目开发中遇到的 Git 操作问题,系统性地整理了 Git 分支同步、冲突解决、远程仓库管理等核心技术要点,提供了可操作的解决方案和最佳实践建议。
适用场景:团队协作开发、多分支管理、代码冲突处理
技术栈:Git 2.x+、GitLab/GitHub
目录
- [Git 分支同步机制](#Git 分支同步机制)
- [远程仓库 URL 配置与重定向](#远程仓库 URL 配置与重定向)
- [Git Pull 状态判断](#Git Pull 状态判断)
- 冲突解决策略与实践
- 常见问题诊断与处理
- 最佳实践建议
Git 分支同步机制
1.1 Git Pull 的工作原理
git pull 实际上是两个操作的组合:
bash
git pull = git fetch + git merge
详细流程:
-
Fetch 阶段:
- 从远程仓库下载最新的提交、分支和标签信息
- 更新本地的远程跟踪分支(如
origin/dev) - 不会修改本地工作分支
-
Merge 阶段:
- 将远程跟踪分支合并到当前本地分支
- 可能产生合并提交或快进(fast-forward)
- 如果有冲突,会进入冲突解决状态
1.2 分支跟踪关系
查看分支跟踪关系:
bash
# 查看所有分支及其跟踪关系
git branch -vv
# 输出示例:
# * dev 277333c [origin/dev] feat: 添加统计报表功能
# master 49b2062 [origin/master] update README
输出解读:
*表示当前所在分支[origin/dev]表示本地 dev 分支跟踪远程 origin/dev 分支- 提交哈希和提交信息显示当前分支的最新提交
1.3 本地与远程分支对比
bash
# 查看本地分支与远程分支的差异
git log HEAD..origin/dev --oneline # 远程有但本地没有的提交
git log origin/dev..HEAD --oneline # 本地有但远程没有的提交
# 查看详细差异
git diff origin/dev # 查看代码差异
实际案例:
在项目中遇到的情况:
bash
$ git pull
warning: redirecting to http://git.example.com/frontend/project-admin.git/
Already up to date.
分析:
Already up to date表示本地和远程完全同步- 本地 dev 和 origin/dev 都指向提交
277333c - 没有需要拉取的新提交
远程仓库 URL 配置与重定向
2.1 警告信息解读
bash
warning: redirecting to http://git.example.com/frontend/project-admin.git/
原因分析:
-
配置的 URL (缺少
.git后缀):http://git.example.com/frontend/project-admin -
实际访问的 URL(Git 服务器自动重定向):
http://git.example.com/frontend/project-admin.git/
2.2 查看远程仓库配置
bash
# 查看远程仓库列表
git remote -v
# 输出示例:
# origin http://git.example.com/frontend/project-admin (fetch)
# origin http://git.example.com/frontend/project-admin (push)
2.3 修正远程仓库 URL
方法1:使用 git remote set-url(推荐)
bash
# 更新远程仓库 URL
git remote set-url origin http://git.example.com/frontend/project-admin.git
# 验证修改
git remote -v
方法2:编辑配置文件
bash
# 直接编辑 .git/config 文件
[remote "origin"]
url = http://git.example.com/frontend/project-admin.git
fetch = +refs/heads/*:refs/remotes/origin/*
2.4 重定向的影响
| 影响类型 | 说明 | 是否需要修正 |
|---|---|---|
| 功能影响 | 无,Git 会自动处理重定向 | 否 |
| 性能影响 | 可能增加 1 次 HTTP 请求 | 建议修正 |
| 警告提示 | 每次操作都会显示警告 | 建议修正 |
| 安全影响 | 无安全问题 | 否 |
Git Pull 状态判断
3.1 Pull 结果的三种状态
状态1:Already up to date(已是最新)
bash
$ git pull
Already up to date.
含义:
- 本地分支和远程分支指向相同的提交
- 没有需要合并的内容
- 工作目录保持不变
验证方法:
bash
git log HEAD..origin/dev --oneline # 应该没有输出
git status # 显示 "up to date"
状态2:Fast-forward(快进合并)
bash
$ git pull
Updating 277333c..abc1234
Fast-forward
src/views/dashboard/index.vue | 15 +++++++++++++++
1 file changed, 15 insertions(+)
含义:
- 远程有新提交,本地没有新提交
- Git 直接移动分支指针,不创建合并提交
- 历史记录保持线性
适用条件:
o---o---o origin/dev
|
o local dev (before pull)
o---o---o origin/dev
|
o local dev (after pull)
状态3:Merge commit(产生合并提交)
bash
$ git pull
Merge made by the 'recursive' strategy.
src/views/dashboard/index.vue | 15 +++++++++++++++
1 file changed, 15 insertions(+)
含义:
- 远程和本地都有新提交
- Git 创建一个新的合并提交
- 历史记录产生分叉
适用条件:
o---o local commits
/
o---o---o origin/dev
\
o---o after pull (merge commit created)
3.2 诊断命令集合
bash
# 1. 查看当前状态
git status
# 2. 查看本地和远程的提交差异
git fetch origin
git log --oneline --graph --all --decorate -10
# 3. 查看远程分支最新提交
git log origin/dev -5 --oneline
# 4. 查看本地分支最新提交
git log dev -5 --oneline
# 5. 比较本地和远程的差异数量
git rev-list --left-right --count dev...origin/dev
# 输出格式:左侧数字(本地独有) 右侧数字(远程独有)
冲突解决策略与实践
4.1 冲突产生的场景
冲突发生的典型情况:
bash
$ git pull
Auto-merging src/views/dashboard/index.vue
CONFLICT (content): Merge conflict in src/views/dashboard/index.vue
Automatic merge failed; fix conflicts and then commit the result.
冲突原因:
- 远程和本地修改了同一文件的同一区域
- Git 无法自动决定保留哪个版本
- 需要人工介入解决
4.2 冲突解决策略对比
| 策略 | 适用场景 | 优点 | 缺点 | 命令 |
|---|---|---|---|---|
| 采用远程版本 | 本地修改不重要 | 快速解决 | 丢失本地修改 | git checkout --theirs |
| 采用本地版本 | 远程修改不重要 | 保留本地工作 | 可能缺失远程更新 | git checkout --ours |
| 手动合并 | 两边都重要 | 精确控制 | 耗时费力 | 编辑器手动处理 |
| 重新提交 | 冲突复杂 | 历史清晰 | 需要重新开发 | git reset --hard |
4.3 方案1:预先指定合并策略(推荐)
场景:在拉取代码前就知道要采用哪一方的版本
bash
# 采用远程版本
git pull -X theirs
# 采用本地版本
git pull -X ours
工作原理:
-X theirs:冲突时自动选择远程(theirs)的版本-X ours:冲突时自动选择本地(ours)的版本- 无冲突的文件正常合并
实际案例:
bash
# 场景:团队成员已经在远程修复了多个文件的 bug
# 本地有一些实验性修改,不重要
$ git pull -X theirs
Updating 277333c..abc1234
Fast-forward (merge strategy: theirs)
src/views/dashboard/index.vue | 15 +++++++++
src/views/form/detail.vue | 23 ++++++++-----
src/mixins/formDetail.js | 10 +++---
3 files changed, 35 insertions(+), 13 deletions(-)
优势:
- ✅ 一次命令解决所有冲突
- ✅ 保留完整的合并历史
- ✅ 不会意外丢失未冲突的修改
4.4 方案2:冲突后批量处理
场景 :已经执行了 git pull,现在处于冲突状态
步骤1:确认冲突状态
bash
$ git status
On branch dev
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/views/dashboard/index.vue
both modified: src/views/form/detail.vue
both modified: src/mixins/formDetail.js
步骤2:批量采用远程版本
bash
# 对所有冲突文件采用远程版本
git checkout --theirs .
# 或者对特定文件采用远程版本
git checkout --theirs src/views/dashboard/index.vue
git checkout --theirs src/views/form/detail.vue
步骤3:标记冲突已解决
bash
# 将解决后的文件添加到暂存区
git add .
# 查看状态
git status
# 输出应该显示:All conflicts fixed but you are still merging.
步骤4:完成合并
bash
# 提交合并结果
git commit -m "merge: 采用远程版本解决冲突"
# 或者使用默认的合并提交信息
git commit --no-edit
完整脚本:
bash
#!/bin/bash
# 批量解决冲突脚本 - 采用远程版本
# 检查是否处于合并状态
if ! git status | grep -q "You have unmerged paths"; then
echo "当前不在冲突状态"
exit 1
fi
# 采用远程版本解决所有冲突
git checkout --theirs .
# 添加到暂存区
git add .
# 完成合并
git commit -m "merge: 采用远程版本解决冲突"
echo "冲突已解决并提交"
4.5 方案3:完全重置到远程状态
场景:本地修改完全不需要,直接同步远程
选项A:保留未提交的修改(储藏)
bash
# 1. 储藏当前修改
git stash save "暂存本地修改"
# 2. 获取远程最新状态
git fetch origin
# 3. 重置到远程分支
git reset --hard origin/dev
# 4. 查看储藏列表(如果需要恢复)
git stash list
# 5. 恢复储藏(可选)
git stash pop
选项B:完全丢弃本地修改
bash
# 1. 获取远程最新状态
git fetch origin
# 2. 强制重置到远程分支(会丢失本地所有未提交的修改)
git reset --hard origin/dev
# 3. 清理未跟踪的文件(可选)
git clean -fd
⚠️ 危险警告:
bash
# ❌ 以下操作会永久丢失数据,谨慎使用!
git reset --hard origin/dev # 丢失所有未提交的修改
git clean -fd # 删除所有未跟踪的文件和目录
git clean -fdx # 同上,并删除 .gitignore 中的文件
安全检查清单:
使用 git reset --hard 前请确认:
- 本地未提交的修改是否需要保留?
- 是否已经备份重要的修改?
- 是否确认要完全同步远程状态?
- 是否有未推送的本地提交?
查看将要丢失的内容:
bash
# 查看未提交的修改
git diff
# 查看未推送的提交
git log origin/dev..HEAD --oneline
# 查看未跟踪的文件
git status --short
4.6 方案4:精细化冲突处理
场景:只对部分文件采用远程版本,其他文件手动处理
步骤1:分析冲突文件
bash
# 列出所有冲突文件
git diff --name-only --diff-filter=U
# 查看特定文件的冲突内容
git diff src/views/dashboard/index.vue
步骤2:分类处理
bash
# 对不重要的文件采用远程版本
git checkout --theirs src/views/dashboard/index.vue
git checkout --theirs src/mixins/formDetail.js
# 对重要的文件采用本地版本
git checkout --ours src/api/dashboard.js
# 对需要合并的文件手动编辑
code src/views/form/detail.vue
步骤3:验证合并结果
bash
# 检查语法错误
npm run lint
# 本地测试
npm run dev
# 添加解决后的文件
git add src/views/dashboard/index.vue
git add src/mixins/formDetail.js
git add src/api/dashboard.js
git add src/views/form/detail.vue
# 完成合并
git commit -m "merge: 解决冲突,部分采用远程版本"
4.7 冲突文件标记详解
Git 在冲突文件中添加的标记:
javascript
<<<<<<< HEAD (Current Change)
// 本地版本的代码
const localVariable = 'local value';
console.log('这是本地的修改');
=======
// 远程版本的代码
const remoteVariable = 'remote value';
console.log('这是远程的修改');
>>>>>>> origin/dev (Incoming Change)
标记说明:
<<<<<<< HEAD:本地版本开始(ours)=======:分隔符>>>>>>> origin/dev:远程版本结束(theirs)
手动解决流程:
- 删除冲突标记(
<<<<<<<、=======、>>>>>>>) - 保留需要的代码,删除不需要的代码
- 或者合并两边的代码
- 测试确保代码正确
- 保存文件并提交
示例 - 合并后的代码:
javascript
// 合并后:保留两边的重要内容
const localVariable = 'local value';
const remoteVariable = 'remote value';
console.log('合并了本地和远程的修改');
4.8 冲突解决工具推荐
VS Code 内置冲突解决
VS Code 提供了可视化的冲突解决界面:
<<<<<<< HEAD (Current Change)
本地代码
|||||||
=======
远程代码
>>>>>>> origin/dev (Incoming Change)
[Accept Current Change] [Accept Incoming Change]
[Accept Both Changes] [Compare Changes]
操作说明:
- Accept Current Change:采用本地版本(ours)
- Accept Incoming Change:采用远程版本(theirs)
- Accept Both Changes:保留两边的修改
- Compare Changes:对比差异
命令行工具
bash
# 使用 vimdiff
git mergetool --tool=vimdiff
# 使用 VS Code
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
git mergetool
常见问题诊断与处理
5.1 问题1:Pull 显示已是最新,但实际有新提交
症状:
bash
$ git pull
Already up to date.
# 但同事说已经推送了新代码
诊断步骤:
bash
# 1. 确认当前分支
git branch
# 2. 查看分支跟踪关系
git branch -vv
# 3. 手动 fetch 并查看
git fetch origin
git log origin/dev -5 --oneline
git log dev -5 --oneline
可能原因及解决方案:
原因1:在错误的分支上
bash
# 症状:当前在 master,想拉取 dev 的更新
$ git branch
dev
* master
# 解决:切换到正确的分支
git checkout dev
git pull
原因2:分支跟踪关系错误
bash
# 查看跟踪关系
$ git branch -vv
* dev 277333c feat: xxx
# 发现 dev 没有跟踪远程分支
# 解决:设置跟踪关系
git branch --set-upstream-to=origin/dev dev
# 或者在 pull 时指定远程分支
git pull origin dev
原因3:远程仓库配置错误
bash
# 查看远程仓库
$ git remote -v
origin http://wrong-url.com/repo.git (fetch)
origin http://wrong-url.com/repo.git (push)
# 解决:修正远程仓库 URL
git remote set-url origin http://git.example.com/frontend/project-admin.git
原因4:网络或权限问题
bash
# 症状:fetch 失败但没有明显错误
git fetch -v origin
# 解决:检查网络和权限
# 1. 检查 Git 服务器是否可访问
curl -I http://git.example.com/frontend/project-admin.git
# 2. 检查认证信息
git config --get credential.helper
# 3. 重新输入凭据
git config --unset credential.helper
git pull # 会提示输入用户名密码
5.2 问题2:Pull 后代码被覆盖了
症状:
bash
# 执行 pull 后发现本地修改丢失
$ git pull
Updating 277333c..abc1234
Fast-forward
src/views/dashboard/index.vue | 50 ++++++++++++++++------------------
1 file changed, 23 insertions(+), 27 deletions(-)
# 本地的修改不见了!
诊断步骤:
bash
# 1. 检查 reflog(Git 的操作历史)
git reflog
# 输出示例:
# abc1234 HEAD@{0}: pull: Fast-forward
# 277333c HEAD@{1}: commit: 我的本地修改
# ...
恢复方法:
方法1:使用 reflog 恢复
bash
# 1. 找到丢失的提交
git reflog
# 2. 恢复到那个提交
git reset --hard HEAD@{1}
# 3. 如果需要保留远程的更新,重新合并
git pull --no-ff # 创建合并提交,不使用 fast-forward
方法2:使用 cherry-pick
bash
# 1. 查看丢失的提交哈希
git reflog
# 2. 切换到最新的远程代码
git reset --hard origin/dev
# 3. 应用之前的本地提交
git cherry-pick 277333c
方法3:从未提交的修改中恢复
bash
# 如果修改还没提交就被覆盖了
# 1. 检查 Git 的自动保存(如果启用了)
git fsck --lost-found
# 2. 使用编辑器的本地历史(VS Code、WebStorm 等)
# VS Code: 右键文件 -> "打开时间线"
# 3. 如果有备份或 stash
git stash list
git stash pop
预防措施:
bash
# 养成提交前先拉取的习惯
git fetch origin
git status
git pull
# 或使用 rebase 代替 merge
git pull --rebase
# 重要修改及时提交
git add .
git commit -m "WIP: 临时保存"
5.3 问题3:解决冲突后无法提交
症状:
bash
$ git commit
error: Committing is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and commit.
fatal: Exiting because of an unresolved conflict.
诊断步骤:
bash
# 查看详细状态
git status
# 查看未合并的文件
git diff --name-only --diff-filter=U
解决方案:
bash
# 1. 确保所有冲突都已解决
# 检查文件中是否还有冲突标记
grep -r "<<<<<<< HEAD" .
grep -r "=======" .
grep -r ">>>>>>>" .
# 2. 将解决后的文件添加到暂存区
git add .
# 3. 再次检查状态
git status
# 4. 提交
git commit -m "merge: 解决冲突"
5.4 问题4:意外进入 Vim 编辑器
症状:
bash
$ git pull
# 进入了 Vim 编辑器,显示合并提交信息
原因:
- Git 需要创建合并提交,调用默认编辑器(通常是 Vim)让你编辑提交信息
快速退出方法:
bash
# 在 Vim 中:
# 1. 按 ESC 键
# 2. 输入 :wq 并回车(保存并退出)
# 或者输入 :q! 并回车(不保存退出)
永久解决方案:
bash
# 方法1:使用默认提交信息,不打开编辑器
git pull --no-edit
# 方法2:修改默认编辑器为 VS Code
git config --global core.editor "code --wait"
# 方法3:修改默认编辑器为 Nano(更简单)
git config --global core.editor "nano"
# 方法4:配置 pull 策略,避免合并提交
git config --global pull.rebase true
5.5 问题5:Pull 后发现拉错分支了
症状:
bash
# 想拉取 dev 分支,却拉取了 master
$ git pull origin master
# 合并了不该合并的代码
撤销方法:
bash
# 方法1:使用 reflog 回到拉取前的状态
git reflog
git reset --hard HEAD@{1}
# 方法2:使用 merge --abort(如果在合并中)
git merge --abort
# 方法3:如果已经提交了,撤销最后一次合并提交
git reset --hard HEAD^
预防措施:
bash
# 1. 设置默认拉取的分支
git config branch.dev.remote origin
git config branch.dev.merge refs/heads/dev
# 2. 拉取前确认当前分支和远程分支
git branch -vv
git status
# 3. 使用别名简化操作
git config --global alias.sync '!git fetch origin && git reset --hard origin/$(git branch --show-current)'
最佳实践建议
6.1 日常开发工作流
标准流程
bash
# 1. 开始新任务前,确保在正确的分支
git checkout dev
git pull origin dev
# 2. 创建功能分支
git checkout -b feature/new-feature
# 3. 进行开发工作
# ... 修改代码 ...
# 4. 提交代码
git add .
git commit -m "feat: 添加新功能"
# 5. 推送到远程
git push origin feature/new-feature
# 6. 定期同步主分支的更新
git checkout dev
git pull origin dev
git checkout feature/new-feature
git rebase dev # 或 git merge dev
# 7. 完成功能后,合并到 dev
git checkout dev
git pull origin dev
git merge --no-ff feature/new-feature
git push origin dev
# 8. 删除功能分支
git branch -d feature/new-feature
git push origin --delete feature/new-feature
针对项目的工作流
根据团队的部署规范:
bash
# 1. 从 master 拉取新分支开发
git checkout master
git pull origin master
git checkout -b feature/my-feature
# 2. 开发完成后,合并到 dev 测试
git checkout dev
git pull origin dev
git merge --no-ff feature/my-feature
git push origin dev
# 3. 测试通过后,合并到 master
git checkout master
git pull origin master
git merge --no-ff dev
git push origin master
# 4. 使用 CI/CD 部署
# 访问 CI/CD 平台(如 Jenkins/GitLab CI)
# Dashboard -> 选择项目 -> 选择环境(生产/测试)
# 点击"立即构建"或"Deploy"
6.2 团队协作规范
分支命名规范
bash
# 功能分支
feature/user-auth
feature/dashboard-module
feature/data-export
# 修复分支
fix/login-bug
fix/data-display-error
# 重构分支
refactor/api-structure
refactor/component-optimize
# 紧急修复分支
hotfix/security-patch
hotfix/critical-bug
提交信息规范
bash
# 格式:<type>: <subject>
# 常用类型:
feat: 新功能
fix: 修复 bug
refactor: 重构(不改变功能)
style: 代码格式调整
docs: 文档更新
test: 测试相关
chore: 构建/工具配置
# 示例:
git commit -m "feat: 添加数据统计功能"
git commit -m "fix: 修复报表导出日期格式错误"
git commit -m "refactor: 优化表单组件代码结构"
代码审查流程
bash
# 1. 推送功能分支
git push origin feature/my-feature
# 2. 创建 Merge Request / Pull Request
# (在 GitLab/GitHub 网页上操作)
# 3. 代码审查通过后合并
# (由项目管理员操作)
# 4. 本地同步更新
git checkout dev
git pull origin dev
6.3 冲突预防策略
策略1:及时同步
bash
# 每天开始工作前
git checkout dev
git pull origin dev
# 每天结束工作后
git add .
git commit -m "feat: xxx"
git pull origin dev # 及时发现冲突
git push origin dev
策略2:小步提交
bash
# ❌ 不好的做法:一次提交大量修改
git add .
git commit -m "完成所有功能"
# ✅ 好的做法:拆分成多个小提交
git add src/views/dashboard/index.vue
git commit -m "feat: 添加统计列表页面"
git add src/api/statistics.js
git commit -m "feat: 添加统计 API 接口"
git add src/views/dashboard/detail.vue
git commit -m "feat: 添加统计详情页面"
策略3:功能分支隔离
bash
# ❌ 不好的做法:直接在 dev 分支开发
git checkout dev
# ... 修改代码 ...
git commit -m "feat: 新功能"
# ✅ 好的做法:创建功能分支
git checkout -b feature/new-feature
# ... 修改代码 ...
git commit -m "feat: 新功能"
git push origin feature/new-feature
策略4:使用 Rebase 保持历史清晰
bash
# 同步主分支时使用 rebase
git checkout feature/my-feature
git fetch origin
git rebase origin/dev
# 而不是 merge(会产生额外的合并提交)
git merge origin/dev # 不推荐
6.4 安全操作检查清单
执行可能导致数据丢失的操作前,请检查:
使用 git reset --hard 前:
-
确认没有未提交的重要修改
bashgit status git diff -
确认没有未推送的本地提交
bashgit log origin/dev..HEAD --oneline -
考虑是否需要先备份
bashgit stash save "备份当前修改"
使用 git push -f 前:
- 确认不会影响其他团队成员
- 确认只在自己的功能分支上操作
- 永远不要 在 master/dev 等共享分支上使用
bash
# ✅ 可以在自己的分支上使用
git push -f origin feature/my-feature
# ❌ 永远不要在共享分支上使用
git push -f origin dev # 危险!
git push -f origin master # 危险!
删除分支前:
-
确认分支已经合并
bashgit branch --merged -
确认没有未推送的提交
bashgit log origin/dev..feature/my-feature
6.5 性能优化建议
减少网络请求
bash
# 使用 --depth 参数浅克隆(首次克隆时)
git clone --depth 1 http://git.example.com/frontend/project-admin.git
# 只拉取当前分支
git config remote.origin.fetch "+refs/heads/dev:refs/remotes/origin/dev"
# 配置代理(如果需要)
git config --global http.proxy http://proxy.example.com:8080
加速 Git 操作
bash
# 启用并行下载
git config --global fetch.parallel 8
# 启用文件系统缓存(Windows)
git config --global core.fscache true
# 启用自动 GC
git config --global gc.auto 256
减小仓库大小
bash
# 清理无用的文件
git gc --prune=now --aggressive
# 查看大文件
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| sort --numeric-sort --key=2 \
| tail -10
# 从历史中移除大文件(谨慎使用)
git filter-branch --tree-filter 'rm -f path/to/large-file' HEAD
6.6 常用 Git 配置
bash
# 用户信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# 编辑器
git config --global core.editor "code --wait"
# 差异工具
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
# 合并工具
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
# Pull 策略
git config --global pull.rebase false # 使用 merge(默认)
# 或
git config --global pull.rebase true # 使用 rebase
# 自动修正拼写错误
git config --global help.autocorrect 1
# 颜色输出
git config --global color.ui auto
# 记住凭据
git config --global credential.helper store
# 别名设置
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --oneline --graph --all --decorate'
6.7 故障排除工具箱
诊断脚本
bash
#!/bin/bash
# git-diagnose.sh - Git 状态诊断脚本
echo "=== Git 仓库诊断 ==="
echo ""
echo "1. 当前分支:"
git branch --show-current
echo ""
echo "2. 远程仓库配置:"
git remote -v
echo ""
echo "3. 分支跟踪关系:"
git branch -vv
echo ""
echo "4. 工作区状态:"
git status --short
echo ""
echo "5. 未推送的提交:"
git log origin/$(git branch --show-current)..HEAD --oneline
echo ""
echo "6. 远程分支领先情况:"
git log HEAD..origin/$(git branch --show-current) --oneline
echo ""
echo "7. 未合并的文件:"
git diff --name-only --diff-filter=U
echo ""
echo "8. 最近 5 次操作:"
git reflog -5
echo ""
echo "=== 诊断完成 ==="
使用方法:
bash
# 保存为 git-diagnose.sh
chmod +x git-diagnose.sh
./git-diagnose.sh
常用诊断命令
bash
# 查看完整的提交历史图
git log --oneline --graph --all --decorate
# 查看某个文件的修改历史
git log --follow -p -- src/views/report/index.vue
# 查看谁修改了某一行代码
git blame src/views/report/index.vue
# 查找包含特定内容的提交
git log -S "function name" --source --all
# 查看两个分支的差异
git diff dev..master
# 查看未暂存的修改
git diff
# 查看已暂存的修改
git diff --staged
# 查看分支合并情况
git log --merges
# 查看某个提交的详细信息
git show abc1234
附录
A. Git 术语表
| 术语 | 英文 | 解释 |
|---|---|---|
| 工作区 | Working Directory | 实际文件所在的目录 |
| 暂存区 | Staging Area / Index | 临时保存即将提交的修改 |
| 本地仓库 | Local Repository | 本地的 Git 数据库 |
| 远程仓库 | Remote Repository | 服务器上的 Git 数据库 |
| 提交 | Commit | 保存代码快照 |
| 分支 | Branch | 代码的独立开发线 |
| 合并 | Merge | 将两个分支的修改合并 |
| 变基 | Rebase | 将提交移动到新的基础上 |
| 冲突 | Conflict | 无法自动合并的代码差异 |
| 快进 | Fast-forward | 不创建合并提交的合并方式 |
| HEAD | HEAD | 当前所在位置的指针 |
| ours | ours | 当前分支的版本(合并时的接收方) |
| theirs | theirs | 被合并分支的版本(合并时的提供方) |
B. 常见错误信息及解决方案
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
fatal: Not a git repository |
不在 Git 仓库中 | cd 到正确的目录或 git init |
fatal: refusing to merge unrelated histories |
两个仓库没有共同历史 | git pull --allow-unrelated-histories |
error: Your local changes would be overwritten |
本地有未提交的修改 | 先提交或 git stash |
fatal: unable to access |
网络或权限问题 | 检查网络、URL 和凭据 |
error: pathspec did not match any file(s) |
文件路径错误 | 检查文件路径是否正确 |
fatal: A branch named 'xxx' already exists |
分支已存在 | 使用其他名称或删除旧分支 |
C. Git 配置文件位置
bash
# 系统级配置(影响所有用户)
# Windows: C:\Program Files\Git\etc\gitconfig
# Linux: /etc/gitconfig
# 用户级配置(影响当前用户)
# Windows: C:\Users\YourName\.gitconfig
# Linux: ~/.gitconfig
# 仓库级配置(仅影响当前仓库)
# .git/config
# 查看配置
git config --list --show-origin
D. 参考资源
官方文档
在线工具
速查表
总结
本文档系统性地整理了 Git 操作中的核心知识点,特别是针对团队协作中常见的分支同步和冲突解决问题。主要内容包括:
- Git Pull 机制:理解 fetch + merge 的组合原理
- 冲突解决策略:提供了 4 种不同场景下的解决方案
- 问题诊断方法:系统化的故障排查流程
- 最佳实践:日常开发中的规范和技巧
关键要点:
- ✅ 在操作前充分了解当前状态(
git status、git branch -vv) - ✅ 根据实际情况选择合适的冲突解决策略
- ✅ 重要操作前做好备份(
git stash或提交) - ✅ 养成小步提交、及时同步的好习惯
- ⚠️ 谨慎使用
git reset --hard和git push -f
希望本文档能帮助团队成员更好地使用 Git,减少代码冲突,提高协作效率。