git 的使用(6)-git远程仓库

来源:互联网 发布:生化危机人工智能图片 编辑:程序博客网 时间:2024/05/18 02:17
前言:

前面几节,已经对git常用的、基础的东西已经学的差不多了。可以说是够用了,只要勤加练习,git 小意思。

第一节里,我们学习了github上创建项目以及生产ssh等操作,这里就不再累述了,因为也比较简单。

说一下,因为远程提交代码到github,github支持https和ssh。但是用ssh的好处就是速度快,而且每次提交到github时候不需要输入账户密码就能提交了。

同样参考下面的:

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

http://git.oschina.net/progit/


创建github远程仓库

前面几节呢。我们用了一个例子learngit项目,假如,现在我们在本地创建好了。想推送到github上,作为服务器端保存,如何是好呢?

首先我们得熟悉github网站的操作流程,如何创建一个项目, 虽说都是英文,但是也还是比较好操作的,多看一看也就会了。好。言归正传,我们来学习下如何在github上创建一个仓库:

第1步登陆后,粘贴ssh代码到github,为了便于git push 提交。

参考我的第一篇:http://blog.csdn.net/think2me/article/details/8944011

第2步就是创建github项目了:

点击 + 、New respository (新建仓库)


输入我们需要创建的仓库名字,我们取名learngit。description,就是对这个项目的简单的描述和介绍,后面可以修改的。Public和Private。是否是公开还是私密,我们选择公开,因为私密的是要钱滴~。点击Create repository 就完成了创建:


跳转到一个新页面,是learngit的项目详情页,因为是空的什么都没有,所以他提示给我们,要么再本地创建一个新的仓库,然后推送到github。要么是
将本地存在的一个版本库和github的关联起来。显然我们的情况是下面的一种。


好。既然我们是下面的这种,那么我们就跟着它的提示操作吧:

先将本地的和github的关联起来,这样做的好处就是更新和推送的时候就产生了关联。注意写法:
$ git remote add origin git@github.com:iyangyi/learngit.git

没有任何提示就是对了。origin 这个名字是通用的远程的名字,当然你也可以叫其他的任何名字,比如:pig, dog都行。一般我们这样写,也懒得改。

然后我们将本地的往github上推送。同样是用它提示的代码,我们输入:
$ git push -u  origin masterCounting objects: 34, done.Delta compression using up to 2 threads.Compressing objects: 100% (29/29), done.Writing objects: 100% (34/34), 3.00 KiB | 0 bytes/s, done.Total 34 (delta 10), reused 0 (delta 0)To git@github.com:iyangyi/learngit.git * [new branch]      master -> masterBranch master set up to track remote branch master from origin.

