《Pro Git》学习笔记

因为一个项目的git仓库部署在服务器上,没有图形化页面操作。近期遇到经常得使用git命令,以及git hooks的知识,于是阅读了Pro Git复习并拓展了下。

Git基础

diff

● git diff 查看未暂存的改动
● git diff --staged/cached 查看暂存区与最后一次提交对比

commit

● git commit -a -m “123” -a跳过add
● git commit --amend 补充commit提交

push

● git push origin 推送标签
● git push origin --tags 推送多个标签
● git push origin --delete 删除远程仓库标签
● git push origin b:a 将远程仓库的a分支改名为b

log

● git log - n 查看行数
● git log - p 查看差异 patch补丁详情
● git log --stat 查看简略统计信息
● git log --oneline 简写id和commit

tag

● git tag 查看全部
● git tag -l “v1.8.5*” 查找
● git tag -a v1.4 -m “my version 1.4” 附注标签
● git tag v1.4-lw 轻量标签
● git show v1.4 查看标签信息
● git tag -a v1.2 9fceb02 后期对commit补标签
● git push origin 推送标签
● git push origin --tags 推送多个标签
● git tag -d v1.4 删除本地标签
● git push origin --delete 删除远程仓库标签

log其他

● --author
● --grep
● -S 添加或删除了改字符串的提交
● --after 日期之后
● --before 日期之前
● --no-merges 不显示合并提交

Git分支

分支合并

● git branch 查看/创建分支
● git checkout 切换分支
● git checkout -b 创建分支并切换
● git merge hotfix 合并分支
● git branch -d hotfix 删除分支
● git branch -D 强制删除
● git push origin --delete serverfix

分支管理

● git branch 查看分支列表
● git branch -v 查看每个分支最后一次提交
● git branch --merged 查看已合并到当前分支的分支
● git branch --no-merged 查看未合并的分支
● git branch --merged main 指明main分支而不是当前分支
● git branch -vv 查看分支的领先和落后
● git push origin b:a 将远程仓库的a分支改名为b

Git hooks

一、Git Hooks的工作流程

Git Hooks的工作流程相当直观。当你执行一个Git命令(如git commit或git push)时,Git会首先检查".git/hooks"目录下是否存在对应的hook脚本,如果存在,则会触发执行这个脚本。
这个脚本的执行结果会决定是否继续执行Git命令。如果脚本执行成功(返回状态码为0),则继续执行Git命令;如果脚本执行失败(返回状态码非0),则停止执行Git命令。
需要注意的是,这种行为只适用于部分hooks,如pre-commit、pre-receive等。对于其他的一些hooks,如post-commit、post-receive等,即使hook脚本执行失败,也不会影响Git命令的执行。

二、Git Hooks的触发时机

Git Hooks的触发时机取决于它的类型。每种类型的hook都与一个特定的Git事件相关联。下面是一些常见的Git Hooks类型和对应的触发时机:

pre-commit:在执行"git commit"命令并生成提交对象之前被触发。
post-commit:在提交成功后被触发。
pre-push:在"git push"命令发送数据到远程仓库之前被触发。
post-receive:在远程仓库接收并处理完数据后被触发。

三、Git Hooks的种类

客户端钩子
githook 调用时机 说明
pre-commit 在执行git commit命令但在生成提交对象之前被触发。常用来检查即将提交的快照,比如运行lint工具检查代码格式 如果脚本以非零状态退出,Git会中断提交。
prepare-commit-msg prepare-commit-msg钩子在提交信息编辑器显示之前,提交对象创建完毕之后被触发。常用于给提交信息编辑器提供默认的提交信息,如修复bug时引用bug号等。
commit-msg commit-msg钩子在提交信息编辑器关闭后、提交对象生成之前被触发。常用于检查提交信息是否符合格式要求 如果脚本以非零状态退出,Git将中断提交。
post-commit post-commit钩子在整个提交过程完成后被触发,常用于通知其他工具提交已经完成。 此钩子不能影响提交过程的结果。
pre-rebase pre-rebase钩子在git rebase命令执行前被触发,常用于阻止对已经推送的提交进行rebase操作。 如果脚本以非零状态退出,Git将中断rebase。
post-checkout post-checkout钩子在git checkoutgit switch成功运行后被触发,常用于提醒用户工作目录已经改变。
post-merge post-merge钩子在git merge成功运行后被触发,常用于通知用户有文件被合并。
pre-push pre-push钩子在git push命令发送数据到远程仓库之前被触发,常用于确保不会推送错误的提交到远程仓库。 如果脚本以非零状态退出,Git将中断push。
服务器端钩子
githook 调用时机 说明
1. pre-receive pre-receive钩子在远程仓库接收到git push数据并开始更新处理之前被触发,常用于实现权限控制和引用(branch、tag等)的规则检查。
2. update update钩子在远程仓库接收到git push数据,每个引用更新前被触发。与pre-receive类似,常用于实现权限控制和引用的规则检查。
3. post-receive post-receive钩子在远程仓库接收到git push数据并完成所有更新后被触发,常用于触发持续集成、部署等后续任务,或者向外部系统发送有关新提交的通知。

四、如何配置Git Hooks

当你初始化一个新的Git仓库时,Git会在.git目录下创建一个名为hooks的子目录。这个hooks目录包含了一些示例钩子,它们是以.hook作为后缀的脚本文件。当你想要启用某个钩子时,只需要去掉对应脚本文件后缀名中的.sample,然后添加你的代码,再赋予脚本文件可执行权限即可。

例如,如果你想要创建一个pre-commit钩子,你可以在.git/hooks目录下创建一个名为pre-commit的脚本文件,并添加如下代码:

bash复制代码#!/bin/sh
echo "这是一个pre-commit钩子"

然后,你需要使用chmod命令赋予脚本文件可执行权限:

bash
复制代码chmod +x .git/hooks/pre-commit

此后,每次执行git commit命令时,你的pre-commit钩子都会被触发。

你可能感兴趣的:(git,笔记)