git init
,
git add
,
git commit
,
git push
,一通操做猛如虎,然而实际工做中,咱们会遇到各类意外状况,好比当发生冲突的时候,或者须要暂时中止添加当前进行中的新feature开发,去修复一个
bug
,怎么保证既不影响当前工做,又可以顺利完成临时加派的任务呢?
实际上,git
是很强大的版本管理工具,有必要了解实际开发流程中须要用到的各类命令以及相应参数的设置,这样才能保证开发过程有条不紊,本文就对git
经常使用命令进行了梳理,帮助你们理解git
原理。html
1.1 工做区、暂存区和版本库前端
结合上图,首先理解下 Git 工做区、暂存区和版本库概念:git
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects"目录下,里面包含了建立的各类对象及内容:面试
当对工做区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工做区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中segmentfault
当执行提交操做(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会作相应的更新。即 master 指向的目录树就是提交时暂存区的目录树bash
1.2 Git 分支管理服务器
Git 的分支模型称为她的“必杀技特性”,正由于这一特性,使得 Git 从众多版本控制系统中脱颖而出。Git 处理分支的方式是难以置信的轻量,建立分支以及在不一样分支之间切换几乎能在瞬间完成。与许多其余版本控制系统不一样,Git鼓励在工做流程中频繁地使用分支与合并,正是由于分支功能,Git 才会如此强大而又独特。工具
理解 Git 分支,须要理解 orgin/master, master, origin的区别:测试
执行 git clone
命令以后,远程服务器会被自动命名为 origin
, 而且该命令会建立一个指向 master
分支的指针,该分支命名为 origin/master
,同时会建立一个名为 master
的本地分支,而且和远程分支在同一个提交节点。ui
注意: origin并不特别,就像分支名master在git中没有任何特殊意义同样.当执行git init时,master会做为初始分支的默认名字,所以使得master分支名被普遍使用.而origin是执行git clone时的默认服务器名称,固然能够经过指令git clone -o cat,使得默认服务器名称为cat,而默认远程分支为cat/master.
master & origin&master
这个就很好理解了:master
是默认的本地分支,是远程分支 origin/master
在本地的拷贝
从远程分支checkout
一个本地分支,该本地分支被称为追踪分支(tracking branck)
,被追踪的分支被称为上游分支(upstream branch)
, 追踪分支和远程分支相关联,执行git pull
命令,git
会自动获取到须要 merge
的分支的服务器
经过 git checkout -b [branch] [remotename]/[branch]
命令能够建立新的追踪分支
若是已经有一个本地分支,如今想要关联远程分支,或者修改追踪的上游分支,可使用 -u
或者 --set-upstream-to
来实现:git branch -r origin/[your branch]
git
还提供了通用的 --track
操做: git checkout --track origin/dev
那么, git checkout --track origin/dev
这个命令完成了什么呢:
dev
被设定为追踪服务器 origin
上的远程分支 dev
dev
分支上除了分支操做,还有其它不少经常使用的 git
命令,一块儿看下吧
1.查看分支
git branch // 显示本地分支
git branch -r // 显示远程分支
git branch -a // 显示全部分支
复制代码
2.建立分支
git branch [branch name]
复制代码
3.切换分支
git checkout [branch name]
git checkout -b [branch name] // 若分支不存在,则建立分支,切换到新分支上
复制代码
4.删除分支
git branch -d [branch name] // 删除本地分支
git push origin --delete [branch name] // 删除远程分支
复制代码
5.合并分支
git merge [branch name]
复制代码
6.将这次更新合并到上次的 commit
记录中,不添加新的 commit
git commit --amend
复制代码
7.拉取远程分支
git pull
复制代码
8.推送到远程分支
git push -r origin [branch name]
复制代码
git push
复制代码
9.查看日志
git log // 列出全部更新
---------带参数---------
git log --pretty=oneline
git log --pretty=short
git log --pretty=full
git log --pretty=fuller
--------特定格式--------
git log --pretty=format:"%h - %an, %ar : %s"
复制代码
git log --pretty
参数说明:
git commit
命令要求编写commit message
,否则没法提交,关于commit message
的编写,咱们每每容易忽略规范,总体来说,commit message
应该清晰简洁,可以提现本次提交目的。
关于commit message
的编写规范,社区有不少种,Angular规范
是目前使用最广的写法,本文就简单介绍一下。
commit message
的构成包括三部分: Header, Body 和 Footer
<type> (<scope>): <subject>
// 空行
<body>
// 空行
<footer>
复制代码
其中,Header
是必需的,Body
和Footer
能够省略。
注意:任何一布行都不得超过 72(或100) 个字符,避免自动换行影响美观
3.1 Header
Header
占一行,包括三个字段:type, scope, subject
(1) type
type
用于说明 commit
类别,只容许如下 7 个标识:
(2) scope
scope
用于说明 commit
影响的范围,好比数据层、控制层、视图层等等(不多用到)
(3) subject
描述本次提交的目的,不超过 50 个字符
3.2 Body
Body
部分是对本次 commit
的详细描述,能够分为多行描述,要求使用第一人称如今时,说明代码变更缘由以及先后行为对比。
3.3 Footer
Footer
只适用于两种状况:
当前代码与上一个版本不兼容,则 Footer
部分以 BREAKING CHANGE
开头,后面是对变更的描述、变更理由和迁移方法
BREAKING CHANGE: isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
复制代码
Issue
若是当前 commit
针对某个 issue
,那么能够在 Footer
部分关闭这个 issue
Closes #123, #234, #345
复制代码
写在最后:
本文介绍了 Git
的工做原理、经常使用命令以及 commit message
规范,但愿能对你的工做有些帮助
若是你感受我写的还不错,能够关注个人公众号:『我是前端喵』,更多精彩文章等你解锁❤️❤️❤️
参考资料