首页 > 代码库 > Git 远程仓库

Git 远程仓库

如果我们做的东西只是在本地供自己用的话,就不需要跟网络打交道,也不需要远程仓库这样的东西了。

但是如果我们是在一个项目组中,或者做的东西想跟别人分享呢,我们就必须学习一下怎么使用远程仓库。

远程仓库的概念,其实在网络的某台服务器上,也有着一个Git仓库,跟我们本地的其实是一模一样的,对于服务器的管理员来说,其实也是一个本地的Git仓库。

像GitHub,和现在CSDN和OSChina的Code等,都为我们提供了这样的空间供我们存放自己的项目,在项目组内部也可以利用GitLab自己搭建一个Git服务器,来作为项目的远程仓库使用。

我学习Git,就是从Git clone这个命令开始的,才发现去拉取开源项目的代码回来看,是可以如此方便的。

我在CSDN上面放了一个Android项目,它的Git地址如下:

https://code.csdn.net/foolsheep/todo.git

那么我可以利用git clone命令将其下载到对应的目录中来。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls -al
总用量 28
drwx------+ 1 Administrators None   0 六月 19 23:15 .
drwx------+ 1 SYSTEM         SYSTEM 0 六月 18 16:17 ..

 克隆远程仓库


现在test_workspace是个空目录,下面我们使用git clone命令:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ git clone https://code.csdn.net/foolsheep/todo.git
Cloning into 'todo'...
remote: Counting objects: 183, done.
remote: Compressing objects: 100% (119/119), done.
remote: Total 183 (delta 49), reused 179 (delta 49)
Receiving objects: 100% (183/183), 1.40 MiB | 323 KiB/s, done.
Resolving deltas: 100% (49/49), done.

我们可以看到利用git clone命令之后,会从上面的地址将整个todo项目给复制到本地了。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ ls -al
总用量 32
drwx------+ 1 Administrators None   0 六月 19 23:16 .
drwx------+ 1 SYSTEM         SYSTEM 0 六月 18 16:17 ..
drwxr-xr-x+ 1 linmiansheng   None   0 六月 19 23:16 todo

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace
$ cd todo

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ ls -al
总用量 54
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 .
drwx------+ 1 Administrators None     0 六月 19 23:16 ..
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 .git
-rw-r--r--  1 linmiansheng   None   333 六月 19 23:16 .gitignore
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 .settings
-rw-r--r--  1 linmiansheng   None  2041 六月 19 23:16 AndroidManifest.xml
-rw-r--r--  1 linmiansheng   None 21422 六月 19 23:16 ic_launcher-web.png
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 libs
-rw-r--r--  1 linmiansheng   None   781 六月 19 23:16 proguard-project.txt
-rw-r--r--  1 linmiansheng   None   664 六月 19 23:16 project.properties
-rw-r--r--  1 linmiansheng   None    10 六月 19 23:16 README.md
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 res
drwxr-xr-x+ 1 linmiansheng   None     0 六月 19 23:16 src

而且在todo项目里面,我们可以看到生成了.git这样的一个Git结构目录。
在之前,我们是利用git init的命令来初始化一个git结构目录的,所以可以想像到git clone命令
应该是先做了git init的操作,然后再去服务器上抓取了对应的数据的。

此时,我们可以利用git remote命令来查看一下当前项目配置有哪些远程仓库。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote
origin

可以看到存在一个远程仓库,origin,这是Git为clone下来的远程仓库所使用的默认的名字。
也可以指定 -v 参数来查看对应的远程地址。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote -v
origin  https://code.csdn.net/foolsheep/todo.git (fetch)
origin  https://code.csdn.net/foolsheep/todo.git (push)

添加远程仓库

如果要添加一个新的远程仓库,可以使用 git remote add <项目名> <远程仓库地址>,

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote add volley https://github.com/adamrocker/volley.git

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote -v
origin  https://code.csdn.net/foolsheep/todo.git (fetch)
origin  https://code.csdn.net/foolsheep/todo.git (push)
volley  https://github.com/adamrocker/volley.git (fetch)
volley  https://github.com/adamrocker/volley.git (push)

可以看到,此时在本地配置中添加多了一个volley的远程仓库。
不过到这里,也就是在配置中增加了而已,并没有进行实际的操作,到这里,其实也可以发现
git clone 命令也为我们实现了 git remote add origin <克隆地址>的操作,对吧。这样才会将对应的远程仓库添加到我们的配置中。