ok,这个一大串的提示下来,我们知道成功了,我们可以去github的网站上看一下,果然,和本地是一模一样同步了。`(*∩_∩*)′

把本地库的内容推送到远程,用git push命令实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,直接用:git push就能推送到远程的master分支了。

我们举一反三,居然可以把dev分支推送到远程的dev分支,那我们现在来推送一下dev分支:

$ git checkout devSwitched to branch 'dev'$ git push -u origin devWarning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.Total 0 (delta 0), reused 0 (delta 0)To git@github.com:iyangyi/learngit.git * [new branch]      dev -> devBranch dev set up to track remote branch dev from origin.

ok, 成功。我们去github网站上看一下,果然也推送过去了。


从远程仓库克隆

上面的我们讲到的呢,是本地的代码已经存在,我们推送到github远程,但是现实上,我们很多有是远程已经创建好了,或者是别人的项目,我们需要把代码拉到本地开发或者使用。那么就需要用到git 中的克隆了。

好,我就拿我前不久的一个PHP框架项目来演示吧:https://github.com/iyangyi/YfPHP



现在远程仓库准备好了。我们可以使用git clone命令来克隆远程的项目,找个命令支持多种协议,https,或者ssh,都行。

git@github.com:iyangyi/YfPHP.git 

https://github.com/iyangyi/YfPHP.git  

这两种地址协议都是可以的,只不过ssh安全且速度较快。
$ git clone git@github.com:iyangyi/YfPHP.gitloning into 'YfPHP'...Warning: Permanently added the RSA host key for IP address '192.30.252.130' to the list of known hosts.remote: Counting objects: 212, done.remote: Total 212 (delta 0), reused 0 (delta 0)RReceiving objects: 100% (212/212), 211.14 KiB | 58.00 KiB/s, done.Resolving deltas: 100% (63/63), done.Checking connectivity... done.


$ git clone https://github.com/iyangyi/YfPHP.gitloning into 'YfPHP'...remote: Counting objects: 212, done.remote: Total 212 (delta 0), reused 0 (delta 0)Receiving objects: 100% (212/212), 211.14 KiB | 42.00 KiB/s, done.Resolving deltas: 100% (63/63), done.Checking connectivity... done.

这两种方式基本差不多,唯一的不同的是,如果你的用是https的方式clone的时候,你以后每次push操作都要输入账户密码。但是,如果你的ssh方式clone的话,就不需要了,因为你已经把ssh 码填到github网站上去了。
所以:推荐用ssh方式克隆。


注意:当你从远程库clone时,默认情况下,只能看到本地的master分支。不信可以用git branch命令看看:

$ git branch* master

查看所有的分支,可以使用git branch-a命令查看:
$ git branch -a* master  remotes/origin/HEAD -> origin/master  remotes/origin/gh-pages  remotes/origin/develop  remotes/origin/master

默认其他的几个都是红色字体是,隐藏的,现在的情况是本地是没有,所以我们必须创建这个分支才能修改git checkout -b gh-pages origin/gh-pages命令来创建并切换到这个分支,注意后面多了一个origin/gh-pages表示 创建分支是基于远程的gh-pages,origin表示远程:

$ git checkout -b gh-pages origin/gh-pagesBranch gh-pages set up to track remote branch gh-pages from origin.Switched to a new branch 'gh-pages'$ git branch* gh-pages  master

默认使用clone 的话,会自动的将本地和远程origin 给关联起来了的。我们不需要用下面语句:
$ git remote add origin git@github.com:iyangyi/learngit.git
再去关联。

可以通过查看git remote 命令查看

fork更新与提交

我们经常会使用fork ,fork 命令就是把其他人的代码,拷贝一份到我的个人仓库,那么这样我就有了这个项目的一一模一样的备份。可以作为子模块的形式使用,或二次开发 。

在开源项目中点击fork按钮,稍等一会儿,该项目便会拷贝一份到你的respositories中。

那么它就成了我个人的一个项目了。与自己创建的rep的区别是,你能更新同步原始项目的代码,不能报issues,只能报issues给原始的rep项目。

比如:我刚刚fork 了一个项目,就在我自己的仓库下了。 https://github.com/iyangyi/translations

现在我先拉到本地:用上面说到的 git clone命令:

$ git clone git@github.com:iyangyi/translations.gitCloning into 'translations'...remote: Counting objects: 453, done.remote: Compressing objects: 100% (233/233), done.Receiving oemote: Total 453 (delta 217), reused 448 (delta 215)/453), 2.05 MiBReceiving objects: 100% (453/453), 2.07 MiB | 109.00 KiB/s, done.Resolving deltas: 100% (217/217), done.Checking connectivity... done.Checking out files: 100% (110/110), done.

上面说过,使用clone 命令,是默认已经将本地和远程origin管理起来的。我们通过 git remove -v命令查看

$ git remote -vorigin  git@github.com:iyangyi/translations.git (fetch)origin  git@github.com:iyangyi/translations.git (push)

所以正常的我们在这个项目中增删改 用 git push origin master git pull完成提交和更新

现在问题来了。因为我这个rep 是fork 派生的其他人的,而且github 是不会自动更新同步新的代码的。那么我如何将parent的代码更新到我自己的这个fork rep中呢?

有很多种方法可以在做,这里说一种,用到命令 git fetchgit merge 

1.  先关联一下parent 源的远程,现在就需要用到 git remote add命令了。

我们一般使用upstream这个名字来表示是上游的源头parent地址。当然你可以改成其他的名字。

$ git remote add upstream git@github.com:oldratlee/translations.git

这样就关联好了。就有2个remote 源了。用 git remove  命令再看一下:
$ git remoteoriginupstream
origin 是我自己fork出来的地址源。upstream 是它的parent的地址源。

2.  git fetch upstream 命令获取upstream 的所有分支 :
$ git fetch upstreamremote: Counting objects: 39, done.remote: Compressing objects: 100% (21/21), done.remote: Total 39 (delta 20), reused 37 (delta 18)Unpacking objects: 100% (39/39), done.From github.com:oldratlee/translations * [new branch]      master     -> upstream/master

3. upstream 的 master 分支的改动用 git merge 合并过来
$ git merge upstream/masterAuto-merging README.mdMerge made by the 'recursive' strategy. 10-things-you-didnt-know-about-java/README.md      | 551 +++++++++++++++++++++ .../for-you-my-dear-coworkers.jpg                  | Bin 0 -> 92248 bytes .../java-mystery.jpg                               | Bin 0 -> 82217 bytes README.md                                          |   7 + bash-3-man/README.md                               |   2 +- git-workflows-and-tutorials/README.md              |   2 +- 6 files changed, 560 insertions(+), 2 deletions(-) create mode 100644 10-things-you-didnt-know-about-java/README.md create mode 100644 10-things-you-didnt-know-about-java/for-you-my-dear-coworkers.jpg create mode 100644 10-things-you-didnt-know-about-java/java-mystery.jpg
4. 好。合并好了。我们前面学习过,merge 后会自动commit的,我们就不用add 和 commit了。那么就需要下一步: git push origin master 推送到我自己pro的远程端了。
$ git push -u origin masterCounting objects: 50, done.Delta compression using up to 2 threads.Compressing objects: 100% (42/42), done.Writing objects: 100% (42/42), 179.36 KiB | 0 bytes/s, done.Total 42 (delta 22), reused 0 (delta 0)To git@github.com:iyangyi/translations.git   76bd644..bc4085a  master -> masterBranch master set up to track remote branch master from origin.
记住,别 push 到 upstream 上了。因为,这是别人的,你没权限!

5. 如果,你提交了修改,想把修改提交到upstream上了。你可以到 github 上发起一个pull request。它会把改动发送到upstream的人那,他觉得你改的好,就将你这次提交的给合并到分支上去。

小结

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

可以使用命令git pull origin master获取远程的更新

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

要同步fork源头的代码到自己的,用

1.git remote add upstream git@github.com:oldratlee/translations.git

2.git fetch upstream

3.git merge upstream/mester


0 0