Git 钩子是在 Git 仓库中特定事件发生时自动运行的脚本。它可以让你自定义 Git 内部的行为,在开发周期中的关键点触发自定义的行为。

Git 钩子最常见的使用场景包括推行提交规范,根据仓库状态改变项目环境,和接入持续集成工作流。但是,因为脚本可以完全定制,你可以用 Git 钩子来自动化或者优化你开发工作流中任意部分。

Git 钩子是仓库中特定事件发生时 Git 自动运行的普通脚本.钩子在本地或服务端仓库都可以部署,且只会在仓库中事件发生时被执行.

安装钩子

钩子存在于每个 Git 仓库的 .git/hooks 目录中。当你初始化仓库时,Git 自动生成这个目录和一些示例脚本.

但是 .sample 拓展名防止它们默认被执行。为了安装一个钩子,你只需要去掉 .sample 拓展名。或者你要写一个新的脚本.

本地钩子

所有带 pre- 的钩子允许你修改即将发生的操作,而带 post- 的钩子只能用于通知.

pre-commit

pre-commit 脚本在每次你运行 git commit 命令时,Git 向你询问提交信息或者生产提交对象时被执行。你可以用这个钩子来检查即将被提交的代码快照。比如说,你可以运行一些自动化测试,保证这个提交不会破坏现有的功能。

>/dev/null 2>&1 这部分屏蔽了 任何输出。

服务端钩子

这些钩子都允许你对 git push 的不同阶段做出响应

pre-receive

pre-receive 钩子在有人用 git push 向仓库推送代码时被执行。它只存在于远端仓库中,而不是原来的仓库中。如果你不喜欢推送的那个人,提交信息的格式,或者提交的更改,你都可以拒绝这次提交.你可以用 pre-receive 防止这些代码流入官方的代码库.

update

update 钩子在 pre-receive 之后被调用,它可以分别被每个推送上来的引用分别调用。也就是说如果用户尝试推送到4个分支,update 会被执行 4 次.

post-receive

post-receive 钩子在成功推送后被调用,适合用于发送通知.

Git 提交引用和引用日志

特殊的引用

除了 refs 文件夹外,.git 根目录还有一些特殊的引用。如下所示:

  • HEAD – 当前所在的提交或分支。
  • FETCH_HEAD – 远程仓库中 fetch 到的最新一次提交。
  • ORIG_HEAD – HEAD 的备份引用,避免损坏。
  • MERGE_HEAD – 你通过 git merge 并入当前分支的引用(们)。
  • CHERRY_PICK_HEAD – 你 cherry pick 使用的引用。

相对引用

~ 符号让你访问父节点的提交

#显示 HEAD 祖父节点的提交
git show HEAD~2

~ 符号总是选择合并提交的第一个父节点。如果你想选择其他父节点,你需要用 ^ 符号来指定

#HEAD 是一个合并提交,下面这个命令返回 HEAD 的第二个父节点:
git show HEAD^2
# 只列出合并提交的第二个父节点的父节点
git log HEAD^2
# 移除当前分支最新的 3 个提交
git reset HEAD~3
# 交互式rebase当前分支最新的 3 个提交
git rebase -i HEAD~3

引用日志

它记录了你在仓库中做的所有更改,不管你有没有提交。你也可以认为这是你本地更改的完整历史记录

git reflog

HEAD{} 语法允许你引用保存在日志中的提交.

假设你意识到了你不应该丢掉你全部的工作。你只需要切换到 HEAD@{1} 这个提交就能回到你运行 git reset 之前仓库的状态

git checkout HEAD@{1}

这会让你处于 HEAD 分离的状态。你可以从这里开始,创建新的分支,继续你的工作。

总结

它的意义在于:在任何开发场景下,你都能找到你需要的特定提交。你很容易就可以把这些技巧用在你一有的 Git 知识中,因为很多常用的命令都接受引用作为参数,包括 git log、git show、git checkout、git reset、git revert、git rebase 等等

