「前端面试100问」之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 规范,希望能对你的工作有些帮助

如果你感觉我写的还不错,可以关注我的公众号:『我是前端喵』,更多精彩文章等你解锁❤️❤️❤️

参考资料

Commit message 和 Change log 编写指南

git 常用命令

Git 教程

Git 分支-分支简介

https://juejin.im/post/5edf92f1f265da77045d5976

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论