前端面试~Git常用命令以及Commit Message编写指南

关于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

<type> (<scope>): <subject>
// 空行
<body>
// 空行
<footer>
复制代码

其中, Header 是必需的, BodyFooter可以省略。

注意:任何一布行都不得超过 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,资源给大家拉满,不见不散哦!


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335