(Git 钩子)自定义你的工作流 和引用日志
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 钩子)自定义你的工作流 和引用日志的更多相关文章
- Git钩子:自定义你的工作流
Git钩子是在Git仓库中特定事件发生时自动运行的脚本.它可以让你自定义Git内部的行为,在开发周期中的关键点触发自定义的行为. Git钩子最常见的使用场景包括推行提交规范,根据仓库状态改变项目环境, ...
- Git 钩子
1. 概念概述 1.1. 安装钩子 1.2. 脚本语言 1.3. 钩子的作用域 2. 本地钩子 2.1. 预提交钩子 Pre-Commit 2.2. 准备提交信息钩子 Prepare Commit M ...
- 利用Git钩子实现代码发布
目录 1.什么是git钩子 2.安装一个钩子 3.常用的钩子脚本类型 3.1 客户端钩子 3.1.1 pre-commit 3.1.2 prepare-commit-msg 3.1.3 commit- ...
- 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 ...
- Git钩子详解
钩子 Git钩子是在Git仓库中特定事件发生时自动运行的脚本.可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子.Client端钩子被operation ...
- Git储藏和引用日志
在日常工作中,当要经常停下手头的工作区修复临时的BUG,紧急处理来自同事或者经理的请求,但是又不能将手头的工作进行提交的时候.那么Git储藏功能(stash)就起到作用了. 储藏可以捕获我们的工作区状 ...
- 用 git 钩子,检测代码规范性(eslint、standard)
最终实现效果说明:用 git commit 提交代码之前,利用 pre-commit git 钩子,实现代码规范检测(eslint.standard 规范),符合规范之后才可以提交到 git 仓库.这 ...
- git 七图七模式 -- 工作流
git 是现在最流行的代码合作工作方式,本文通过七张图来描述一下当下最流行的 git 工作模式 集中式工作流 集中式工作流 功能分支工作流 Gitflow工作流 Forking 工作流 Pull Re ...
- Git钩子设置自动构建Jenkins
打开Git仓库,找到对应的项目,点击“仓库设置”,左侧点击“管理Git钩子”,如下图所示: 因为是push之后触发自动构建的,选择“post-receive”进行编辑 #!/bin/bash #提取分 ...
随机推荐
- 【Docker 命令】- create命令
docker create :创建一个新的容器但不启动它 语法 docker create [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS同run命令 实例 使用 ...
- delphi 窗体的创建和释放
Delphi中的窗体分为模式窗体和无模式窗体.二者的区别在于,用户可以在无模式窗体和其他窗体之间切换.这样,用户就可以同时工作于一个应用程序的几个部分.Delphi中窗体的初始化有两种情况,动态创建, ...
- hdu 2108 Shape of HDU (数学)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)
Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- Python:树的遍历
各种遍历顺序如下图所示: 树的最大深度 # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = ...
- python-输出颜色显示
显示颜色格式:\033[显示方式;字体色;背景色m...主题内容hello world...\033[0m \033 从这里开始标颜色................................. ...
- Linux查看PCIe版本及速率
Linux查看PCIe版本及速率 PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格 查看主板上的PCI插槽 # dmidecode | grep --color "PCI&q ...
- CentOS7 防火墙配置firewall-cmd
firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具. firewall-cmd 是 ...
- BZOJ5335:[TJOI2018]智力竞赛——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...
- Linux安装cx_Oracle
安装依赖包 yum -y install gcc python-devel 确认以下变量都已经设置好了 export ORACLE_HOME=/home/oracle/app/oracle/produ ...