本文末尾 微信公众号 回复 “git” 获取git命令总结思惟导图。原文连接:github.com/crazyandcod…git
Git是目前世界上最早进的分布式版本控制系统。github
所谓版本控制就是在文件的修改历程中保留修改历史,让你能够方便地查询历史提交记录以及撤销以前对文件的修改操做。版本控制系统主要有集中式版本控制系统和分布式版本控制系统两种。bash
集中式版本控制系统,版本库是集中存放在中央服务器的,工做时须要先从中央服务器取得最新的版本,而后开始干活,干完活了,再把本身的活推送给中央服务器。服务器
分布式版本控制系统根本没有“中央服务器”,每一个人的电脑上都是一个完整的版本库,这样,你工做的时候,就不须要联网了,由于版本库就在你本身的电脑上。既然每一个人电脑上都有一个完整的版本库,那多我的如何协做呢?比方说你在本身电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,大家俩之间只需把各自的修改推送给对方,就能够互相看到对方的修改了。微信
学习git首先须要了解其中涉及到的四个重要概念:分布式
对于以上四个概念,咱们依次理解。学习
远程仓库(Remote Directory)就是咱们在远程服务器上面建立的一个仓库,一般这个仓库存储咱们的代码,咱们拿GitHub来作个demo,咱们在GitHub上面建立一个远程仓库awesome-git,这个仓库空空如也,刚建立的,等会咱们便拿这个仓库进行学习git的相关操做。后面咱们须要对这个仓库进行操做,如pull,push,branch,tag,reset等等命令,这些命令后面会详细了解。ui
在上个小节,咱们建立了一个远程仓库awesome-git,咱们须要将它先放到本地进行相关操做,如存放在本地电脑awesome-git目录下,这个本地文件夹awesome-git就是咱们的工做目录,这个就是咱们平时存放项目代码的地方。 spa
咱们在上个小节中工做目录下面会看见一个.git的文件夹,其实这是一个隐藏的文件夹,这个文件夹是Git的版本库,他是存放Git管理信息的目录,初始化仓库的时候自动建立。暂存区英文叫stage, 或index。通常存放在 ".git目录下" 下的index文件(.git/index)中,因此咱们把暂存区有时也叫做索引(index)。其次,Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD。 3d
工做目录中有一个隐藏目录.git,这个就是Git的版本库。
咱们用一张图来表示这四个区域之间的联系:
上面的这张图就是整个git的工做流程,总体以下:
通过以上三个步骤的操做,此时工做目录中的文件状态会经历三种过程:已修改(modified)=> 已暂存(staged)=> 已提交(committed)
上面一系列操做文件的状态会发生变化,咱们来实际学习一下,上面咱们建立的awesome-git这个仓库以后会生成一个README.md这个文件,打开看一下里面内容:里面只有一行“# awesome-git”
咱们在这个文件里面添加一行注释 “深刻理解git” 变成下面:
此时咱们更改了文件,咱们经过一个命令 git status 来查看此时的文件状态:
此刻咱们通过一系列的操做,已经提交到master分支上了,同时工做区里面没有改动了:
通过一系列上述的操做,此刻文件已经放到了master分支上,接下来咱们须要将这个文件push到远程仓库中去,
此刻已经推送到了远程仓库中去了。这是最简单git操做了,下面咱们将在第7小节中讨论其余一系列复杂的操做。
咱们开发项目通常都是进行在分支上面开发的,而不是直接在master分支,当开发完成以后咱们再将在其余分支上面的代码合并到master分支。接下来咱们将详细学习分支的经常使用操做。咱们每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来讲不是指向提交,而是指向master,master才是指向提交的,因此,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也愈来愈长。
咱们经过如下命令来建立一个分支:
//新建dev分支
git branch dev
复制代码
经过以上命令便可建立一个新分支dev,咱们查看如下目前这个repo包含哪些branch
//查看分支
git branch
复制代码
能够看到目前存在两个分支,dev和master分支,master分支前面有个*号表示当前分支是在master上面。咱们能够经过下面命令来切换分支:
//切换到dev分支
git checkout dev
复制代码
上面咱们已经建立了新分支dev,假设咱们在新分支上面开发了一些内容譬如新建一个文件dev.md,咱们把这个文件提交到dev分支,经过如下命令便可完成:
//将dev.md这个文件添加到stage
git add dev.md
//将dev.md这个文件提交到dev分支
git commit -m "add new file to branch dev"
复制代码
1.首先要切回到master分支
2.合并dev分支
//合并语法
git merge 分支名
复制代码
3.解决冲突
首先,咱们切回到dev分支,而后在dev.md这个文件中将里面的内容替换一下:
替换成:
如今尝试合并dev分支就会出现冲突:
Git用<<<<<<<,=======,>>>>>>>标记出不一样分支的内容,咱们只须要确认哪些部分是须要的,删除不须要的部分便可。最后再冲洗提交到master分支。
咱们能够经过下面的命令查看分支合并状况:
git log --graph --pretty=oneline --abbrev-commit
复制代码
在dev分支上面开发好了以后把代码合并到master分支上面,这个dev分支就不须要了,咱们将它删除并查看一下分支状况,能够发现只有一个master分支了:
发布一个版本时,咱们一般先在版本库中打一个标签(tag),这样,就惟一肯定了打标签时刻的版本。 tag 和 branch 有点类似,二者有何区别呢?tag 对应某次 commit, 是一个点,是不可移动的,branch 对应一系列 commit,是不少点连成的一根线,有一个HEAD 指针,是能够依靠 HEAD 指针移动的。因此,二者的区别决定了使用方式,改动代码用 branch ,不改动只查看用 tag。
tag 和 branch 的相互配合使用,有时候起到很是方便的效果,例如 已经发布了 v1.0 v2.0 v3.0 三个版本,这个时候,我忽然想不改现有代码的前提下,在 v2.0 的基础上加个新功能,做为 v4.0 发布。就能够 检出 v2.0 的代码做为一个 branch ,而后做为开发分支。
// 新建tag语法
git tag <tag名>
复制代码
注意: 标签不是按时间顺序列出,而是按字母排序的。能够用如下语法进行查看标签信息
// 查看tag语法
git tag
复制代码
要删除掉你本地仓库上的标签,可使用以下命令:
//删除tag语法
git tag -d <tag名>
复制代码
经过以上命令咱们删除v1.0的tag 而后再查看如下tag,发现只剩下v2.0的tag了。
GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目可以合做进行的中心。 大部分 Git 版本库都托管在 GitHub,不少开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。 因此,尽管这不是 Git 开源项目的直接部分,但若是想要专业地使用 Git,你将不可避免地与 GitHub 打交道,因此这依然是一个绝好的学习机会。
在GitHub上面新建一个test的repo,能够进行如下的命令操做,便可以将本地的东西提交到GitHub上面的test仓库中:
//新建一个readme.md文件
echo "# test" >> README.md
//初始化本地仓库
git init
//将readme.md这个文件加入到stage中去
git add README.md
//将readme.md这个文件放到master分支上去
git commit -m "first commit"
git remote add origin https://github.com/crazyandcoder/test.git
//将这个推送到远程的master分支上去
git push -u origin master
复制代码
专一于 Android 开发多年,喜欢写 blog 记录总结学习经验,blog 同步更新于本人的公众号,欢迎你们关注,一块儿交流学习~