标签:
上一篇文章介绍了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...
至于怎么跟管理员说就随意了~^_^
标签:
原文地址:http://my.oschina.net/lrhehe/blog/386437