首页  /  云原生  /  正文

GitHub 远程库操作

云原生 2026-10-02📖 17 分钟👁 —
🌿 云原生 · Git第 4 / 5 页12345📖 完整导航 →

一、命令概览

# 查看当前所有远程地址别名
git remote -v

# 添加远程仓库别名(origin 是常用别名,可自定义)
git remote add 别名 远程地址

# 推送本地分支内容到远程仓库
git push 别名 分支名

# 克隆远程仓库到本地(第一次获取项目用)
git clone 远程地址

# 拉取远程分支最新内容并与当前本地分支合并
git pull 远程库地址别名 远程分支名

GitHub 是必须配合 git 使用的代码托管平台,下面全部用 GitHub 实操一遍。

顺手把 fetch 和 pull 的区别也记一下:git fetch 别名 分支名 只把远程的更新抓到本地,不动工作区;git pull 等于 fetch 之后再做一次 merge。

二、创建远程库

在 GitHub 上新建一个仓库(远程库):

GitHub 新建仓库页面,填仓库名和描述,可见性选 Public

几条经验:

建好之后,仓库首页的 Quick setup 里能看到两种协议的地址:

仓库建好后的 Quick setup,HTTPS 和 SSH 两个地址都在这里

三、给远程库起别名 git remote

# 查看当前所有远程地址别名
git remote -v

# 添加远程仓库别名(origin 是常用别名,可自定义)
# 地址写https地址
git remote add 别名 远程地址

实操一遍:

# 添加远程库并创建别名
圣果@shengguo MINGW64 /demo (hot-fix)
$ git remote add demo https://github.com/wudihah/demo.git

圣果@shengguo MINGW64 /demo (hot-fix)
$ git remote
demo

# 显示了该仓库推送和拉取的别名
圣果@shengguo MINGW64 /demo (hot-fix)
$ git remote -v
demo    https://github.com/wudihah/demo.git (fetch)
demo    https://github.com/wudihah/demo.git (push)

四、推送 git push

# 推送本地分支内容到远程仓库
# 别名和库名保持一致
git push 别名 分支名

两个注意点:没设别名的话,推送时直接写 url 也可以;推送的时候看好分支。

把 master 分支推上去:

圣果@shengguo MINGW64 /demo (master)
$ git push demo master
info: please complete authentication in your browser...
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 16 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.07 KiB | 182.00 KiB/s, done.
Total 15 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (4/4), done.
To https://github.com/wudihah/demo.git
 * [new branch]      master -> master

第一次 push 会弹浏览器让绑定账号:

第一次 push 弹出的授权页,让 Git Credential Manager 访问 GitHub 账号
授权成功,可以关掉这个页面回终端了

刷新浏览器看远程库,有内容就是成功了:

刷新之后仓库首页出现了 hello.txt 和 finish test 这次提交

仓库里点开文件,右上角那支笔可以直接在网页上改:

仓库里点开 hello.txt 的页面,红框那支笔就是在线编辑

不过网页上改代码基本不会渲染,只能靠基本功或者 AI 辅助,这个功能很少用到。

五、拉取 git pull

# 拉取远程分支最新内容并与当前本地分支合并
git pull 远程库地址别名 远程分支名

别人改完上传了新版本,自己再改之前得先拉到本地库。这里直接改远程库的文件来模拟这个情况:

在网页上给 hello.txt 末尾加了一行 dockererrr
网页端编辑完会弹出这个提交对话框,填 commit message 后提交到 master

然后在本地 master 分支拉取:

# 在本地的 master 分支拉取
圣果@shengguo MINGW64 /demo (master)
$ git pull demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 904 bytes | 150.00 KiB/s, done.
From https://github.com/wudihah/demo
 * branch            master     -> FETCH_HEAD
   37588e4..3c89aaf  master     -> demo/master
Updating 37588e4..3c89aaf
Fast-forward
# 新增 1 行,修改了 1 个文件
 hello.txt | 1 +
 1 file changed, 1 insertion(+)

# 本地状态是未修改,说明拉取会自动 commit 到本地库
 $ git status
On branch master
nothing to commit, working tree clean

六、克隆 git clone

第一次获取别人的项目必须用 clone,不能用 pull:

# 克隆远程仓库到本地(第一次获取项目用)
git clone 远程地址

地址就在仓库首页的 Code 按钮里:

仓库首页点 Code,Local 下面的 HTTPS 地址就是 clone 用的

在任意有读写权限的文件夹(win 的文件基本都有)打开 git,克隆即可:

圣果@shengguo MINGW64 /f/git-clone/demo
$ git clone https://github.com/wudihah/demo.git
Cloning into 'demo'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 18 (delta 5), reused 15 (delta 4), pack-reused 0 (from 0)
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (5/5), done.

# 进入到项目文件(.git所在目录)
# 自动命名的别名叫 origin
圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git remote -v
origin  https://github.com/wudihah/demo.git (fetch)
origin  https://github.com/wudihah/demo.git (push)

关于 clone 记住三点:

  1. 不需要登录账号,就和在浏览器下载项目一样
  2. 自动初始化本地库
  3. 自动命名别名(origin)

七、团队内协作

别人直接 push 到远程库是不行的,他没有这个 github 仓库的权限,得先给权限(把人加入到 github 项目团队)。

在仓库的 Settings 里操作邀请:

仓库 Settings 下的 Collaborators,界面里就是 Add people 的入口

输入用户名即可(是固定的用户名,不是显示名称):

邀请发出去之后,在 Manage access 里能看到被邀请人处于 Pending Invite 状态

被邀请者打开邀请链接,可以选择接受或者婉拒:

被邀请者看到的邀请页,点 Accept invitation 才算加入

加入团队之后再推送就成功了。别名如果太乱,也可以直接用 https 地址操作。

八、跨团队协作

GitHub 的搜索栏可以直接搜项目名,用 用户名/项目名 可以精确搜索。邀请别人做项目,把 clone 链接发过去就行。

跨团队改别人的项目,直接进项目页,右上角有 Fork,点一下就能拷到自己网页端里(clone 到本地再改也可以)。不过一般不会用到 Fork 的在线编辑,clone 方便很多。

整个流程画出来是这样:

跨团队协作:fork 到自己的远程库,改完 pull request 上去,对方审核再 merge

几个概念先对齐:

官方/通用叫法英文说明
上游项目(或源仓库)UpstreamFork 的那个原始仓库,版权和合并权限属于这个团队
Fork 仓库(或派生仓库)Fork从上游复制出来的副本,属于修改者自己的账号
贡献者Contributor主动 Fork 并提交代码的人
维护者Maintainer上游项目中负责审核 PR、合并代码的人

流程就是五步:

1. 贡献者 Fork 上游仓库 → 克隆到本地 → 修改代码 → push 到自己的远程仓库
2. 贡献者在 GitHub 网页上发起 Pull Request(从自己的分支 → 上游仓库的分支)
3. 贡献者和维护者在 PR 页面里讨论、修改、再推送(PR 会自动更新)
4. 维护者审核通过后,点击 PR 页面上的 **Merge** 按钮
5. 代码被合并到上游仓库,PR 关闭

一句话:贡献者发起 PR,维护者审核合并,两个人还能在 PR 页面里直接聊。

九、SSH 免密登录

用 https 每次都要认证,换成 SSH 就免密了。SSH 登录需要主动开通:先在本地生成密钥对,再把公钥添加到 GitHub 账号里。

仓库切到 SSH 协议时,如果账号里一把公钥都没有,会看到这样的提示:

仓库切到 SSH 协议时提示账号里还没有公钥,得先去加一个

1. 生成密钥对

在 win 的家目录 C:\Users\z1664 下打开 Git 生成(其实在别的地方打开 git 也可以),会得到 .ssh 文件夹。也可以直接 cd 换到 win 的目录。

# 使用非加密协议算法生成公钥和私钥
# -t 指定生成密钥的加密算法
# rsa 是一种非对称加密协议
# -C 是描述
$ ssh-keygen -t rsa -C shengguo@aliyun.com

