概述
工作中使用git进行代码托管,一开始只知道git add commit,之后了解了git-flow插件,觉得超牛逼,一键生成feature分支,再后来听说原生git命令更好用,于是又去学了原生git命令。
看了下git官方文档,记录下学习的心得。
基本介绍
git分为未跟踪区,跟踪区和暂存区。
文件一般都存放在未跟踪区,修改后的文件也存放在未跟踪区。
-
我们熟知的git add命令会把修改提交到跟踪区。值得一提的是,我们一般使用git add .来提交所有改动,也可以使用git add path/to/file来提交某个文件的改动,还可以用正则来提交某个文件夹里面的所有文件的改动。
-
接下来是git commit命令,它会把跟踪区的文件放进暂存区里面。值得一提的是,可以利用git commit -amend来合并这次和上次的提交。
-
最后是git push origin branch命令,它会把暂存区的文件上传到远程仓库,并且把本地的这些文件重新放进未跟踪区。
查看指令
有几个查看指令是经常用到的。
-
git status。用来查看当前git分支的状态。这个经常用到。
-
git diff --cached。用来查看暂存区的文件和远程服务器的文件有什么不同。
-
git log。用来查看提交历史。
需要注意的是,输入上面某些命令后不能输入命令行了,这时需要点击q来重新回到命令行。
分支
git在分支管理上面非常智能和高效。它并没有把所有分支复制在本地,而是使用指针来进行分支切换。
-
比如说,我们在master主分支上创建一个develop分支,那么git不会傻傻的重新复制一份master分支的内容,而是创建一个叫develop的指针指向master指针指向的分支,然后把当前项目的指针head指针指向develop。所以新建分支操作只是新建指针并调整指针的指向而已。
-
再比如说,我们再本地对master进行开发,提交了开发内容,并且push到了远程服务器。这个时候也没有发生复杂耗时的文件复制过程,仅仅只是把master指针指向了当前修改的分支而已。所以,修改和提交操作也只是调整指针的指向而已。
这就是git很快的原因。
通过上面的例子我们可以看到:
-
git checkout -b branch命令能超级迅速的创建并切换新分支。并且,git checkout branch命令能超级迅速的切换新分支,同时切换本地内容。
-
git branch -a 能够查看本地和远程的所有分支。并且,git branch能够查看本地的所有分支。
值得一提的是,如果我们由于各种各样的原因,不小心在develop或者master分支上做了改动,我们怎么撤销呢?使用git stash命令暂存所有改动即可;然后用git stash list查看暂存的stash清单;利用git stash apply使用某个stash;如果不需要还可以用git stash drop命令删掉暂存的所有stash。
git flow
业界有一套规范的git开发工作流规范。
- master分支。稳定分支,所有经过测试后的分支才能merge进master分支。所有的tag也都在master分支上进行。
- develop分支。开发分支,所有的开发工作需要先测试ok后合并到develop分支。
- feature分支。特性分支,为了开发新特性而从develop分支拉下来的一个分支。开发完成后合并到develop分支。
- release分支。提测分支,专门进行提测的分支,测试完毕后该分支会合并到develop或者master分支。
需要注意的是,对于小项目,有时候没有release分支,直接在feature分支上面提测。另外,feature分支是一个文件夹形式的,里面有很多各种特性的分支,比如feature/href分支等等。
冲突
- git fetch会拉取远程服务器上的数据到本地,但不会覆盖。
- git merge会在文档里面显示出所有的冲突,以供解决。解决完成后只需要正常的git add和git commit即可。
- git pull会同时执行git fetch 和 git merge,并且覆盖掉远程服务器的数据。
值得注意的是,git merge之后非常方便修改冲突,只需要删掉不要的代码即可。删掉不要代码之后的最终代码回覆盖掉远程服务器上的代码。
变基
git rebase待续。