「前端面试100问」之Git经常使用命令以及Commit Message编写指南

关于git的使用在前端面试中是很常见的题目,在实际工做中也常常会用git进行版本管理,也许你了解git的相关命令和使用流程, git init, git add, git commit, git push,一通操做猛如虎,然而实际工做中,咱们会遇到各类意外状况,好比当发生冲突的时候,或者须要暂时中止添加当前进行中的新feature开发,去修复一个 bug,怎么保证既不影响当前工做,又可以顺利完成临时加派的任务呢?

实际上,git是很强大的版本管理工具,有必要了解实际开发流程中须要用到的各类命令以及相应参数的设置,这样才能保证开发过程有条不紊,本文就对git经常使用命令进行了梳理,帮助你们理解git原理。html

1、Git 原理

1.1 工做区、暂存区和版本库前端

结合上图,首先理解下 Git 工做区、暂存区和版本库概念:git

  • 工做区:就是电脑中看到的目录
  • 暂存区(stage/index):是一个存放在".git"目录下的 index 文件(.git/index),暂存区有时候也叫做索引(index)
  • 版本库:是指工做区下的一个目录,是隐藏的,这个不算工做区,而是 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的区别:测试

  • origin: 远程服务器
  • origin/master: 远程分支
  • master: 本地分支

执行 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 这个命令完成了什么呢:

  1. 分支 dev 被设定为追踪服务器 origin 上的远程分支 dev
  2. 切换到 dev 分支上

除了分支操做,还有其它不少经常使用的 git 命令,一块儿看下吧

2、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 参数说明:

3、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 规范,但愿能对你的工做有些帮助

若是你感受我写的还不错,能够关注个人公众号:『我是前端喵』,更多精彩文章等你解锁❤️❤️❤️

参考资料

Commit message 和 Change log 编写指南

git 经常使用命令

Git 教程

Git 分支-分支简介

相关文章
相关标签/搜索