# 一路回车到结束
圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ ssh-keygen -t rsa -C shengguo@aliyun.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/z1664/.ssh/id_rsa):
Created directory '/c/Users/z1664/.ssh'.
Enter passphrase for "/c/Users/z1664/.ssh/id_rsa" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/z1664/.ssh/id_rsa
Your public key has been saved in /c/Users/z1664/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/zse4javkAroA9uamcqzL7VKVOXMMso/Ix7PUnR6/rI shengguo@aliyun.com
The key's randomart image is:
+---[RSA 3072]----+
|     .           |
|    =            |
|   + +           |
|. o.o.           |
| +. o   S        |
|o .= .   o       |
| B++=   o o .    |
|=OB.o+ . ooo..   |
|B*O= E=. .o==o   |
+----[SHA256]-----+

回到 win 的家目录看,.ssh 里多了两个文件:

C 盘用户目录下的 .ssh,id_rsa 是私钥,id_rsa.pub 是公钥
圣果@shengguo MINGW64 ~/.ssh
$ ll
total 5
-rw-r--r-- 1 圣果 197121 2610 Aug 12 21:40 id_rsa
-rw-r--r-- 1 圣果 197121  573 Aug 12 21:40 id_rsa.pub

# 复制公钥
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDTvLAiw942kBxr/J3tSF/zthny3hGRaI7HaMaRFEFCcjA8Ur/TzC8XPPgy2GGlrsF+oBgirHIhkf8vAkdGTANRXSWOH/YBXXB0CjjDmoevaLnJKFDX10HiAzABvBz70bv7r8AQ3HDTLHcch9HRpWZQDkRoR0cTHg7rVg18ds28uNO1x6ub9NGREZxNk9ZS+PemrIq8ljBXyqS0zGcuuLchODjSJjQKeIoTXyT464hlx0F3EBeNO1TJSatDPFT4w4EG0ihAt15fUpd+C315cHbnsd56eN6trp9WKHhzi4/X0QNluufXfGKQLK5ZZqDoHKlzWGcXE4mzbiMRFkmCGzsGrz64SsOL+Zylbis/y8YD1h5DLb4W+Aw6JNLe6pQ1L4eBnrNvFl5myQmSosi5IPZje0L6zZhTBoM10388PItk72+seaoD7QfiouSP6OxA/fdfB8+6zLMMaugVomRNrbuLKNpyGU7LOh3IvfuNLMXsdBE8/w+kxjKGR4KsmM1NS0E= shengguo@aliyun.com

2. 把公钥加到 GitHub

进 GitHub 账号设置里的 SSH and GPG keys:

GitHub 账号设置里的 SSH and GPG keys,点 New SSH key 添加

Title 随便写一个,Key 里粘贴 id_rsa.pub 的全部内容:

Add new SSH Key 页面,Title 写个名字,Key 里粘贴公钥全文

添加上之后,列表里就能看到这把钥匙:

添加成功后 SSH keys 列表里出现了这把钥匙,还没用过所以显示 Never used

3. 测试 SSH

回到项目文件,SSH 就可以用了:

仓库的 SSH 地址已经能直接 clone,之前那条没有公钥的提示也没有了

用 ssh 克隆代码(先执行了 rm -rf demo 删掉项目文件):

圣果@shengguo MINGW64 /f/git-clone/demo
$ git clone git@github.com:wudihah/demo.git
Cloning into 'demo'...
The authenticity of host 'github.com (198.18.0.41)' can't be established.
ED25519 key fingerprint is: SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 18 (delta 5), reused 15 (delta 4), pack-reused 0 (from 0)
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (5/5), done.

再测试拉取:

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git pull git@github.com:wudihah/demo.git master
From github.com:wudihah/demo
 * branch            master     -> FETCH_HEAD
Already up to date.
# 已经是最新的了

最后测试 push,改文件、add、commit 之后推上去:

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ vim hello.txt

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git add hello.txt

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git commit -m "ssh-test" hello.txt
[master 05f7e5e] ssh-test
 1 file changed, 1 insertion(+)

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

圣果@shengguo MINGW64 /f/git-clone/demo/demo (master)
$ git push git@github.com:wudihah/demo.git master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 281.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:wudihah/demo.git
   3c89aaf..05f7e5e  master -> master

到仓库里看,commit 信息和新加的内容都在:

仓库里的文件变成 9 行,最后一行就是刚加进去的 ssh 地址,提交信息是 ssh-test