Skip to content

5-1.创建

目前比较流行的远程仓库,有这几种:

GitHub 为例,建立一个仓库。(如果还没注册的话,就先注册个账号。)

譬如,建立了一个名为 git-test 的仓库。

其中,项目地址分为两种 httpsssh

5-2.管理远程库

我们现在建立了一个名为 git-test 项目的地址。

它的两个地址如下:

  • https 协议: https://github.com/Code1994/git-test.git
  • ssh 协议:git@github.com:Code1994/git-test.git

现在让我们,将本地仓库与远程仓库关联起来

shell
# 因为本地仓库可对应许多个远程仓库。name是自定义的远程仓库名。url是远程仓库的地址。
git remote add <name> <url>

# 列出详细的远程仓库列表
git remote -v 
# 添加远程仓库地址
git remote add <name> <url>
# 重新设置某一远程仓库地址
git remote set-url <name> <url>
# 删除某一远程仓库
git remote rm/remove <name>
# 远程仓库重命名
git remote rename <old name> <new name>

具体到我们的例子,实际执行代码如下:

shell
# https协议
git remote add origin https://github.com/Code1994/git-test.git

# ssh协议
git remote add origin git@github.com:Code1994/git-test.git

这时,我们在理想情况下就可以使用 git push 相关命令去推送本地仓库到远程仓库了。

TIP

实际上,在上面配置完成后,两种协议仍需额外配置。

https 协议:

shell
# 全局配置下Github的用户名和邮箱,这样在利用https协议,会验证一次Github的密码就可以。
git config --global user.name "code1994"
git config --global user.email "code1994@qq.com"

ssh 协议:

这个需要本机生成密匙公钥,然后将公钥放置在 Github网站上。详见下节。

5-3.ssh协议

如上所示,需要先生成密匙和公钥。打开终端,执行:

shell
# 生成以rsa形式加密的密匙
ssh-keygen -t rsa

~/.ssh 文件夹下会生成密匙 id-rsa 以及 id-rsa.pub

复制公钥 id-rsa.pub 文件内容后,粘贴到 Githubsettingsssh keys 中。

这样,以后在交互过程中,就会验证更为安全的 ssh 协议。

TIP

其实,在 linux 上的免密登录和免密传输,也会用到 ssh 的密匙和公钥。

按照上面的方式生成 id_rsa.pub,然后将 id_rsa.pub 的内容,拷贝至远程服务器的 /root/.ssh/authorized_keys 文件中。根据该文件是否存在,分为两种情况操作:

  1. 没有 authorized_keys 文件,或者该文件内容为空。直接执行:
shell
# 将 address 替换为你的服务器的实际 IP 地址。该命令会将本地的 id_rsa.pub 文件拷贝至远程,并重命名为 authorized_keys。
scp /path/to/.ssh/id_rsa.pub root@address:/root/.ssh/authorized_keys
  1. authorized_keys。说明有其他人在该文件中配置过,为了保证我们不影响他人的配置,执行:
shell
# 先将 id_rsa.pub 文件拷贝至 authorized_keys 的同级目录下
scp /path/to/.ssh/id_rsa.pub root@address:/root/.ssh/
# 然后登录到远程服务器的上面目录下,将 id_rsa.pub 的文件内容,追加到 authorized_keys 文件中
ssh -p22 root@address
cd /root/.ssh/
cat id_rsa.pub >>  authorized_keys

5-4.拉取

在团队协作中,也有可能远程分支的进度先于本地分支。因为可能有同事将新做的代码推送到了远程分支。

这样,我们就需要拉取远程分支的更新。有两种方式:

  • git fetch
  • git pull

5-4-1.git fetch

git fetch 用于拉取远程分支的更新,但它不会合并到本地分支上,需要人为的利用 get merge 进行手动合并。

git fetch <远程仓库名> 默认会拉取远程所有分支。

git fetch <远程仓库名> <远程仓库分支名> 拉取远程某一分支。

shell
# 拉取远程 master 分支
git fetch origin master
# 查看所有分支
git branch -a
# 合并分支
git merge origin/master
git merge FETCH_HEAD
# 如果合并有问题,可以撤销
git merge --abort

5-4-2.git pull

shell
# 拉取远程remote分支 到 本地的local分支
git pull <name> <remote>:<local>

需要注意的是,git pull 默认采用的是 merge 模式合并。本身的语法就相当于:

shell
# 假设 git pull 的语法如下:
git pull origin master

# 拉取远程
git fetch origin master
# 合并远程
git merge origin/master

很大的一个缺点是,它会造成 Git 的提交历史轴变得弯弯曲曲,很难看,也会有冗余的提交记录 Merge branch of 'master' ...

可以使用 git log --graph --pretty=oneline 查看下:

如果想要避免这种情况的话,可以采用变基 rebase 模式。它会使所有的提交记录,成一条直线,也不会再有冗余的提交记录。

shell
# 但多人协作的实际应用中,这句语法可能会造成很多提交冲突,慎用。
git pull <name> <remote>:<local> --rebase

5-5.克隆

上面的操作,是把本地仓库与新建的远程仓库绑定。但是还有的情况,是这个远程仓库项目已经存在了,我们需要把它克隆到本地来。

shell
# 将远程仓库克隆到本地 本地项目名将与远程仓库名一致
git clone <url>

# 将远程仓库克隆岛本地 并自定义本地项目
git clone <url> <project-name>