关于git的使用在前端面试中是很常见的题目,在实际工作中也经常会用git进行版本管理,也许你了解git的相关命令和使用流程,git init
, git add
, git commit
,git push
,一通操作猛如虎,然而实际工作中,我们会遇到各种意外情况,比如当发生冲突的时候,或者需要暂时停止添加当前进行中的新feature开发,去修复一个 bug
,怎么保证既不影响当前工作,又能够顺利完成临时加派的任务呢?
实际上, git
是很强大的版本管理工具,有必要了解实际开发流程中需要用到的各种命令以及相应参数的设置,这样才能保证开发过程有条不紊,本文就对git
常用命令进行了梳理,帮助大家理解 git
原理。
一、Git 原理
1.1 工作区、暂存区和版本库
结合上图,首先理解下 Git 工作区、暂存区和版本库概念:
工作区:就是电脑中看到的目录
暂存区(stage/index):是一个存放在".git"目录下的 index 文件(.git/index),暂存区有时候也叫作索引(index)
版本库:是指工作区下的一个目录,是隐藏的,这个不算工作区,而是 Git 的版本库
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects"目录下,里面包含了创建的各种对象及内容:
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树
1.2 Git 分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
Git 的分支模型称为她的“必杀技特性”,正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。Git 处理分支的方式是难以置信的轻量,创建分支以及在不同分支之间切换几乎能在瞬间完成。与许多其他版本控制系统不同,Git鼓励在工作流程中频繁地使用分支与合并,正是因为分支功能,Git 才会如此强大而又独特。
理解 Git 分支,需要理解 orgin/master, master, origin的区别:
origin: 远程服务器
origin/master: 远程分支
master: 本地分支
执行 git clone
命令之后,远程服务器会被自动命名为 origin
, 并且该命令会创建一个指向 master
分支的指针,该分支命名为origin/master
,同时会创建一个名为 master
的本地分支,并且和远程分支在同一个提交节点。
注意: 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
这个命令完成了什么呢:
1.分支 dev
被设定为追踪服务器 origin
上的远程分支dev
2.切换到 dev
分支上
除了分支操作,还有其它很多常用的git
命令,一起看下吧
二、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
参数说明:
三、Commit Message规范
git commit
命令要求编写 commit message
,不然无法提交,关于 commit message
的编写,我们往往容易忽略规范,整体来讲, commit message
应该清晰简洁,能够提现本次提交目的。
关于 commit message
的编写规范,社区有很多种,Angular规范
是目前使用最广的写法,本文就简单介绍一下。
commit message
的构成包括三部分: Header, Body 和 Footer
():
// 空行
// 空行
其中, Header
是必需的, Body
和Footer
可以省略。
注意:任何一布行都不得超过 72(或100) 个字符,避免自动换行影响美观
3.1 Header
Header
占一行,包括三个字段: type, scope, subject
(1) type
type
用于说明 commit
类别,只允许以下 7 个标识:
feat: 新功能 (feature)
fix: 修补 bug
docs: 文档 (documentation)
style: 格式 (比如去除空行)
refactor: 重构 (不是新增功能,也不是修补bug)
test: 增加测试
chore: 构建过程或辅助工具的变动
(2) scope
scope
用于说明 commit
影响的范围,比如数据层、控制层、视图层等等(很少用到)
(3) subject
描述本次提交的目的,不超过 50 个字符
以动词开头,使用第一人称现在时,比如change,而不是 changed 或 changes
第一个字母小写
结尾不加句号
3.2 Body
Body
部分是对本次 commit
的详细描述,可以分为多行描述,要求使用第一人称现在时,说明代码变动原因以及前后行为对比。
3.3 Footer
Footer
只适用于两种情况:
(1) 不兼容变动
当前代码与上一个版本不兼容,则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.
复制代码
(2) 关闭Issue
如果当前 commit
针对某个issue
,那么可以在Footer
部分关闭这个 issue
Closes #123, #234, #345
复制代码
写在最后:
本文介绍了 Git
的工作原理、常用命令以及 commit message
规范,希望能对你的工作有些帮助
下面这个是一些大企业的大佬整理出来的,认真地和他们学习了很多经验以及获取了很多直观的资料,现在全部拿出来奉献给大家!想系统学习前端web的朋友,我都整理在文件中了,可以这边的交流裙前面114中间6649后面671,资源给大家拉满,不见不散哦!