git教程(4)-远程仓库的使用

介绍

为了能够在任意git项目上协作以及保存,这就需要用到远程仓库。远程仓库时指托管在网络上的项目的版本库。你可以有多个远程仓库,通常有些仓库对你只读,有些是可以读写的。管理远程仓库包括添加、移除、管理不同的远程分支并定义它们是否被跟踪等。

Git版本托管

github是最大的Git版本托管商,很多开源项目都适用github实现git托管、问题追踪以及代码审查。这里要澄清的是git是一个版本管理程序,而github是实现了git功能的一个web网站,其还包括fork、评论等其他功能。
gitee是开源中国开办的git版本托管网站,由于github在国内网速的问题,gitee是一个不错的选择,你也可以将代码同时推送到这两个网站中。gitee提供了5G的免费容量,虽然不如github的无限容量,但是用于写代码是够了的。

github的使用

首先登陆github官网,注册账号。然后你就可以在使用github了。

创建版本库

通过右上角的加号按钮在弹出的菜单中选择New repository就可以新建版本库了。

New repository

此后会弹出new repository表单,其中的repository name是必填的外其他都是可选的。
repository表单

填写完成后就在github上拥有了一个以<user>/<repository_name>命名的新仓库了。

创建仓库成功

github上的项目可通过HTTP或SSH访问:

 HTTP:https://github.com/<user>/<project_name>
SSH:git@github.com:<user>/<project_name>  
注意:project_name都带一个后缀名.git

对于一个公开的仓库,你可以挑选任何一种方式来clone仓库到本地,例如:github/gitignore仓库是github收集的常用的.gitignore文件。你可以clone到本地:

git clone git@github.com:github/gitignore.git  # 以SSH访问
git clone https://github.com/github/gitignore.git # 以HTTP访问

clone到本地后,你可以修改、add commit等操作,不过无法同步到远程仓库中,因为没有权限。

添加远程同步权限

让我们继续我们自己的test.git仓库,我们也可以使用SSH和HTTPS协议来将其克隆到本地,尽管里面没有任何文件。同样我们也无法向这个远程仓库中传输内容,以为需要权限,接下来介绍如何添加权限:

首先选择右上角的头像中的settings选项:

settings

在新页面中选择SSH and GPG keys并且选择New SSH key:
添加SSH key

接下来是重点如何得到SSH key呢?
在终端执行以下命令即可:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

在linux中他们默认被保存到~/.ssh/下。具体可以参看github提供的教程:生成一个新的SSH key

tips: 什么是SSH key
SSH key就是一对密钥对,一个公钥、一个私钥
公钥是给别人用的,而私钥是给自己用的
就github来说:
本地想要使用git向github上fetch或则ptull私有仓库,就需要给github配置一个公钥,公钥就可以作为一个加密的箱子,将代码放到箱子里然后发送给你,你使用私钥来打开箱子就能拿到东西了。
这整个过程中,都没有用户名和密码的在网络上传输,即使被拦截也无济于事,除非你的私钥泄露了。

对应的我们可以在~/.ssh文件夹下看到两个文件id_rsa和id_rsa.pub,其中.pub就是公钥,而id_rsa就是私钥。我们需要的就是讲这个公钥复制到刚才New SSH key打开的页面中:

添加SSH key

远程仓库的使用

现在我们已经有了一个远程仓库(github),接下来就是介绍如何使用它来同步我们本地的工作。

查看远程仓库

通过clone操作得到的仓库默认已经配置了远程仓库服务器的,可以运行git remote命令,他会列出你指定的每一个远程服务器的简写,如果你已经克隆了一个仓库至少可以看到origin-这是git给你克隆的仓库服务器的默认名字,类似于本地的为master一样。

(base) [hncjygd@VM_0_11_centos git]$ git clone git@github.com:credher/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
(base) [hncjygd@VM_0_11_centos test]$ git remote
origin

你也可以指定选项-v,会显示需要读写远程仓库使用的git保存的简写与其对应的URL:

