远程仓库协作
2026/3/20大约 15 分钟
远程仓库协作
掌握 Git 远程操作与团队协作技能
远程仓库概念
什么是远程仓库?
远程仓库是托管在网络上的项目版本库。一个项目可以有多个远程仓库,通常用于:
- 代码托管 - 安全备份代码
- 团队协作 - 多人共同开发
- 代码共享 - 开源项目分发
- 持续集成 - 触发自动化流程
远程仓库架构
操作流程:
clone— 克隆远程仓库到本地fetch— 获取远程更新(不合并)pull— 获取并合并远程更新push— 推送本地提交到远程
远程仓库管理
git remote - 管理远程仓库
# 查看远程仓库
git remote # 显示名称
git remote -v # 显示名称和 URL
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git
# 查看远程仓库详情
git remote show origin
# 重命名远程仓库
git remote rename origin old-origin
git remote rename old-origin origin
# 修改远程仓库 URL
git remote set-url origin https://github.com/user/new-repo.git
git remote set-url origin git@github.com:user/new-repo.git
# 添加额外的推送 URL
git remote set-url --add --push origin git@backup.com:user/repo.git
# 删除远程仓库
git remote remove origin
git remote rm origin
# 清理无效的远程跟踪分支
git remote prune origin
典型的远程仓库配置
常见配置:
origin— 你的远程仓库(fork 或自己的项目)upstream— 上游仓库(fork 的源仓库)
git remote add origin git@github.com:you/repo.git
git remote add upstream git@github.com:original/repo.git
获取与拉取
git fetch - 获取远程更新
# 获取默认远程仓库的更新
git fetch
# 获取指定远程仓库
git fetch origin
# 获取所有远程仓库
git fetch --all
# 获取指定分支
git fetch origin main
# 获取并清理已删除的远程分支
git fetch -p
git fetch --prune
# 获取标签
git fetch --tags
git fetch origin --tags
# 浅获取(限制历史深度)
git fetch --depth=1
git fetch --shallow-since="2024-01-01"
# 获取所有分支
git fetch origin '+refs/heads/*:refs/remotes/origin/*'
git pull - 获取并合并
# 拉取当前分支的远程更新
git pull
# 拉取指定远程和分支
git pull origin main
# 使用变基而非合并
git pull --rebase
git pull -r
# 强制拉取(覆盖本地)
git fetch origin
git reset --hard origin/main
# 拉取所有分支
git pull --all
# 只允许快进合并
git pull --ff-only
# 拉取时自动 stash
git pull --autostash
fetch vs pull
| 操作 | git fetch | git pull |
|---|---|---|
| 作用 | 下载远程更新 | 下载并合并远程更新 |
| 本地分支 | 不变 | 更新(合并或变基) |
| 安全性 | 安全(只读) | 可能产生冲突 |
| 控制力 | 高(可先查看再合并) | 低(自动合并) |
git pull=git fetch+git merge(或git rebase)
推荐工作流:
git fetch origin # 获取更新
git log HEAD..origin/main # 查看差异
git diff HEAD..origin/main # 查看变更
git merge origin/main # 确认后合并
# 或使用 pull --rebase 保持线性历史:
git pull --rebase origin main
推送操作
git push - 推送到远程
# 推送当前分支
git push
# 推送到指定远程和分支
git push origin main
# 推送并设置上游分支
git push -u origin feature-login
git push --set-upstream origin feature-login
# 推送所有分支
git push --all origin
# 推送标签
git push origin v1.0.0
git push origin --tags # 推送所有标签
git push --follow-tags # 推送代码时附带标签
# 强制推送(危险!)
git push -f origin main
git push --force origin main
# 安全的强制推送(检查远程是否有新提交)
git push --force-with-lease origin main
# 删除远程分支
git push origin --delete feature-login
git push origin :feature-login
# 删除远程标签
git push origin --delete v1.0.0
git push origin :refs/tags/v1.0.0
# 推送到不同名的远程分支
git push origin local-branch:remote-branch
# 模拟推送(不实际推送)
git push --dry-run origin main
推送模式配置
# 推送模式
git config --global push.default current # 推送到同名远程分支(推荐)
# 可选模式:
# simple - 推送到跟踪的上游分支(Git 2.0+ 默认)
# current - 推送到同名远程分支
# upstream - 推送到上游分支
# matching - 推送所有同名分支
# nothing - 禁用 push
# 自动设置上游分支
git config --global push.autoSetupRemote true
处理推送冲突
推送被拒绝的处理
错误信息:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'origin'
原因:远程有你本地没有的提交
解决方案:
| 方案 | 命令 | 说明 |
|---|---|---|
| 先拉取再推送 | git pull origin main → git push | 保留合并提交 |
| 变基后推送 | git pull --rebase origin main → git push | 线性历史 |
| 强制推送 | git push --force-with-lease origin main | 谨慎使用! |
⚠️ 永远不要对公共分支使用
--force
远程跟踪分支
理解远程跟踪分支
操作远程跟踪分支
# 查看远程跟踪分支
git branch -r
# 查看所有分支(含跟踪关系)
git branch -vv
# 基于远程跟踪分支创建本地分支
git checkout -b feature origin/feature
git switch -c feature origin/feature
git checkout --track origin/feature
# 设置现有分支的上游
git branch -u origin/feature
git branch --set-upstream-to=origin/feature
# 取消上游设置
git branch --unset-upstream
# 查看上游分支
git rev-parse --abbrev-ref --symbolic-full-name @{upstream}
# 比较与上游的差异
git log @{u}..HEAD # 本地比上游多的提交
git log HEAD..@{u} # 上游比本地多的提交
git diff @{u} # 与上游的差异
Fork 工作流
Fork 工作流程
保持 Fork 同步
# 方法1:使用 rebase(推荐,保持线性历史)
git fetch upstream
git checkout main
git rebase upstream/main
git push origin main
# 方法2:使用 merge
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
# 方法3:重置到上游(丢弃本地修改)
git fetch upstream
git checkout main
git reset --hard upstream/main
git push origin main --force
# 同步所有分支
git fetch upstream
git checkout develop
git rebase upstream/develop
git push origin develop
Pull Request / Merge Request
创建高质量的 PR
使用 GitHub CLI 操作 PR
# 安装 GitHub CLI
# macOS: brew install gh
# Windows: winget install GitHub.cli
# 登录
gh auth login
# 创建 PR
gh pr create --title "Add feature" --body "Description"
gh pr create --fill # 自动填充标题和描述
# 查看 PR 列表
gh pr list
gh pr list --state all
# 查看 PR 详情
gh pr view 123
gh pr view --web # 在浏览器中打开
# 检出 PR 分支
gh pr checkout 123
# 审查 PR
gh pr review 123 --approve
gh pr review 123 --request-changes --body "Please fix..."
gh pr review 123 --comment --body "LGTM"
# 合并 PR
gh pr merge 123
gh pr merge 123 --squash
gh pr merge 123 --rebase
# 关闭 PR
gh pr close 123
代码审查技巧
代码托管平台
GitHub
# GitHub CLI 常用命令
# 仓库操作
gh repo create my-repo --public
gh repo clone user/repo
gh repo fork user/repo
# Issue 操作
gh issue create --title "Bug" --body "Description"
gh issue list
gh issue view 123
gh issue close 123
# Release 操作
gh release create v1.0.0 --title "Version 1.0.0" --notes "Release notes"
gh release list
gh release download v1.0.0
# Actions 操作
gh run list
gh run view 12345
gh run watch 12345
# Gist 操作
gh gist create file.txt
gh gist list
GitLab
# GitLab CLI (glab) 常用命令
# 安装
# macOS: brew install glab
# 其他: https://gitlab.com/gitlab-org/cli
# 登录
glab auth login
# MR 操作
glab mr create --title "Feature" --description "Description"
glab mr list
glab mr view 123
glab mr merge 123
glab mr approve 123
# Issue 操作
glab issue create --title "Bug"
glab issue list
glab issue view 123
# CI/CD 操作
glab ci list
glab ci view
glab ci trace
Gitee(码云)
# Gitee 主要通过网页操作,也可使用 git 命令
# 克隆
git clone git@gitee.com:user/repo.git
# 添加远程
git remote add gitee git@gitee.com:user/repo.git
# 推送
git push gitee main
# 同时推送到多个远程
git remote set-url --add --push origin git@gitee.com:user/repo.git
git push origin main # 同时推送到 GitHub 和 Gitee
多远程仓库管理
配置多个远程仓库
# 添加多个远程仓库
git remote add origin git@github.com:user/repo.git
git remote add gitlab git@gitlab.com:user/repo.git
git remote add gitee git@gitee.com:user/repo.git
# 查看所有远程
git remote -v
# 推送到特定远程
git push origin main
git push gitlab main
git push gitee main
# 配置同时推送到多个远程
git remote set-url --add --push origin git@gitlab.com:user/repo.git
git remote set-url --add --push origin git@gitee.com:user/repo.git
# 现在 git push origin main 会推送到三个仓库
镜像仓库
# 克隆镜像(包含所有分支和标签)
git clone --mirror git@github.com:user/repo.git
# 推送到新位置
cd repo.git
git push --mirror git@gitlab.com:user/repo.git
# 保持镜像同步
git remote update
git push --mirror git@gitlab.com:user/repo.git
安全与认证
SSH vs HTTPS
使用 Personal Access Token
# GitHub Token 使用
# 1. 在 Settings → Developer settings → Personal access tokens 创建
# 使用 Token 克隆
git clone https://oauth2:TOKEN@github.com/user/repo.git
# 配置凭证存储
git config --global credential.helper store # 存储到文件
git config --global credential.helper cache # 临时缓存
# 更新已保存的凭证
# 下次操作时输入新的用户名和 Token
部署密钥
# 生成专用于仓库的部署密钥
ssh-keygen -t ed25519 -C "deploy@repo" -f ~/.ssh/deploy_key
# 在 GitHub 仓库设置中添加公钥
# Settings → Deploy keys → Add deploy key
# 配置 SSH 使用该密钥
# ~/.ssh/config
Host github-deploy
HostName github.com
User git
IdentityFile ~/.ssh/deploy_key
# 使用部署密钥克隆
git clone git@github-deploy:user/repo.git
协作最佳实践
日常协作流程
# 每天开始工作
git checkout main
git pull origin main
# 创建功能分支
git checkout -b feature/my-feature
# 定期同步主分支
git fetch origin
git rebase origin/main
# 提交并推送
git add .
git commit -m "feat: add feature"
git push -u origin feature/my-feature
# 创建 PR 后,根据反馈修改
git add .
git commit -m "fix: address review comments"
git push
# PR 合并后清理
git checkout main
git pull origin main
git branch -d feature/my-feature