最近全面整理下工作中遇到的git问题,了解了下git工作的原理。
常用操作
1 | # 查看增删改文件状态 |
提示up-to-date是最新的
文件生命周期
工作区(working tree,未add的,untracked)=>暂存区(已add的,tracked,staged)=>index(staging area)(commit未push的,staged)=>远端仓库(repository)
HEAD,origin,remote这些概念后面再说
配置
1 | # 列出所有config |
生成私钥,添加在setting里
有时候提交时一直要求输入密码,我们需要在git clone时选择ssh的方式,这样就免去了每次提交输密码
1 | # 查看私钥 |
新建repository
1 | cd d/workspace |
commit
git command -h查看命令
1 | # 提交的主要有:新增,修改,删除 |
回退
1 | # 回退前都先查看log |
Branch
1 | # 查看所有分支(包括远端和本地) |
关于删除远端分支注意:
删除远端分支后另一个用户
并不能获取到分支被删除了,git branch -r
也依然能获取到被删除的分支
这说明,remotes/origin/* 这些远程跟踪分支,仅仅是远程分支的一个缓存,并且,不能通过git fetch 命令获取到分支删除的更新
可以通过git remote show origin
来查看,会列出所有分支状态
1 | branchA tracked |
被删除的分支refs/remotes/origin/deletedBranch
状态是stale
(陈旧的)
后面有提示
1 | git remote prune origin |
Stash
1 | # 暂存 |
checkout
1 | # 在本地新建一个分支test并切换到此分支 |
merge
1 | git checkout dev |
Reflog和log
1 | # 只列出commit的log |
git的HEAD是当前活跃分支游标
使用小乌龟的log来查看历史
1 | # fetch和pull的区别,fetch不会自动merge更安全点 |
- sourceTree请使用英文版的,不然太难用啦!!
gitlab中的权限管理
只有owner在setting里可以邀请member,给member设置master的权限,否则是protected状态
gitlab网站上发出merge request
svn和git的区别
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
基于 Git Flow 的开发流程
Git Flow 分支模型
- master 分支 => 正式环境(最为稳定功能最为完整)
- test 分支(release分支) => 测试环境(发布定期要上线的功能)
- dev 分支 => 团队协作的发开环境(功能最新最全的分支)
- hotfix 分支 => 修复线上代码的 bug
- feature分支 => 某个功能点正在开发阶段
开发阶段
开发 on your branch
gitlab上发起merge request
code review,accept merge request,delete branch
测试阶段
- 完成新功能后,dev 分支提交到 test 分支(release分支),进行测试
- 有bug:创建hotfix 分支(修复后合并到 test 分支)
发布上线
- release 分支合并进 master 和 develop
- 上线
- 线上环境小 bug:创建 hotfix 分支进行修改,大bug:版本回滚
分支命名
参考:
- feature——按照功能点(而不是需求)命名;
- test(release)——用发布时间命名,可以加上适当的前缀;
- hotfix——GitLab 的 issue 编号或 bug 性质等。
Commit Message格式
star多的项目都有完善的文档体系和高覆盖的测试用例
type
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style: 格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
Scope
用来说明本次Commit影响的范围,即简要说明修改会涉及的部分。这个本来是选填项,但从AngularJS实际项目中可以看出基本上也成了必填项了。
用来简要描述本次改动,概述就好了,因为后面还会在Body里给出具体信息。并且最好遵循下面三条:
Subject
以动词开头,使用第一人称现在时,比如change,而不是changed或changes
首字母不要大写
结尾不用句号(.)
Body
<body>里的内容是对上面subject里内容的展开,在此做更加详尽的描述,内容里应该包含修改动机和修改前后的对比。
Revert
此外如果需要撤销之前的Commit,那么本次Commit Message中必须以revert:开头,后面紧跟前面描述的Header部分,格式不变。并且,Body部分的格式也是固定的,必须要记录撤销前Commit的SHA值。
git pull = git fetch +git merge
在git merge时会自动生成个merge的时间节点在commit记录里
rebase和merge
两者都是用来合并分支,细节处理上有些不一样
git hook自动部署
ssh git@gitlab.com -T
git迁移
1 | git checkout master |
TODO概念解析
一些blob,tree,commit对象的内部概念
.git文件夹下的内容
git merge origin/other_branch时有时会自动merge
可以故意commit一个有冲突的再merge就可以显示merge的全部内容了
WIP:在进行中,避免被merge
git rebase
git cherry-pick
HEAD
可以看到.git/HEAD
中内容
当在master分支时,内容为ref: refs/heads/master
当在master分支时,内容为ref: refs/heads/master