5-1.创建
目前比较流行的远程仓库,有这几种:
以 GitHub
为例,建立一个仓库。(如果还没注册的话,就先注册个账号。)
譬如,建立了一个名为 git-test
的仓库。
其中,项目地址分为两种 https
与 ssh
。
5-2.管理远程库
我们现在建立了一个名为 git-test
项目的地址。
它的两个地址如下:
https
协议:https://github.com/Code1994/git-test.git
ssh
协议:git@github.com:Code1994/git-test.git
现在让我们,将本地仓库与远程仓库关联起来。
# 因为本地仓库可对应许多个远程仓库。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>
具体到我们的例子,实际执行代码如下:
# 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
协议:
# 全局配置下Github的用户名和邮箱,这样在利用https协议,会验证一次Github的密码就可以。
git config --global user.name "code1994"
git config --global user.email "code1994@qq.com"
ssh
协议:
这个需要本机生成密匙和公钥,然后将公钥放置在 Github
网站上。详见下节。
5-3.ssh协议
如上所示,需要先生成密匙和公钥。打开终端,执行:
# 生成以rsa形式加密的密匙
ssh-keygen -t rsa
在 ~/.ssh
文件夹下会生成密匙 id-rsa
以及 id-rsa.pub
。
复制公钥 id-rsa.pub
文件内容后,粘贴到 Github
的 settings
的 ssh keys
中。
这样,以后在交互过程中,就会验证更为安全的 ssh
协议。
TIP
其实,在 linux
上的免密登录和免密传输,也会用到 ssh
的密匙和公钥。
按照上面的方式生成 id_rsa.pub
,然后将 id_rsa.pub
的内容,拷贝至远程服务器的 /root/.ssh/authorized_keys
文件中。根据该文件是否存在,分为两种情况操作:
- 没有
authorized_keys
文件,或者该文件内容为空。直接执行:
# 将 address 替换为你的服务器的实际 IP 地址。该命令会将本地的 id_rsa.pub 文件拷贝至远程,并重命名为 authorized_keys。
scp /path/to/.ssh/id_rsa.pub root@address:/root/.ssh/authorized_keys
- 有
authorized_keys
。说明有其他人在该文件中配置过,为了保证我们不影响他人的配置,执行:
# 先将 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 <远程仓库名> <远程仓库分支名>
拉取远程某一分支。
# 拉取远程 master 分支
git fetch origin master
# 查看所有分支
git branch -a
# 合并分支
git merge origin/master
git merge FETCH_HEAD
# 如果合并有问题,可以撤销
git merge --abort
5-4-2.git pull
# 拉取远程remote分支 到 本地的local分支
git pull <name> <remote>:<local>
需要注意的是,git pull
默认采用的是 merge
模式合并。本身的语法就相当于:
# 假设 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
模式。它会使所有的提交记录,成一条直线,也不会再有冗余的提交记录。
# 但多人协作的实际应用中,这句语法可能会造成很多提交冲突,慎用。
git pull <name> <remote>:<local> --rebase
5-5.克隆
上面的操作,是把本地仓库与新建的远程仓库绑定。但是还有的情况,是这个远程仓库项目已经存在了,我们需要把它克隆到本地来。
# 将远程仓库克隆到本地 本地项目名将与远程仓库名一致
git clone <url>
# 将远程仓库克隆岛本地 并自定义本地项目
git clone <url> <project-name>