Git的使用教程(七)远程仓库

     之前的操作我们只是把Git当做了一个仓库,做本地的一个版本管理,这对Git来说简直大材小用。Git作为分布式版本控制系统,分布才是其特色,如何分布呢?肯定要有一台机器充当原始的版本库,其他的机器“克隆”这个原始版本库,其实每台机器上的版本都一样,没有主次之分,之所以有原始版本库,是为了方便多人协作时候有一个基准,让各机器上的版本保持一致。一般情况下,原始的版本库不会跟我们工作的电脑在一起,它对于我们来说是远程的,所以我们可以称之为远程仓库。

    既然是远程,肯定还需要一台机器充当服务器(原始版本库),而且这台机器需要保证24小时开机,这样才能保证其他用户可以随时克隆原始版本,推送提交到该服务器,拉取别人的提交。我们目前只是为了学习Git,特意找个服务器划不来,好在大Git地位超然,很多网站纷纷提供Git仓库托管服务,像是国内外都著名的github.com,国内著名的git.oschina.net。虽然两者都能够提供托管服务,但是github免费建立的只有公仓(对所有用户都可见),私仓(仅对自己可见)是要付费的,而oschina的公私仓都不需要付费,而且是国货,理应支持,因此小编就选择了oschina建立远程仓库。

    关于在oschina申请账号这里就不再复述了,假定你已经拥有了账号并登录,那么我们就可以建立一个远程仓库了。在oschina上创建一个远程仓库很简单,我们点击新建项目,我们必须要填写的只有项目名,其他的可以根据你的需要进行选择,有一点需要提示的是,如果你已经有git项目想要直接推送到远程仓库,不要让远程仓库初始化,也就是不要勾选“使用Readme文件初始化这个项目”,如果你不想让别人看见你这个项目,勾选“私有项目”。

    

    我们成功了建立了一个空的远程仓库,里面什么都没有,于是乎给了我们友情提示,告诉我们应该怎么做。


    虽然他们真的很用心,但是并没有面面俱到,没关系,就由小编来补充他们的一些不足吧。不同的两台电脑之间需要进行数据传输,肯定需要桥梁,oschina为我们提供了两种选择,一种是HTTPS,一种是SSH。如果使用HTTPS,倒是不用做什么特别的事情,上述教程足以让你把本地项目成功推送到远程仓库,但是每次推送都需要输入账号和密码(oschina的账号密码),十分麻烦,因此我们可以选择另一种方式,SSH。

    使用SSH就需要创建SSH Keys,很多人不知道如何创建,没关系,oschina想到了这点,特意给除了教程

    

    Linux的跟着教程走就行,下面我们来看下windows的。我们使用Git Bash终端,然后同样输入

扫描二维码关注公众号,回复: 2778690 查看本文章
ssh-keygen -t rsa -C "[email protected]"

然后一路回车即可。在"C:\Documents and Settings\Administrator\.ssh"中就有我们需要的文件id_rsa.pub。
   
然后打开oschina添加SSH公钥的地方, 点击这里,前提是你已经登陆了。然后输入个标题,把刚才生成的id_rsa.pub中的内容拷贝一份到公钥处,然后点击确定即可,这样准备工作就已经完成了。

    接着我们就可以通过SSH沟通本地仓和远程仓了。
    
    添加远程仓库
git remote add osc-git [email protected]:XXXXXXX/git.git
其中git remote是告诉Git要执行远程仓库相关命令,add是添加,osc-git是远程仓库名(很多教程使用origin作为远程仓库名,非必须,可以根据情况进行修改),为简化书写远程仓库地址而存在,以后进行远程相关操作的时候只需要使用远程仓库名即可,git@……则是我们远程仓库实际的SSH地址,就这样,我们便成功的添加了一个远程仓库。

    查看远程仓库
git remote     //只输出远程仓库名称
git remote -v  //输出远程仓库名和地址

    删除远程仓库
git remote rm osc-git

     推送到远程仓库
    git push命令用于将本地分支的更新推送到远程分支。
git push <远程仓库名> <本地分支名>:<远程分支名>
例如我们将本地的master分支推送到远程仓库的master分支就可以这些书写
git push osc-git master:master
    注意事项
1.我们在推送的时候,一定需要注意的是本地分支称和远程分支的位置,千万不要搞错了。
2.用于推送的本地分支一定要存在,否则会报错,远程分支可以不存在,当远程分支名不存在的时候将会被新建。

当然我们还可以简写为
git push osc-git master
其中master代表的是本地分支,这样同样能够达到推送本地master分支到远程master分支的效果。
带:的时候,我们可以用于推送不同名称的分支,例如git push osc-git master:dev,此时我们就把本地master分支推送到了远程的dev分支上。不带:的时候我们只能用于推送本地master分支到远程master分支。建议同名分支之间进行推送,因此我们常用简写形式。

