介绍
为了能够在任意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表单,其中的repository name是必填的外其他都是可选的。
填写完成后就在github上拥有了一个以
github上的项目可通过HTTP或SSH访问:
HTTP:https://github.com//
SSH:[email protected]:/
注意:project_name都带一个后缀名.git
对于一个公开的仓库,你可以挑选任何一种方式来clone仓库到本地,例如:github/gitignore仓库是github收集的常用的.gitignore文件。你可以clone到本地:
git clone [email protected]:github/gitignore.git # 以SSH访问
git clone https://github.com/github/gitignore.git # 以HTTP访问
clone到本地后,你可以修改、add commit等操作,不过无法同步到远程仓库中,因为没有权限。
添加远程同步权限
让我们继续我们自己的test.git仓库,我们也可以使用SSH和HTTPS协议来将其克隆到本地,尽管里面没有任何文件。同样我们也无法向这个远程仓库中传输内容,以为需要权限,接下来介绍如何添加权限:
首先选择右上角的头像中的settings选项:
在新页面中选择SSH and GPG keys并且选择New SSH key:
接下来是重点如何得到SSH key呢?
在终端执行以下命令即可:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
在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打开的页面中:
远程仓库的使用
现在我们已经有了一个远程仓库(github),接下来就是介绍如何使用它来同步我们本地的工作。
查看远程仓库
通过clone操作得到的仓库默认已经配置了远程仓库服务器的,可以运行git remote命令,他会列出你指定的每一个远程服务器的简写,如果你已经克隆了一个仓库至少可以看到origin-这是git给你克隆的仓库服务器的默认名字,类似于本地的为master一样。
(base) [hncjygd@VM_0_11_centos git]$ git clone [email protected]: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 [email protected]:credher/test.git (fetch)
origin [email protected]:credher/test.git (push)
远程仓库可以不止一个,该命令也会将他们全部列出,例如你也可以在gitee中建立一个远程仓库来管理同时管理你的代码,gitee的使用方法基本上与github相同。
添加远程仓库
如果是init的仓库这并没有关联远程仓库,而且如果一个版本库想要关联多个远程仓库,这都需要我们可以添加远程仓库。具体的命令格式为 git remote add
这里我在gitee上创建了一个test仓库来添加:
(base) [hncjygd@VM_0_11_centos test]$ git remote add gitee [email protected]:credher/test.git
(base) [hncjygd@VM_0_11_centos test]$ git remote -v
gitee [email protected]:credher/test.git (fetch)
gitee [email protected]:credher/test.git (push)
origin [email protected]:credher/test.git (fetch)
origin [email protected]: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 [email protected]: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]