1、分布式版本管理
Git和SVN最主要的区别在于Git是个分布式的版本管理系统,而SVN是集中式的版本管理系统。Git有本地仓库和远程仓库,在离线情况下Git依然能通过本地仓库创建分支、提交代码、合并分支等操作,而SVN必须依赖于远程仓库进行这些版本操作。
2、Git的工作区域
Git分为四个工作区域,分别如下:
Working Directory(工作目录):包含已经提交或者正在编辑的文件,也就是我们IDE中能看到的文件。其中正在编辑的文件分为未跟踪的(untrack)和已修改的(modified)。未跟踪的是没有执行git add的文件,执行git add命令后文件信息会记录到staging area暂存区中。已修改的文件是指已经位于暂存区,但是还没执行git commit命令,没有提交到本地仓库的文件。
Staging Area(暂存区):工作目录中修改的文件需要经过git add加入暂存区后才能使用git commit提交到本地仓库。注意我们使用IDEA的时候经过add的文件修改后不需要再次add就可以直接commit了,这并不是不需要git add加入到暂存区,而是IDEA的commit功能实际上是等同于连续执行 git add 与 git commit。
//将工作区文件拷贝到暂存区git add src/main/java/com/arain/GitTestFile.java//放弃工作区的修改,将暂存区文件覆盖工作区文件git checkout src/main/java/com/arain/GitTestFile.java//删除暂存区中的该文件git reset src/main/java/com/arain/GitTestFile.java
Repository(本地仓库):建立本地仓库后项目文件夹下会有.git名字的文件夹,这个文件夹下就存储着代码的版本信息。工作区通过git add以及git checkout与暂存区进行交互,暂存区通过git commit和git checkout HEAD与本地仓库进行交互。
这里需要注意的是git checkout是使用暂存区的记录覆盖工作区的记录,而git checkout HEAD是使用本地仓库的数据来覆盖暂存区和工作区的数据:
git checkout HEAD src/main/java/com/arain/GitTestFile.java
Repository(远程仓库):与SVN不一样的是,Git中与远程仓库交互的是本地仓库。通过git push将本地仓库的修改提交到远程仓库,通过git pull(相当于git getch+git merge)将远程仓库的修改拉到本地仓库来并且更新工作区代码。
3、git的分支操作与工作流程
//新建一个名为brancetest的分支git branch brancetest//查看本地的分支git branch//查看远程的分支git -r branch//删除本地brancetest分支git branch -d brancetest//重命名本地分支为branchtestgit branch -m brancetest branchtest//将当前工作的分区切换到branchtestgit checkout branchtest//切换到master分支后,将branchtest分支合并到master分支git merge branchtest
通过上面命令,可以知道本地仓库的分支和远程仓库的分支并不是一样的,在本地仓库只有我自己使用,可以根据需要建立分支,而远程仓库的分支需要做一些管理,以规范代码的提交、版本发布等流程。下面是别人总结出来一个常用的代码管理流程,开发者用于提交代码的分支是Develop分支,基于这个分支也会衍生出其他的bug-fix分支、feature-dev分支等,等到需要发布新版本时就在Master分支上执行merge命令。这里merge的时候注意使用git merge --no-ff develop,使用--no-ff会避免直接将Develop分支上的每个提交节点并入到Master分支中,Master分支会新建一个节点避免混乱。
对于这种版本迭代一般会打上版本标签,标签的使用方式如下:
//给当前分支的代码打上v1.0标签git tag v1.0//查看本地taggit tag//将tag推送到远程仓库分支git push origin v1.0//查看远程仓库分支的taggit ls-remote --tags origin//检出某个标记为v1.0的tag的代码并新建一个newbranch分支进行开发git checkout -b newbranch v1.0
参阅文章:http://www.ruanyifeng.com/blog/2012/07/git.html