背景
早之前在使用Git也做过一些浅浅的笔记,但是随着后来对层次和节奏的更高追求,也对Git工作流有了更高的要求。只是简单的add和commit很难满足这项要求,实质上,缺乏了对分支功能的深入挖掘,Git其实和svn相比优势也不大,毕竟如果只是比较速度,svn在局域网下速度并不慢。
Git简单操作&简单流程
初始化和添加远程仓库
| 1 | 初始化 | 
常用的git操作
添加数据到暂存区
| 1 | git add <fileName> //指定文件添加 | 
从暂存区撤回
| 1 | git checkout <fileName> | 
提交文件
提交文件分为两种
- 提交到本地版本库1 git commit -m "提交说明" 
- 提交到中央仓库所以提交到远程仓库的语法是: git push <远程仓库> <本地仓库>1 
 2
 3
 4提交本地master分支到远程仓库origin 
 git push origin master
 提交本地master分支到远程仓库t
 git push test master
比较文件
所有操作中我觉得最重要的是比较操作了,这是一个,非常常用且非常重要的操作。
对比操作根据对比对象的不同,分为以下几种:
- 工作目录同暂存区对比
- 工作目录同版本库对比
- 暂存区同版本库对比
- 同分支不同提交之间对比
- 不同分支之间文件对比
- 工作目录同暂存区对比 - 1 
 2
 3
 4- 指定对比文件 
 git diff <fileName>
 对比全部
 git diff
- 工作目录同版本库对比 - 1 
 2
 3
 4
 5
 6- 对比工作区和最近提交版本库1.txt文件变化 
 git diff HEAD -- 1.txt
 对比工作区和最近提交版本库a文件夹变化
 git diff HEAD -- ./a
 对比全部变化
 git diff HEAD
- 暂存区同版本库对比 - 1 
 2
 3
 4
 5
 6- 对比暂存区和最近提交版本库1.txt文件变化 
 git diff --cache HEAD -- 1.txt
 对比暂存区和最近提交版本库a文件夹变化
 git diff --cache HEAD -- ./a
 对比全部变化
 git diff --cache HEAD
- 同分支不同提交之间对比 
- 不同分支之间文件对比 - 1 
 2
 3
 4- 比较master分支和foo分支文件差异 
 git diff master..test
 比较master分支和test分支上1.txt不同
 git diff master test 1.txt
分支操作
语法:
| 1 | 'git branch' [--color[=<when>] | --no-color] [-r | -a] | 
查看分支,查看分支有几种方式:
- 只看本地 1 git branch 
- 只看远程 1 git branch -r 
- 查看全部1 git branch -a 
其他常见的的分支操作:
- 添加新分支 - 1 
 2- #创建test分支 
 git branch test
- 切换分支 - 1 
 2- #切换到test分支 
 git checkout test
- 删除分支 - 1 
 2- #删除test分支 
 git checkout -d test
- 复合操作:新建并切换过去 - 1 - git checkout -b foo 
- 分支映射 - 1 
 2- #设置abc分支提交到远程test分支 
 git branch --set-upstream abc origin/test
改变历史
最常见的改变历史情况是:当提交完一个修改之后让同事更新去看结果,然后瞬间发现有个文件没有提交
这种修改相对简单,使用 --amend命令即可
| 1 | git commit -m "这是一个有遗漏的提交" | 
除了这种最常见的,还有两种非常常用的改变历史:
- 删除提交历史中的某次提交记录
- 融合过去若干次提交的变为一个
删除体检提交历史中的某次提交记录
第一种方式(拣选):
做个简单例子,假如有一下提交记录:A-B-C-D,其中,A,B,C,D都指代对应提交的tag,假设我们需要改变历史,使其变成A-B-D,也就是从提交历史中删除C:
| 1 | #首先,跑到B位置去,使用checkout | 
第二种方式(变基)
变基(rebase)是个相对高级的命令,执行之前需要知道发生了什么:
语法: 
| 1 | git reset --onto <newbase> <since> <till> | 
这里声明一下 since不含since,而till包含till(这个不说了,懂的自然会懂…)
执行细节:
- 执行git checkout 
- 产生临时文件,存放版本范围
- git reset –hard 
- 根据临时文件中版本范围,逐一提交到
- 1 如果该提交已经包含,跳过
- 2 如果文件冲突,变基暂停
- 3 冲突解决后执行git rebase –continue继续或者git rebase –skip跳过此提交
- 3 执行git rebase –abort可以终止变基并返回变基前位置
因此,第二种方法更快:
| 1 | git rebase --onto B C D | 
融合过去若干次提交的变为一个
融合也可以使用git cherry-pick,不同的是不用checkout,而使用reset来操作,reset和checkout不同的地方在于它会更改HEAD指向
例子:假如有一下提交记录:A-B-C-D,其中,A,B,C,D都指代对应提交的tag,我们要将BC两个融合到一起
第一种方式(拣选):
| 1 | git reset --soft C//不对暂存和工作区做操作,仅变更HEAD,为C | 
第二种方式(变基):
第二种方式实际上仅仅是省略了可能的若干git cherry-pick,实际上步骤依然是三步走:
- git commit -C
- git rebase
- 重置master
具体步骤不再重复了。
git工作流&git-flow
更加详细的git-flow我就不献丑了,这里是中文翻译地址:传送门
这里仅仅介绍一下工作流程:
- develop作为常用分支,所有开发流程都在develop上进行操作
- git flow feature start MYFEATURE开始一项功能开发,- git flow feature finish MYFEATURE结束一项功能开发
- git flow release start MYFEATURE创建一个发型版本,finish用法同2结束版本
- git flow hotfix start VERSION [BASENAME]紧急修复,跳过release
这个过程中的分支变化:
- git flow feature start MYFEATURE
–新建分支develop/MYFEATURE
- git flow feature finish MYFEATURE
–mergedevelop/MYFEATURE到develop分支
- git flow release start MYFEATURE
 – 创建release/MYFEATURE分支
 – 从develop当前位置记录发型版本起点
- git flow release finish MYFEATURE
 –从develop当前位置记录发型版本结尾
 –归并到develop&master分支
 –删除release/MYFEATURE分支
- git flow hotfix start VERSION
–创建hotfix/VERSION分支
- git flow hotfix finish VERSION
 –merge hotfix/VERSION分支到master和develop
 –删除hotfix/VERSION
git和svn的合奏
不管怎么说,svn还是在更多的企业环境发挥着重要的作用,这种状况作为打工仔其实也无力去改变它。
但是这并不意味这不能拥抱git的魅力,因为,我们还有一个工具叫做git-svn
安装碎碎念
window平台安装时候要安装两个软件,一个是git,另一个往往就是乌龟svn了,这里安装乌龟svn时候要自定义一下安装选项,将command line选起来
mac平台的话, brew install git svn搞定一切
ubuntu平台的话, sudo apt-get install git git-svn subversion
git和svn的合并使用:
| 1 | #先检出svn库 | 
恩,这就是这段时间用到的全部了,收尾!