远程

以前所有操作都在本地执行,与远程服务器没有交互,这一讲我们将与远程服务器进行交互。

1 远程仓库

远程仓库是指托管在网上的版本仓库。

如何才能找到方便快捷的远程仓库呢?这就不得不提业界闻名的同性交友网站 GitHub 。 GitHub 是世界上最大的 Git 版本库托管商,是成千上万开发者的聚集地,开源项目取之不尽用之不竭。

为了避免打扰他人,自己注册账号创建一个新的仓库吧!因为新的仓库没有代码,GitHub 会在项目首页显示一些向导性质的说明。

https://github.com/<user>/<project_name>
git@github.com:<user>/<project_name>

Git 可以通过以上两种 URL 进行访问,公开项目应当优先分享 HTTP URL , SSH URL 仅在用户登录 GitHub 帐号并配置 SSH 密钥之后才能访问。

互联网早期都是明文通信,一旦被截获,所有内容暴露无遗。而 SSH 协议可以通过加密登录信息来保障通信安全。该过程涉及两把密钥,即私钥和公钥。那么哪一把密钥用来加密,哪一把用来解密呢?这一问题引申出了两种不同的方案:公钥加密、私钥解密的加密方案,与私钥加密、公钥解密签名方案。

  • 加密方案
    • 用户向远程主机发送登录请求。
    • 远程主机向用户发送公钥。
    • 用户用公钥加密登录密码,回复远程主机。
    • 远程主机用私钥解密登录密码,尝试登录。
  • 签名方案
    • 用户在远程主机上储存公钥。
    • 用户向远程主机发送登录请求。
    • 远程主机向用户发送一段随机字符串。
    • 用户用私钥加密随机字符串,回复远程主机。
    • 远程主机用事先储存的公钥进行解密,认证身份。

GitHub 采用签名方案,用户必须事先在 GitHub 服务器上储存公钥才能通过 SSH 访问。我们可以先在 Windows 的 C:/Users/用户/.ssh/ 或 Linux 的 ~/.ssh/ 目录下寻找一对以 id_dsa 或 id_rsa 命名的文件,其中一个带有 .pub 扩展名,找不到就需要运行 ssh-keygen 创建它们,其间会要求你输入两次口令,嫌麻烦的话留空一路回车即可。成功获取密钥后,将公钥的全部内容复制粘贴到 https://github.com/settings/keys 一栏里。

ssh-copy-id username@hostname 免密码登录其它服务器。

运行命令 git remote add origin http://xxxxxxxx 给本地项目添加远程仓库。

2 远程分支

远程分支是远程仓库的分支的引用,你不能移动他们,只有当你进行网络通信时,它们才会自动移动。 Git 的 clone 命令会自动将远程仓库命名为 origin ,并创建一个指向它的 master 分支指针。远程仓库的默认名称 origin 与分支的默认名称 master 一样,没有任何特别的含义,允许修改,但不建议,除非你同时拥有多个远程仓库分支。

跟踪分支是与远程分支有直接关系的本地分支,它决定了 Git 去哪个服务器上抓取、合并到哪个分支。本地 master 分支就是 origin/master 的跟踪分支。 git branch -avv 能方便地看到所有分支的跟踪情况。设定本地分支的跟踪分支后,在 git pull 和 git push 时就不必再指定远程分支。

初始 clone 时,我们通常会在新建分支时运行命令 git checkout -b newbranch origin/branch 一键指定想要跟踪的远程分支。注意 git branch 只能为已经存在的本地分支指定远程分支。

2.1 推送

$ git push origin serverfix

Git 自动将 serverfix 分支名字展开为 refs/heads/serverfix:refs/heads/serverfix ,表示用本地 serverfix 分支更新远程 serverfix 分支。至于 refs/heads/ 什么含义,我们暂时搁置。

我常常忘记自己当前所在的分支,因此更推荐命令 git push origin serverfix:serverfix 来指明本地分支名称和远程分支名称,以避免致命的推送错误。当远程分支不存在时,远程 git 仓库会为你新建一个。注意,别人抓取到这一新远程分支,不会在他的本地自动生成一份副本。

2.2 拉取

git fetch 从服务器上抓取数据后不会修改当前工作目录中的内容,而命令 git pull 会,单独显式地使用 git fetchgit merge 命令更好些。多数情况下, git pull 等于 git fetch + git merge

当存在多个远程分支时,必须以 git fetch xxxxxxgit pull xxxxxx 的形式指定远程仓库。

2.3 删除

# 删除远程分支
$ git push origin --delete serverfix

# 清理不存在的远程分支
$ git remote prune origin

2.4 标签

给提交打标签是一种本地行为。想要共享标签,必须运行命令 git push origin <tagname> 手动推送,删除也是 git push origin --delete <tagname>

3 特殊文件简介

3.1 自述 README

它可以是 README ,README.md , README.asciidoc 或者其它任意后缀的文件。只要 GitHub 在版本仓库中找到,就会把它展示到项目首页。

README 可以包含各种各样的信息,例如项目成立的背景与意义、配置安装的注意事项、使用说明以及一些简单用例等。

3.2 贡献 CONTRIBUTING

与 README 一样, CONTRIBUTING 的后缀也是任意的, 它用于告知别人如何正确地为项目贡献力量。

3.3 许可证 LICENSE

许可证是描述项目代码授权限制的契约,法律效力微弱,全靠用户自觉。选择哪个取决于你的核心需求:

  • 想要宽松,就选 MIT 许可证。
  • 想要专利,就选 Apache 许可证。
  • 想要共享,就选 GPL(V3) 许可证。