有时候我们会在教程上看到远程仓库名的前面有一个-u参数,例如
git push -u osc-git master
    加上-u跟不加-u有什么区别呢?
    区别一:加上-u,我们在git status的时候会发现多了一行,“Your branch is up-to-date with 'osc-git/master'”,这有何用?为了说明其作用,我们使用git push -u osc-git master推送之后在新建一个文件,然后git add和git commit,此时本地仓就比远程仓多了一个提交。然后我们再次git status,你看到了什么,看到了什么,没错就是提示,Git再提示我们本地仓的分支比'osc-git/master'领先了一个提交,说白了就是告诉我们,本地仓和远程仓不同步了,我们应该git push了。如果没有-u,那么使用git status的时候不会得到任何提示。可见-u的作用就是让本地仓分支和远程仓分支关联起来,当然这种操作只做一次即可,之后进行git push的时候就不必加-u了,因为Git已经知道这两个分支的关系。是不是觉得Git太友好了,当然这种友好还是有些缺陷,因为它是单向的,只有当本地仓的提交超出了远程仓的提交的时候,git status才有提示,但是远程仓提交超出本地仓提交的时候,git status不会有任何提示,这点一定需要注意。
    区别二:一会我们会讲到git pull命令,是用于拉取远程分支内容的命令,使用-u之前,我们必须使用完整的命令git pull osc-git master来拉取远程分支内容,直接使用git pull的时候会报错的,但是使用过-u之后,我们可以直接使用git pull来拉取远程master分支的内容,当然也只能拉取远程的master分支(这里只是以master分支为例,实际能够拉取的分支以你在使用-u的时候绑定的远程分支为准)。


    
    首次进行推动的时候,会得到一个警告,这是因为Git使用SSH连接,而SSH首次连接oschina服务器的key时,需要确认oschina的key是否真的来自oschina,输入yes即可。然后Git会输出一个警告,告诉你已经把oschina的key添加到本机信任列表里了,下次再进行连接的时候就不会出现警告了。
The authenticity of host 'git.oschina.net (xxx.xxx.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'git.oschina.net,xxx.xxx.xxx.xxx' (ECDSA) to the list of known hosts.
此时我们再来看下那个远程仓库,原来的空仓库是不是已经有数据了,而且跟我们的本地仓库的目录结构是一致的,就这样我们完成了Git的第一次推送。

     从远程仓库克隆
    刚才我们是假设远程仓库为空仓,把本地仓库通过git push推送到了远程仓库,如果远程仓库本来就有内容,我们需要拉取到本地应该如何做呢?其实很简单,通过git clone轻而易举就能做到。
git clone [email protected]:xxxxxxxx/git.git
有一点需要注意的是,使用git clone拉取的是带有项目名称的文件夹,例如上述操作拉取的就是git文件夹,并非直接拉取项目下的文件和文件夹,因此选择本地仓库位置的时候需要注意。

    从远程仓库拉取
        
    当远程仓库的分支超出了本地分支的提交,git push将不能推送,此时我们就需要首先拉取远程分支内容,然后和本地分支合并后才能git push。

    方法一:git fetch+git merge
git fetch osc-git master
git merge osc-git/master
    git fetch用于获取远程仓库的分支内容到本地,git merge则用于合并远程分支内容到本地分支,此时远程分支就和本地分支同步了。    

    方法二:git pull
git pull osc-git master
    git pull是git fetch和git merge两个命令的合体状态,只需要一个命令就能完成上述两步操作,如果在git push的使用-u绑定了一个分支,例如git push -u osc-git master,此时连后面的osc-git master都可以省略,我们只需要git pull就能拉取远程仓库osc-git的master分支,当然该写法只能拉取默认关联的分支,上述例子中就只能拉取osc-git的master分支。
    虽然方便了,但是也存在着弊端,尤其是在多分支的情况下。例如现在本地有两个分支,一个master分支,一个dev分支,对应远程仓库的osc-git/master和osc-git/dev,我们本想拉取osc-git/dev到dev分支,但是没注意现在使用的是master分支,直接使用了git pull osc-git dev,杯具了,Git直接合并了master和osc-git/dev,这不是我们想要的,发现了错误及时弥补,git reset --hard  xxxxxx,好了master终于回到了原来的状态。虽然存在补救措施,但是同时也告诉了我们git pull可能会带来的隐患,因此我们应该避免使用git pull,尽量使用git fetch和git merge,虽然这样做仍然可能会犯上述错误,不过几率一定会大大降低。

猜你喜欢

转载自blog.csdn.net/a7442358/article/details/50407448