(base) [hncjygd@VM_0_11_centos test]$ git remote -v
origin  git@github.com:credher/test.git (fetch)
origin  git@github.com:credher/test.git (push)

远程仓库可以不止一个,该命令也会将他们全部列出,例如你也可以在gitee中建立一个远程仓库来管理同时管理你的代码,gitee的使用方法基本上与github相同。

添加远程仓库

如果是init的仓库这并没有关联远程仓库,而且如果一个版本库想要关联多个远程仓库,这都需要我们可以添加远程仓库。具体的命令格式为 git remote add <shortname> <url>添加一个新的远程git仓库。shortname是你指定的远程仓库的简写。
这里我在gitee上创建了一个test仓库来添加:

(base) [hncjygd@VM_0_11_centos test]$ git remote add gitee git@gitee.com:credher/test.git
(base) [hncjygd@VM_0_11_centos test]$ git remote -v
gitee   git@gitee.com:credher/test.git (fetch)
gitee   git@gitee.com:credher/test.git (push)
origin  git@github.com:credher/test.git (fetch)
origin  git@github.com:credher/test.git (push)

可以看到此时test版本库就有了两个远程仓库。

推送到远程仓库

git push [remote-name] [branch-name]

这个命令就是将本地git项目推送到远程仓库的命令,例如我们要将master分支推送到origin服务器时,就可以:

git push origin master

推送gitee同理,要注意的是,只有当你有所克隆服务器或则说所添加服务器的写入权限时才能生效。如果是多人协作,但其他人先推送到上游然后你在推送是被拒绝的,你必须先将他们的工作拉取下来并将其合并到你的工作后才能推送。

(base) [hncjygd@VM_0_11_centos test]$ echo "this is a test repo" > readme
(base) [hncjygd@VM_0_11_centos test]$ git add readme
(base) [hncjygd@VM_0_11_centos test]$ git commit -m "add readme"
[master (root-commit) 69d28cd] add readme
 1 file changed, 1 insertion(+)
 create mode 100644 readme
(base) [hncjygd@VM_0_11_centos test]$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:credher/test.git
 * [new branch]      master -> master
(base) [hncjygd@VM_0_11_centos test]$ git push gitee master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-3.8]
To gitee.com:credher/test.git
 * [new branch]      master -> master

这里我们新建了一个readme文件,并且将他们推送到github和gitee服务器上了。

tips: 这里的origin和gitee实际上就是服务器的别名,git中默认的别名是origin你也可以指定任何其他名字,在具体使用中他将被服务器地址取代,例如我们push命令你可以写成: git push git@github.com:credher/test.git master 这样的形式。不过这样写更加繁琐。

从远程仓库中抓取与拉取

git fetch [remote-name]

这个命令会访问远程仓库,从中拉取所有你还没有的数据,执行完毕后,你将拥有这个远程仓库中所有的分支的引用,可以随时合并或查看。如果你使用clone命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以origin命名。
如果你有一个分支设置为跟踪一个远程分支,可以使用git pull命令来自动的抓取然后河滨远程分支到当前分支。而git fetch命令指示将数据拉取到本地仓库并不会自动合并或修改你当前的工作。
默认情况下,git clone命令会自动设置本地master分支跟踪克隆的远程仓库的master分支,运行git pull通常会把从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
在使用github作为个人远程服务器时,抓取命令比较少用,如果是多人协作的话需要经常使用到。

查看某个远程仓库

如果想要查看某一个远程仓库的详细信息,可以使用:

git remote show [remote-name]

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

上面是一个示例,show命令非常有用,其中列出了远程仓库的URL与跟踪分支信息。它还告诉你正处于master分支,同样列出了远程分支其中指出哪些分支在本地、哪些远程分支不在你本地、哪些已经移除了等信息。最后还列出了当你现在执行git pull命令时哪些分支会自动合并。以及执行git push时本地分支被推送到远程的那个分支。

远程仓库的移除与重命名

重命名:

git remote rename [remote_name] [new_remote_name]

移除:

git remote rm [remote_name]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容