以前所有操作都在本地执行,与远程服务器没有交互,这一讲我们将与远程服务器进行交互。
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 fetch
与 git merge
命令更好些。多数情况下, git pull
等于 git fetch
+ git merge
。
当存在多个远程分支时,必须以
git fetch xxxxxx
或git 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) 许可证。