一、命令概览
# 查看当前所有远程地址别名
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 账号创建的,所以和别人重名了也没事
- 公共库的读权限是开放的,出于开源精神就选公共库
建好之后,仓库首页的 Quick setup 里能看到两种协议的地址:

三、给远程库起别名 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 会弹浏览器让绑定账号:


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

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

不过网页上改代码基本不会渲染,只能靠基本功或者 AI 辅助,这个功能很少用到。
五、拉取 git pull
# 拉取远程分支最新内容并与当前本地分支合并
git pull 远程库地址别名 远程分支名
别人改完上传了新版本,自己再改之前得先拉到本地库。这里直接改远程库的文件来模拟这个情况:


然后在本地 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 按钮里:

在任意有读写权限的文件夹(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 记住三点:
- 不需要登录账号,就和在浏览器下载项目一样
- 自动初始化本地库
- 自动命名别名(
origin)
七、团队内协作
别人直接 push 到远程库是不行的,他没有这个 github 仓库的权限,得先给权限(把人加入到 github 项目团队)。
在仓库的 Settings 里操作邀请:

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

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

加入团队之后再推送就成功了。别名如果太乱,也可以直接用 https 地址操作。
八、跨团队协作
GitHub 的搜索栏可以直接搜项目名,用 用户名/项目名 可以精确搜索。邀请别人做项目,把 clone 链接发过去就行。
跨团队改别人的项目,直接进项目页,右上角有 Fork,点一下就能拷到自己网页端里(clone 到本地再改也可以)。不过一般不会用到 Fork 的在线编辑,clone 方便很多。
整个流程画出来是这样:

几个概念先对齐:
| 官方/通用叫法 | 英文 | 说明 |
|---|---|---|
| 上游项目(或源仓库) | Upstream | Fork 的那个原始仓库,版权和合并权限属于这个团队 |
| 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 协议时,如果账号里一把公钥都没有,会看到这样的提示:

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 里多了两个文件:

圣果@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:

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

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

3. 测试 SSH
回到项目文件,SSH 就可以用了:

用 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 信息和新加的内容都在:
