背景
早之前在使用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库 |
恩,这就是这段时间用到的全部了,收尾!