对git的理解
最近接触了一个新的项目,里面用了很多以前没用过的技术和知识。到今天为止已经有一个月,对里面的技术进行一个总结。在这篇文章里,就先对git进行一个总结。写的不好,还请大家给出见意!
1.什么是git呢?
git是一个分布式版本控制系统。它是用来做版本控制的。比如说开发人员每次写完代码提交之后,它就会有一个记录,什么时间,提交了什么代码。如果开发人员想回退到以前版本,就可以用git完成。而分布式,是相对集中式的svn来说的。svn是当开发人员提交时,要把代码提交到一个远程的服务器上。然后其它人员想更新代码,就直接从远程服务器上更新下来。但这样有一个弊端,假如说远程服务器出现什么问题不能链接了,那对开发人员就比较麻烦了。但用git的话,就可以解决这个问题,因为分布式的,就是说每个开发人员的电脑上都有一个系统,只要做到同步,就可以了。当然,一般公司用git的时候,是分布式加中央服务器一起用的。
2.git与svn的区别
(1)分布式与集中式的区别。
git是分布工的,svn是集上式的。这是他们的最大区别吧。
(2)分支
GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。分支在SVN中一点不特别,就是版本库中的另外的一个目录
(3)GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。
3.git的常用命令
git status
命令可以让我们时刻掌握仓库当前的状态
git diff
如:git diff readme.txt
顾名思义就是查看difference
git diff 比较的是工作区和暂存区的差别
git diff --cached 比较的是暂存区和版本库的差别
git diff HEAD 可以查看工作区和版本库的差别
git reset
回退
如:git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD^^ 回退到上上一个版本
git reset --hard HEAD~100 回退到上一百个版本
git log
查看版本库的状态
回退到回退前的那个版本
git reset --hard 3628164
git reflog
用来记录你的每一次命令:
git rm
用于删除一个文件
如:git rm test.txt
创建分支并切换
git checkout -b zhouxin
git branch
查看当前分支
增加到缓存区
git add readme.txt
提交
git commit -m "这是注解"
切换回master分支
git checkout master
合并zhouxin分支到master
git merge zhouxin
删除自己的分支
git branch -d zhouxin
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
如果当前正在zhouxin上进行的工作还没有提交,却有一个bug要去修改,这时该怎么办
Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
这时就可以创建分支来修复bug
首先确定要在哪个分支上修复bug,假定需要在master
分支上修复,就从master
创建临时分支:
然后就可以修改bug了,改完之后,再删除bug分支。
git stash pop
回复到zhouxin分支上,继续自己的开发
git push origin zhouxin
把代码推送到远程zhouxin分支上。如果远程zhouxin不存在,在推送的时候,会自动创建
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!