Appearance
同步远程
概述
在团队协作中,保持本地仓库与远程仓库的同步至关重要。本文将介绍如何有效地同步远程分支、处理远程变更以及解决同步过程中的冲突。
同步远程分支
查看远程分支状态
查看所有远程分支:
bash
git branch -r查看所有分支(本地和远程):
bash
git branch -a输出示例:
* main
develop
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/develop
remotes/origin/feature-auth获取远程分支最新信息
bash
git fetch origin获取所有远程仓库的更新:
bash
git fetch --all同步远程分支列表
清理本地已删除的远程分支引用:
bash
git fetch --prune或简写:
bash
git fetch -p创建本地分支跟踪远程分支
bash
git checkout -b <local-branch> <remote>/<branch>示例:
bash
git checkout -b feature-auth origin/feature-auth更简单的方式(自动创建同名分支):
bash
git checkout feature-auth推送新分支到远程
bash
git push -u origin <branch-name>示例:
bash
git checkout -b new-feature
git push -u origin new-feature删除远程分支
bash
git push origin --delete <branch-name>示例:
bash
git push origin --delete old-feature处理远程变更
检查远程变更
获取更新后查看差异:
bash
git fetch origin
git log HEAD..origin/main查看详细的变更内容:
bash
git log HEAD..origin/main --oneline --graph查看文件变更:
bash
git diff HEAD..origin/main合并远程变更
使用 merge 合并:
bash
git fetch origin
git merge origin/main使用 rebase 合并:
bash
git fetch origin
git rebase origin/main同步工作流程
推荐的同步流程:
bash
git status
git stash
git fetch origin
git rebase origin/main
git stash pop查看远程与本地差异
查看远程领先本地多少提交:
bash
git rev-list --left-right --count origin/main...HEAD输出示例:
5 2表示远程领先 5 个提交,本地领先 2 个提交。
解决同步冲突
冲突产生的原因
当远程和本地对同一文件的同一位置进行了不同的修改时,就会产生冲突。
冲突场景示例
bash
git pull origin main输出:
CONFLICT (content): Merge conflict in src/app.js
Automatic merge failed; fix conflicts and then commit the result.查看冲突文件
bash
git status输出:
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/app.js查看冲突内容
bash
git diff冲突标记格式:
<<<<<<< HEAD
本地修改的内容
=======
远程修改的内容
>>>>>>> origin/main解决冲突步骤
方法一:手动编辑
- 打开冲突文件
- 找到冲突标记
- 修改为正确的内容
- 删除冲突标记
- 保存文件
方法二:使用合并工具
bash
git mergetool方法三:选择一方
选择本地版本:
bash
git checkout --ours src/app.js选择远程版本:
bash
git checkout --theirs src/app.js完成冲突解决
标记冲突已解决:
bash
git add src/app.js完成合并:
bash
git commit或完成变基:
bash
git rebase --continue放弃合并
放弃正在进行的合并:
bash
git merge --abort放弃正在进行的变基:
bash
git rebase --abort保持仓库同步
日常同步习惯
推荐的日常工作流程:
bash
git fetch origin
git status
git rebase origin/main使用别名简化操作
配置常用别名:
bash
git config alias.sync '!git fetch origin && git rebase origin/main'使用别名:
bash
git sync自动化同步脚本
创建同步脚本:
bash
#!/bin/bash
git fetch origin
if git diff --quiet HEAD origin/main; then
echo "Already up to date"
else
git rebase origin/main
echo "Synced with origin/main"
fi定期清理
清理已合并的分支:
bash
git branch --merged main | grep -v "^\*\|main\|develop" | xargs git branch -d清理远程已删除的分支引用:
bash
git fetch --prune使用 Git Hooks 自动同步
创建 post-checkout hook:
bash
#!/bin/sh
git fetch origin --quiet多人协作同步策略
功能分支工作流
bash
git checkout main
git pull origin main
git checkout -b feature/new-feature
git push -u origin feature/new-featureGit Flow 工作流
bash
git checkout develop
git pull origin develop
git checkout -b feature/new-feature
git push -u origin feature/new-featureGitHub Flow 工作流
bash
git checkout main
git pull origin main
git checkout -b feature-branch
git push -u origin feature-branch冲突预防策略
频繁同步
bash
git fetch origin
git rebase origin/main建议每天至少同步一次。
小步提交
将大功能拆分为小提交:
bash
git add -p
git commit -m "Add user authentication - part 1"及时沟通
- 使用项目管理工具
- 提前通知团队成员正在修改的文件
- 避免同时修改同一文件
使用分支隔离
bash
git checkout -b feature/user-auth每个功能使用独立分支。
代码审查
通过 Pull Request 进行代码审查,合并前解决冲突。
高级同步技巧
选择性合并
只合并特定提交:
bash
git cherry-pick <commit-hash>交互式变基
bash
git rebase -i origin/main可以重新排序、合并或编辑提交。
使用 reflog 恢复
如果同步出错:
bash
git reflog
git reset --hard HEAD@{n}同步 Fork 仓库
bash
git remote add upstream git@github.com:original/repo.git
git fetch upstream
git rebase upstream/main
git push origin main最佳实践
同步前检查
bash
git status
git stash使用 rebase 替代 merge
bash
git pull --rebase origin main配置默认使用 rebase:
bash
git config pull.rebase true保持分支整洁
bash
git rebase -i origin/main定期同步主分支
bash
git checkout main
git pull origin main
git checkout feature-branch
git rebase main常见问题
如何查看远程最新提交
bash
git fetch origin
git log origin/main -5同步后丢失本地提交
使用 reflog 恢复:
bash
git reflog
git reset --hard HEAD@{n}如何撤销已推送的提交
bash
git revert HEAD
git push origin main远程分支已删除但本地仍显示
bash
git fetch --prune总结
- 使用
git fetch获取远程更新 - 使用
git rebase保持提交历史整洁 - 及时解决冲突,避免积累
- 频繁同步,小步提交
- 使用功能分支隔离开发
- 定期清理已合并的分支