从远程仓库抓取数据(失败)

接下来,我们可以利用git fetch 命令来从远程仓库中抓取数据,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git fetch volley
warning: no common commits
remote: Reusing existing pack: 1469, done.
Receiving objects:   2% (30/1469), 324.00 KiB | 7 KiB/s

。。。这个速度真是有点慢。

这样,我们就将远程仓库的数据抓取到我们本地了。

需要记住一点,fetch命令只是将远程仓库的数据抓取到我们本地,它并不会将数据自动地整合到我们的分支上。

这个分支,太慢了,还是把它删了。

远程仓库本地改名

在Git中,可以利用git remote rm将远程仓库给删除掉,不过在此之前,我们先学习一下rename,也就是改变远程仓库在本地的项目名称。

刚才是volley,现在我们可以将其改成volley_slow,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote rename volley volley_slow

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote -v
origin  https://code.csdn.net/foolsheep/todo.git (fetch)
origin  https://code.csdn.net/foolsheep/todo.git (push)
volley_slow     https://github.com/adamrocker/volley.git (fetch)
volley_slow     https://github.com/adamrocker/volley.git (push)

可以看到,其名字已经变成volley_slow了。

删除远程仓库在本地的配置

好了,现在我们可以把它给删掉了。

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote rm volley_slow

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote -v
origin  https://code.csdn.net/foolsheep/todo.git (fetch)
origin  https://code.csdn.net/foolsheep/todo.git (push)

从远程仓库抓取数据(成功)

接下来,我们重新添加一个远程仓库吧,然后直接抓取数据:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git fetch lmswxdev
Username for 'https://code.csdn.net':
Password for 'https://sheepjtgjfc@163.com@code.csdn.net':
warning: no common commits
remote: Counting objects: 1598, done.
remote: Compressing objects: 100% (1045/1045), done.
remote: Total 1598 (delta 551), reused 1384 (delta 431)
Receiving objects: 100% (1598/1598), 7.95 MiB | 296 KiB/s, done.
Resolving deltas: 100% (551/551), done.
From https://code.csdn.net/foolsheep/lmswxdev
 * [new branch]      dev        -> lmswxdev/dev
 * [new branch]      master     -> lmswxdev/master

有些Git仓库设置了权限,需要输入用户名跟密码,之后,我们就将这个项目的数据给抓取下来了。

还是同样一句话,要记得,此时只是抓取数据下来,我们并没有将抓来的数据整合到我们的当前分支中。

在这里,又发现了,git clone 也实现这个操作啊,它把数据都抓取下来了。

远程分支

远程仓库的分支叫做远程分支,通过branch命令,我们可以看到当前项目下的各分支:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git branch
* master

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git branch -r
  lmswxdev/dev
  lmswxdev/master
  origin/HEAD -> origin/master
  origin/master

不加-r参数,显示的是本地的分支。

指定-r(remote)参数的,显示的则是远程分支。

可以发现远程分支都是以 <仓库名>/<分支名> 在本地显示出来的。

抓取下来之后,就可以把远程分支也当做本地分支来看待,所不同的,你没有办法将你的改变推送到远程仓库,如果没有权限的话。

推送到远程仓库

如果我们拥有权限的话,我们可以利用push命令,将在本地的提交(commit)给推送到远程仓库上,

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git push origin master
Username for 'https://code.csdn.net':
Password for 'https://code.csdn.net':

fatal: Authentication failed

如果没有权限,就没有办法了。

push的语法如下:

git push <远程仓库名> <远程分支名>

不过其完整的命令应该是

git push <远程仓库名> <本地分支名>:<远程分支名>

比如将本地的dev分支推送到远程的master分支,我们就可以使用下面的命令,如下:

git push origin dev:master

而本地分支名如果置空,同时也没有“:”号的话,就等同于:

git push origin master:master

删除远程分支

此如果“:”存在,本地分支号为空的话,如下:

git push origin :master

这表明要将本地的空分支推送到远程的master分支上,这就会删掉远程的master分支。切记!

查看仓库信息

我们还可以利用show命令,来查看本地配置上,远程仓库的信息,如下:

linmiansheng@linmiansheng-PC /cygdrive/f/test_workspace/todo
$ git remote show origin
* remote origin
  Fetch URL: https://code.csdn.net/foolsheep/todo.git
  Push  URL: https://code.csdn.net/foolsheep/todo.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

关于git的远程管理就到这里,结束。