码迷,mamicode.com
首页 > 其他好文 > 详细

git使用小结二: git的分支和远程仓库

时间:2015-03-13 02:09:06      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

上一篇文章介绍了git的本地基本操作,如果你不需要和他人协作,比如说你自己写一本书,自己写一个小程序,自己写个网站等等,那么已经差不多够用了。但是分享和协作才是自由世界的主题,git也正是为此而生,所以努力成为一个热爱分享和协作的同学吧!^_^


git的仓库的概念可以理解为git管理的那个文件夹,而git远程仓库可以理解为存放在服务器上的大家都可以用git访问的一个git管理的文件夹。(原谅我的大白话,虽然事实必定比这种解释高大上,不过我个人感觉这么理解也无伤大雅~)而要理解远程仓库,就需要理解分支,也就是branch,上一篇介绍的git log命令会列出一系列的commit,也就是保存的修改,那么可以理解这样的从头到尾的commit链条为一个branch,一个git仓库中可以有多个分支,而分支之间可以合并,可以在分支中的任意一个commit的位置新建一个分支,也就是说你可以以任意一个commit之后的状态为基础来进行新的修改,并且不影响之前的分支,就像树有很多树枝一样,可以长在任何地方,对其它树枝也没有影响。其实我想说git采用的是树的结构来管理commit的,每一个commit都是一个节点,有父节点也可以有子节点,而每个根节点到叶子节点的路径就可以理解为一个分支。我们对照着git命令一个个来看。


在实践接下来的命令之前,需要按照下面的oschina git仓库的教程进行个人账户的配置

http://git.oschina.net/oschina/git-osc/wikis/%E5%B8%AE%E5%8A%A9

?  Projects  git clone https://git.oschina.net/lrhehe/ddup.git 
Cloning into ‘ddup‘...
remote: Counting objects: 74, done.
remote: Compressing objects: 100% (51/51), done.
remote: Total 74 (delta 7), reused 0 (delta 0)
Unpacking objects: 100% (74/74), done.
Checking connectivity... done.

git clone <url> 命令是将远程的git仓库克隆到本地,这里是一个简单的正在开发中的个人小项目,刚好用来做例子。

?  Projects  cd ddup 
?  ddup git:(master) git status
On branch master
Your branch is up-to-date with ‘origin/master‘.

nothing to commit, working directory clean

进入到文件目录,查看一下当前的git状态,这里可以看到On branch master的提示,表明正在master分支,下一行的提示是说,你的分支和origin/master是同步的,这里的origin是远程仓库的名字,master是分支的名字,也就是说本地的master分支和远程仓库origin的master分支是同步的。使用git branch -vv 可以来查看这种本地分支和远程分支之间的联系。

?  ddup git:(master) git branch -vv
* master b6ca9bf [origin/master] MOD: new commit of common, change minSdk to 11 for honeyComb

这里说明了当前处在master分支,它的hash值的前7位是b6ca9bf,是与远程仓库origin的master分支同步的。这里同步的意思是说当你在git pull(把远程仓库的代码拉到本地) 和git push(把本地仓库的代码推到远程仓库)的时候,是操作的这两个对应的分支。如果你想一起开发,你添加了一个新的文件:

?  ddup git:(master) ? touch iamcoming.txt 
?  ddup git:(master) ? git add .
?  ddup git:(master) ? git commit -m "ADD: hello"
[master f8962a9] hello
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 iamcoming.txt

看一下git log:

?  ddup git:(master) git log
===========
commit f8962a956ef0f1811a944c454ac74e4b369d5961
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:06:48 2015 +0800

    ADD: hello

已经提交了一个commit,那么现在我想发布到远程仓库,也就是分享给其它的小伙伴,我只需要git push即可

?  ddup git:(master) git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://git.oschina.net/lrhehe/ddup.git
   b6ca9bf..011c5a2  master -> master