(Git 钩子)自定义你的工作流 和引用日志的更多相关文章

  1. Git钩子:自定义你的工作流

    Git钩子是在Git仓库中特定事件发生时自动运行的脚本.它可以让你自定义Git内部的行为,在开发周期中的关键点触发自定义的行为. Git钩子最常见的使用场景包括推行提交规范,根据仓库状态改变项目环境, ...

  2. Git 钩子

    1. 概念概述 1.1. 安装钩子 1.2. 脚本语言 1.3. 钩子的作用域 2. 本地钩子 2.1. 预提交钩子 Pre-Commit 2.2. 准备提交信息钩子 Prepare Commit M ...

  3. 利用Git钩子实现代码发布

    目录 1.什么是git钩子 2.安装一个钩子 3.常用的钩子脚本类型 3.1 客户端钩子 3.1.1 pre-commit 3.1.2 prepare-commit-msg 3.1.3 commit- ...

  4. Git提交引用和引用日志

    转载自:https://github.com/geeeeeeeeek/git-recipes/wiki/5.5-Git%E6%8F%90%E4%BA%A4%E5%BC%95%E7%94%A8%E5%9 ...

  5. Git钩子详解

    钩子 Git钩子是在Git仓库中特定事件发生时自动运行的脚本.可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子.Client端钩子被operation ...

  6. Git储藏和引用日志

    在日常工作中,当要经常停下手头的工作区修复临时的BUG,紧急处理来自同事或者经理的请求,但是又不能将手头的工作进行提交的时候.那么Git储藏功能(stash)就起到作用了. 储藏可以捕获我们的工作区状 ...

  7. 用 git 钩子,检测代码规范性(eslint、standard)

    最终实现效果说明:用 git commit 提交代码之前,利用 pre-commit git 钩子,实现代码规范检测(eslint.standard 规范),符合规范之后才可以提交到 git 仓库.这 ...

  8. git 七图七模式 -- 工作流

    git 是现在最流行的代码合作工作方式,本文通过七张图来描述一下当下最流行的 git 工作模式 集中式工作流 集中式工作流 功能分支工作流 Gitflow工作流 Forking 工作流 Pull Re ...

  9. Git钩子设置自动构建Jenkins

    打开Git仓库,找到对应的项目,点击“仓库设置”,左侧点击“管理Git钩子”,如下图所示: 因为是push之后触发自动构建的,选择“post-receive”进行编辑 #!/bin/bash #提取分 ...

随机推荐

  1. SQLite - Python

    SQLite - Python 安装 SQLite3 可使用 sqlite3 模块与 Python 进行集成.sqlite3 模块是由 Gerhard Haring 编写的.它提供了一个与 PEP 2 ...

  2. [OS] 操作系统错题集

    1. (判断) 答案:错 缓冲区有两块:高速缓存区(物理存在)和磁盘缓存区(逻辑存在,实际是内存一块),都不在外存(硬盘). 2. 操作系统的功能:处理机管理(进程管理).作业管理.存储管理.设备管理 ...

  3. 青花瓷运用->下载历史版本App

    1.软件准备 [必备]Charles4.0.1 下载密码: jfnk [不需要,配合Charles食用效果更佳]Paw2.3.1 下载密码: t3my 2.正式开始 2.1 打开Charles青花瓷 ...

  4. 分离IE9以下浏览器

    /*判断浏览器版本是否过低*/ function IETester(userAgent) { var UA = userAgent || navigator.userAgent; if (/msie/ ...

  5. python 中的queue 与多进程--待继续

    一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的“先吃先拉”与“后吃先吐”,其实就是这里说的队列,队列的构造的时候可以定义它 ...

  6. [HZOI2016]偏序&[HZOI2015]偏序II K维偏序问题

    description Cogs: [HZOI2016]偏序 [HZOI2015]偏序 II data range \[ n\le 5\times 10^4\] solution 嵌套\(CDQ\)的 ...

  7. [洛谷P4735]最大异或和

    题目大意:有一串初始长度为$n$的序列$a$,有两种操作: $A\;x:$在序列末尾加一个数$x$ $Q\;l\;r\;x:$找一个位置$p$,满足$l\leqslant p\leqslant r$, ...

  8. BZOJ1565:[NOI2009]植物大战僵尸——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1565 https://www.luogu.org/problemnew/show/P2805 Pla ...

  9. BZOJ1604 & 洛谷2906:[USACO2008 OPEN]Cow Neighborhoods 奶牛的邻居——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1604 https://www.luogu.org/problemnew/show/P2906#sub ...

  10. php写错命名空间 导致catch不到异常

    写的微信回调接口出错了, 由于手里的调试工具(包括微信官方的开发者接口调试工具)不能把HTTP错误的详情dump出来,只会显示空白,所以打算在程序里加上try catch 捕获错误直接输出.重新测试, ...