之前一直在用SVN,但是作为一个集中式的版本管理器,SVN对网络的依赖性太高,并且对于分支的处理过于低效,一直想学习GIT,没有机会,刚好这次项目中用到了GIT,趁此机会好好看了看。
GIT作为分布式的版本管理器,实现的思路和SVN有着本质上的区别,在GIT实现中,并不一定要有集中存放代码的服务器,每个参与项目的电脑上都有项目的一个备份,在经过修改之后,再把修改的地方发布给别的参与者,实现版本管理。但是,为了管理的方便,一般也会架设GIT服务器,而现在网络上已经出现了一些GIT的代码托管网站,最出名的包括GITHUB、BITBUCKET等等,GITHUB的免费项目只能是公开的,私有项目必须要交点保护费;而BITBUCKET允许免费创建私有仓库。
GIT中有本地仓库和远程仓库的概念。
本地仓库又可以进一步分为工作区(即项目所在的目录)、暂存区(准备提交到本地库的文件所在的地方)以及本地库,它的操作包括以下内容:
1、创建本地库:cd path-to-create-repo; git init; 完成这个步骤后,文件夹下会生成隐藏的.git文件夹,里面有版本管理需要的文件,不要轻易修改和删除
2、往仓库里增加项目文件包括两个步骤:add和commit. 刚刚说过本地仓库分为三个区域,add的作用是把文件从工作区提交到暂存区, commit是从暂存区提交到本地库,完成这两个步骤后,就可以用push命令将本地库推送到远程库中
3、工作区的文件修改后,也需要通过add和commit命令提交到本地库. git add filename; git commit -m "comment"
4、若要查看当前git的状态,可以通过git status来查看,里面会详细地列出工作区的哪些文件已经被修改但还没增加到暂存区,暂存区里有哪些文件还没提交到本地库
5、若要查看提交过的版本信息,可以通过git log来查看。git log [--pretty=oneline], 该命令会详细地列出提交的每个版本信息
6、撤消修改:
工作区修改内容回退:如果在工作区的文件已经被修改,但是还没提交到暂存区,这时候想撤消这些修改,可以用git checkout -- filename来撤消。
从暂存区回退:如果工作区的文件修改已经被add到暂存区中,这时候若要撤消修改,可以用git reset HEAD filename来撤消修改
历史版本回退:如果修改的内容已经用add和commit命令提交到版本库中,也可以用git reset命令。git reset HEAD^: 表示回退到上一个版本; git reset HEAD^^:表示回退到前两个版本;git reset versionID: 表示回退到相应ID的版本,具体每个版本的ID可以通过git log来查看
7、删除库中的文件: git rm filename; git commit -m "comment"
远程仓库主要的用途是用于多人协作,所有人都在本地保留自己的版本库,而需要他人共同协助完成的,就要把自己本地库的代码推送到远程库中。它的操作包括:
1、建立远程库:可以选择github,bitbucket等代码托管工具,注册自己的帐号,然后创建相应的远程仓库,例如我在github上建立了名为learngit的远程仓库
2、关联本地仓库和远程库:git remote add remoteRepoName URL. 这里就把URL代表的远程仓库在本地的代号设成了remoteRepoName, 由于GITHUB同时支持三种传输方式(分别为ssh,https和svn)因此我在github上创建的learngit的URL(基于ssh协议)就可以是git@github.com:myUserName\learngit. 其中myUserName表示我在github上注册的用户名。 一般来讲remoteRepoName默认设为origin,因此就会有这样的命令git remote add origin git@github.com:myusername/learngit.git.
3、推送:git push origin master. 其中origin表示我要推送本地库到哪个远程仓库中,master表示我要推送的分支. push命令如果设置了-u选项,不但可以推送本地仓库到远程,还可以实现本地分支master和远程仓库中的master分支进行关联。
4、从远程仓库中下载代码: git clone URL [path]. 这样就能把远程仓库中的代码下载到本地
5、查看远程仓库的信息: git remote. 可以得到远程库的相应信息
6、删除与远程仓库的关联: git remote remove repoName.
在git中,除了本地仓库和远程仓库的概念,还有个最重要的概念是分支。分支应用的场景主要包括 BUG修复、功能增加等场景。想像一下,如果在开发的过程中,万恶的甲方突然说要增加功能feature1,上司把这个任务摊派到你的身上,这时候你要面临的情况就是,这个功能可能很复杂,你一时半会儿没有开发完,没有开发完的自然就不能往版本库里提交(会影响别人使用的!),但你又希望有版本管理的机制,这时候你就可以用上分支了。GIT中默认有个主分支master,由于在GIT中创建、合并、删除分支的开销很小,因此,GIT建议,在每个人的本地库中形成自己的分支,在自己的分支中修改、提交,只要不和主分支master进行合并,就不会影响别人的正常使用。
1、分支的创建: 两种方式: git branch branchname; git checkout master; 或者git checkout -b branchname. 两者的功能是一样的。创建完分支后,你就可以在该分支上进行修改、删除、提交等操作,在这个分支里的操作,只要不合并到master分支中,并不影响其它人的使用
2、分支的查看: git branch. 该命令会列出目前所有的分支,并在当前所在的分支前加个*号标识
3、分支的合并:git merge branchName. 该命令是把branchName分支合并到当前分支,正常情况下两个分支可以顺利合并,有时候会出现冲突(两个分支修改了同一个文件的同一个地方),这时候就需要利用git status查看出现冲突的文件信息,然后找到该文件,解决完冲突,再通过git commit命令来实现合并。
4、分支的切换: git checkout branchName. 可以利用该命令切换到相应的分支,但前提是切换前当前分支的修改内容已经提交到版本库中
5、分支的删除:git branch -d branchName.
6、分支的关联: git branch --upstream branchName origin/branchName
在分支中,比较重要的是bug分支和feature分支,这两个分别对应于之前说的解决bug和增加功能,在发现一个bug或增加新功能时,通常会创建一个新的分支,在该分支中解决问题,然后把该分支合并到主分支中;另外,如果在某个分支进行到一半时,突然急需解决一个新的问题,比如,你在开发一个新的功能,进行到一半,这时候老板需要你立刻解决一个bug,一种方式是提前当前分支的修改内容,然后创建bug分支来解决,但有可能我目前的修改还不完整,我并不想提交现在的内容,这时候可以用git stash命令暂时保留当前分支的所有状态,这个命令会使工作区回到上次提交时的状态,这样你就可以切换回主分支,然后创建一个分支,解决bug,提交;然后再用git stash pop命令来继续之前的工作。
使用git来管理代码的很大一部分原因是需要多人协作,在git中,多人协作的模式一般是这样的:
1、在本地创建分支,增加功能或者修复bug
2、将本地分支推送到远程,如果推送失败,说明远程端的分支更新,就要用git pull命令将远程中最新的提交下载下来,并尝试与本地分支合并
3、如果发现冲突,在本地解决冲突, 并提交到本地
4、再次推送
git的内容远远不止这些,这里只是简单记录了首次学习git的内容,在这里,强烈推荐这个人写的git教程,很适合零基础学习git的人