Skip to content

同步远程

概述

在团队协作中,保持本地仓库与远程仓库的同步至关重要。本文将介绍如何有效地同步远程分支、处理远程变更以及解决同步过程中的冲突。

同步远程分支

查看远程分支状态

查看所有远程分支:

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

解决冲突步骤

方法一:手动编辑

  1. 打开冲突文件
  2. 找到冲突标记
  3. 修改为正确的内容
  4. 删除冲突标记
  5. 保存文件

方法二:使用合并工具

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-feature

Git Flow 工作流

bash
git checkout develop
git pull origin develop
git checkout -b feature/new-feature
git push -u origin feature/new-feature

GitHub 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 保持提交历史整洁
  • 及时解决冲突,避免积累
  • 频繁同步,小步提交
  • 使用功能分支隔离开发
  • 定期清理已合并的分支