这样远程仓库就更新了,不过如果你git push是不成功的,因为我关闭了master的非管理员push权限,如果你成功了,请及时联系我或是红薯大哥!因为mater分支通常是用来发布稳定的程序代码的,所以常见的做法是在本地建立一个分支来开发,当开发完成再合并到mater里面,再push到远程仓库进行分享。你可以这么做:

?  ddup git:(master) git branch test
?  ddup git:(master) git branch -a
* master
  test
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

git branch <name> 就能在当前commit下建立一个新的分支了,git branch -a 可以查看现有的所有分支,可见本地多了一个刚建的test,但是”*“标志告诉我们目前还在master分支下面,我们先git checkout到test下面:

?  ddup git:(master) git branch test
?  ddup git:(master) git checkout test
Switched to branch ‘test‘
?  ddup git:(test) git status
On branch test
nothing to commit, working directory clean

git checkout <branch name>可以切换到其它的branch,在新的branch上你就可以任意枉为了,

?  ddup git:(test) touch ladygaga.nb
?  ddup git:(test) ? git add .
?  ddup git:(test) ? git commit -m "ADD: nb Lady Gaga" 
[test 6289a5e] ADD: nb Lady Gaga
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ladygaga.nb

?  ddup git:(test) git log
=========
commit 6289a5e635a01aa2be943e34c5c5a8d616863bef
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:20:05 2015 +0800

    ADD: nb Lady Gaga

commit 011c5a276c0aa47390b7c026af7371a8f9b3b672
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:06:48 2015 +0800

    ADD: hello

可见新的commit紧跟着之前的commit,我们再checkout到master分支上看看git log

?  ddup git:(test) git checkout master
Switched to branch ‘master‘
Your branch is up-to-date with ‘origin/master‘.
?  ddup git:(master) git log
=============
commit 011c5a276c0aa47390b7c026af7371a8f9b3b672
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:06:48 2015 +0800

    ADD: hello

是不是发现之前的修改不在了,如果你在自己的分支开发完成,那么使用git merge就可以把个人分支的修改合并到当前分支上:

?  ddup git:(master) git merge test
Updating 011c5a2..6289a5e
Fast-forward
 ladygaga.nb | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ladygaga.nb
?  ddup git:(master) git log
============
commit 6289a5e635a01aa2be943e34c5c5a8d616863bef
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:20:05 2015 +0800

    ADD: nb Lady Gaga

commit 011c5a276c0aa47390b7c026af7371a8f9b3b672
Author: lrhehe <lrhehe@gmail.com>
Date:   Fri Mar 13 00:06:48 2015 +0800

    ADD: hello

瞬间master分支就合并了test分支的修改,接下来你只要git push即可分享自己修改的代码给大家了。

但是问题来了,如果你没有push到master的权限怎么办呢,你可以在个人分支下使用git push origin <branch name>来将当前的个人分支push到远程仓库origin,远程仓库origin会新建一个分支,而之后可以跟管理员说一声(略low啊~)来将分支合并到master。下面是个小例子。

?  ddup git:(master) git branch lrhehe
?  ddup git:(master) git checkout lrhehe 
Switched to branch ‘lrhehe‘
?  ddup git:(lrhehe) git push origin lrhehe
Total 0 (delta 0), reused 0 (delta 0)
To https://git.oschina.net/lrhehe/ddup.git
 * [new branch]      lrhehe -> lrhehe
?  ddup git:(lrhehe) git branch --set-upstream-to origin/lrhehe 
Branch lrhehe set up to track remote branch lrhehe from origin.
?  ddup git:(lrhehe) git branch -vv
* lrhehe b6ca9bf [origin/lrhehe] MOD: new commit of common, change minSdk...
  master b6ca9bf [origin/master] MOD: new commit of common, change minSdk...

至于怎么跟管理员说就随意了~^_^

git使用小结二: git的分支和远程仓库

标签:

原文地址:http://my.oschina.net/lrhehe/blog/386437

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!