Git中文社区

远程仓库

要参与任何一个 Git 项目的协作,就需要知道如何管理远程仓库。远程仓库是托管在网络或其他位置的项目版本库,你可以从中拉取数据,也可以把自己的提交推送上去。

查看远程仓库

git remote
# origin

# 显示远程仓库的地址
git remote -v
# origin  [email protected]:zhangsan/my-project.git (fetch)
# origin  [email protected]:zhangsan/my-project.git (push)

# 查看某个远程仓库的详细信息
git remote show origin

克隆的仓库会自动添加一个名为 origin 的远程仓库,这只是一个默认名字,没有特殊含义。

添加远程仓库

在本地 git init 创建的仓库,需要手动关联远程仓库:

git remote add origin [email protected]:zhangsan/my-project.git

一个仓库可以关联多个远程仓库,比如同时推送到 GitHub 和 Gitee:

git remote add gitee [email protected]:zhangsan/my-project.git
git push gitee main

修改与删除远程仓库

# 修改地址(例如从 HTTPS 换成 SSH)
git remote set-url origin [email protected]:zhangsan/my-project.git

# 重命名
git remote rename gitee mirror

# 删除
git remote remove mirror

推送:git push

# 把本地 main 推送到 origin 的 main
git push origin main

# 第一次推送时设置上游分支,之后直接 git push 即可
git push -u origin main

# 推送所有本地分支
git push --all origin

# 删除远程分支
git push origin --delete feature-old

如果远程分支有你本地没有的新提交,推送会被拒绝:

! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'github.com:zhangsan/my-project.git'

此时需要先拉取远程的更新,合并后再推送。

获取:git fetch

git fetch 会从远程仓库下载本地没有的数据,但不会修改你的工作区和当前分支:

git fetch origin

# 获取所有远程仓库
git fetch --all

# 同时清理远程已删除的分支
git fetch --prune

获取之后,远程分支的状态保存在 origin/main 这样的远程跟踪分支中,可以先检查再决定是否合并:

git log main..origin/main
git merge origin/main

拉取:git pull

git pull 相当于 git fetch 加上 git merge(或 git rebase):

git pull

# 使用变基方式拉取
git pull --rebase

提示

新版 Git 在 pull 产生分叉时会提示你选择合并策略。推荐在全局设置 git config --global pull.rebase true,让个人提交始终排在远程更新之后,历史更整洁。

跟踪分支

从远程分支创建的本地分支会自动"跟踪"对应的远程分支,这样 git pull 和 git push 就知道和哪个远程分支交互:

# 基于远程分支创建本地分支(通常 git switch dev 就会自动完成)
git switch -c dev origin/dev

# 为当前分支设置上游
git branch -u origin/dev

# 查看所有分支的跟踪关系及领先/落后情况
git branch -vv

配置 SSH 密钥

使用 SSH 协议可以免去每次推送都输入凭证的麻烦。

1. 生成密钥

ssh-keygen -t ed25519 -C "[email protected]"

一路回车即可,密钥默认保存在 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。

2. 复制公钥

cat ~/.ssh/id_ed25519.pub

3. 添加到平台

  • GitHub:Settings → SSH and GPG keys → New SSH key
  • Gitee:设置 → 安全设置 → SSH 公钥
  • GitLab:Preferences → SSH Keys

4. 测试连接

ssh -T [email protected]
# Hi zhangsan! You've successfully authenticated...

ssh -T [email protected]

警告

私钥(没有 .pub 后缀的文件)绝对不能泄露给任何人,只把公钥添加到平台上。

HTTPS 认证

GitHub 已不再支持用账号密码进行 Git 操作。使用 HTTPS 时,需要在 GitHub 的 Settings → Developer settings → Personal access tokens 中创建个人访问令牌,推送时用它代替密码。

为了不用每次都输入,可以启用凭证助手:

# Windows(Git for Windows 默认已配置)
git config --global credential.helper manager

# macOS
git config --global credential.helper osxkeychain

# Linux:缓存 1 小时
git config --global credential.helper "cache --timeout=3600"

把本地项目推送到 GitHub

完整流程如下:

# 1. 在 GitHub 上新建一个空仓库(不要勾选初始化 README)

# 2. 本地初始化并提交
git init -b main
git add .
git commit -m "初始化项目"

# 3. 关联远程并推送
git remote add origin [email protected]:zhangsan/my-project.git
git push -u origin main