【Git 学习笔记】第五章 在 Git 仓库存入附加信息(上)

news/2024/8/27 11:55:42/ 标签: git, 学习, 笔记

第五章 在 Git 仓库存入附加信息

相关主题

  • 添加第一条 Git 笔记
  • 按类别区分 Git 笔记
  • 从远程库读取 Git 笔记
  • 推送 Git 笔记到远程库
  • commit 版本添加标签

Git 最强大的一个特性,在于它的提交历史 永不可改变。这意味着任何试图篡改仓库历史的行为,对于其他克隆该仓库的人来说 都是可见的。这一特性也给开发者带来些许困扰,尤其是需要在已经发布的提交记录中修改版本注释信息的时候。正是由于 git 历史的不可变更性,git 笔记notes)才应运而生。本质上,git 笔记refs/notes/commits 引用的附加版。笔记内容既可以在执行 git log 命令时,随提交信息一同展示出来,也可以发布到远程仓库供其他人获取笔记

5.1. 添加第一条 Git 笔记

本节将在已发布的版本中添加附加信息。如果直接修改目标版本,则 commit 的哈希值也会变动。以 jgit 库为例,先演示直接修改历史版本的效果,再给出使用 git 笔记的演示方案。

# Clone repo
$ git clone https://git.eclipse.org/r/jgit/jgit chapter5
$ cd chapter5 
# Checkout a new branch based on stable-3.2
$ git checkout -b notesMessage  --track origin/stable-3.2
# Check HEAD hash: f839d383e6fbbda26729db7fd57fc917fa47db44
$ git log -1 
# Edit commit message, add 'Update MANIFEST files'
$ git commit --amend
# Check HEAD hash: f942f7b58238b5aaac566038a7d67e0cb6a02fe1
# commit hash diverged
$ git log -1 
# See the change via status
$ git status
# via gitk
$ gitk origin/stable-3.2 HEAD

结果如下:(版本结构已发生变化)

在这里插入图片描述

这时使用 git notes 就可避免:

# Resume
$ git reset --hard origin/stable-3.2
# Add a git note
$ git notes add -m 'Update MANIFEST files'
# Check git log (f839d383e6fbbda26729db7fd57fc917fa47db44)
$ git log -1
commit f839d383e6fbbda26729db7fd57fc917fa47db44 (HEAD -> notesMessage, origin/stable-3.2)
Author: Matthias Sohn <matthias.sohn@sap.com>
Date:   Wed Dec 18 21:16:13 2013 +0100Prepare post 3.2.0 buildsChange-Id: Ie2bfdee0c492e3d61d92acb04c5bef641f5f132fSigned-off-by: Matthias Sohn <matthias.sohn@sap.com>Notes:Update MANIFEST files
# Check status (not diverged)
$ git status
# (No changes)

虽然 git notes 没有在原记录上直接修改(像 --amend 那样),但也实现了对历史提交信息进行增补,且不影响原有的树形版本结构。

拓展

除了通过 git notes add 新增一个 git 笔记,还可以强制替换(-f)、追加(append)、编辑(editgit 笔记

# force to add notes (replace the old one)
$ git notes add -f -m "Update MANIFESTS files for next version"
# append content to a note
$ git notes append -m "Verified by John Doe"
# Show in the log via --notes
$ git log --oneline --notes
f839d383e (HEAD -> notesMessage, origin/stable-3.2) Prepare post 3.2.0 builds
Notes:Update MANIFESTS files for next versionerified by John Doe# Edit a note (this would replace the old note with 'John Doe')
$ git notes edit -m 'John Doe'
The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.
Please use 'git notes add -f -m/-F/-c/-C' instead.
# git notes edit without any arguments would be the same as git notes add
$ git log --oneline --notes -1
f839d383e (HEAD -> notesMessage, origin/stable-3.2) Prepare post 3.2.0 builds
Notes:John Doe

更多子命令,详见 git help notes

小结

  1. git notes edit -m 的用法已被淘汰,Git 推荐使用 git notes add 来替换 git notes edit
  2. 决定 commit 哈希值的三个因素:
    1. 版本内容(the content in the commit)
    2. 父级版本(the parents of the commit)
    3. 提交信息(the commit message)

5.2 按类别区分 Git 笔记

正如上一节提到的,git 笔记本质上是一个命名空间为 refs/notes/ 的引用,默认展示在 git log 中的是 refs/notes/commits 引用。此外还可以自定义笔记类别,如 featureImplementeddefectalsoCherryPick 等等,以便对笔记统一归类管理。

本例的演示场景:假设在项目中修正了一个缺陷(defect),产生了一个 commit 版本,同时还对受该缺陷影响的其他版本做了同步修复。示例将新建一个 git 笔记类型 refs/notes/alsoCherryPick,用来说明当前版本如果要被 cherry-pick 到其他分支,那么应该同时将 alsoCherryPick 中提到的相关 commit 版本一并带上,因为它们都是对同一缺陷的修复。

# Checkout new branch
$ git checkout -b notesReferences --track origin/stable-3.1
# List commits for use
$ git log -10 --oneline
da6e87bc3 (HEAD -> notesReferences, origin/stable-3.1) Prepare post 3.1.0 builds
16ca725b3 (tag: v3.1.0.201310021548-r) JGit v3.1.0.201310021548-r
c6aba9966 Fix order of commits in rebase todo file header
5a2a2222e Prepare post 3.1.0 RC1 builds
6f0681eb9 (tag: v3.1.0.201309270735-rc1) JGit v3.1.0.201309270735-rc1
a065a06c2 Attempt to fix graph layout when new heads are introduced
b4f07df35 Prepare re-signing pgm's ueberjar to avoid SecurityException
aa4bbc67b Use full branch name when getting ref in BranchTrackingStatus
570bba5e7 Ignore bitmap indexes that do not match the pack checksum
801aac579 Merge branch 'stable-3.0'# Add notes for current HEAD
$ git notes add -m "test note"
# Select a commit (570bba5) categoried as alsoCherrypick
$ git notes --ref alsoCherryPick add -m "570bba5" b4f07df
# Check in the log view with --notes
$ git log -1 b4f07df --notes=alsoCherryPick
# config the alsoCherryPick notes' reference by default
$ git config notes.displayRef "refs/notes/alsoCherryPick"
# config to show all notes with all categories
$ git config notes.displayRef 'refs/notes/*'
# Test to add a new note with category of 'defect'
$ git notes --ref defect add -m "Bug:24435" b4f07df
# Check to see whether or not defect content is displayed
$ git log -1 b4f07df --oneline --notes
b4f07df35 Prepare re-signing pgm's ueberjar to avoid SecurityException
Notes:test note1Notes (alsoCherrypick):570bba5Notes (defect):Bug:24435

小结

  1. 添加 git notes 默认归类到 refs/notes/commits,可随 git log 一并展示;
  2. 如果使用 git log --oneline,则显示对应的 git notes 需要带 --notes 标记;
  3. git log 显示自定义类型的 notes,有两种方式:
    1. git log 后加 --notes=<categoryName>
    2. 修改 git 配置项:git config notes.displayRef 'refs/notes/<catName>'git config notes.displayRef 'refs/notes/*'

拓展

签出分支时,联想到 git 笔记引用与其他远程跟踪分支引用的相似性,可以在本地直接签出 refs/notes 分支:

$ git checkout -b myNotes notes/alsoCherryPick
Switched to a new branch 'myNotes'
$ ls
b4f07df357fccdff891df2a4fa5c5bd9e83b4a4a
$ cat b4f07df357fccdff891df2a4fa5c5bd9e83b4a4a
570bba5

可见,将 notes 引用作远程跟踪分支时,该分支下的文件,其文件名为指定类别的 notes 所指向的目标 commit 的哈希值,文件内容为 git 笔记内容。

值得一提的是,经实测,签出某个 notes 引用后,对应的分支并不会自动更新该引用下的文件列表(当有多个同一类别的 note 时,该目录就有相同数量的文件),只能删除分支后重新签出。


http://www.ppmy.cn/news/1475911.html

相关文章

排序-java(详解)

一&#xff0c;分类 主要的排序大致分为以下几类&#xff1a; 1&#xff0c;插入排序&#xff0c;又分为直接插入排序和希尔排序 2&#xff0c;选择排序&#xff0c;又分为选择排序和堆排序 3&#xff0c;交换排序&#xff0c;又分为冒泡排序和快速排序 4&#xff0c;归并…

论文翻译:通过云计算对联网多智能体系统进行预测控制

通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景&#xff0c;当内网有一台服务器server1&#xff0c;假如一个用户在外网&#xff0c;从外网访问内网怎么访问呢&#xff0c;无法访问&#xff0c;这是因为外网没办法直接访问内网&#xff0c;这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

Html_Css问答集(8)

52、在网页设计中有一个目录assets一般表示什么意思 "Assets" 的英文原意是 资产。 在网页设计中&#xff0c;我们使用 "assets" 文件夹来存放网站的静态资源文件&#xff0c;就像把这些资源看作是网站的“资产”一样。 assets 文件夹中的静态资源…

使用Spring Boot实现分布式配置管理

使用Spring Boot实现分布式配置管理 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 什么是分布式配置管理&#xff1f; 在分布式系统中&#xff0c;配置管理是一项重要的任务。它涉及到管理和集…

N叉树的前序遍历

Problem: 589. N 叉树的前序遍历 文章目录 思路解题过程Code 思路 前序遍历&#xff0c;遇到空节点返回 解题过程 对每个节点进行遍历 Code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val _val;}Nod…

Nature Pixels V2 | Top-down pixel art asset pack

Nature Pixels V2可以用于自上而下的视图游戏&#xff0c;使其看起来更好&#xff01; 如果你喜欢这个资产包&#xff0c;一定要在评论中告诉我&#xff01;祝你今天过得愉快 所容纳之物 16x16瓷砖&#xff0c;可以帮助你用100多块瓷砖构建自己的美丽世界 房屋 岩石 树 墙壁 水…

Java(二十)---双向链表

文章目录 前言1.为什么学习双向链表2.双向链表(LinkedList)的模拟实现2.1. 准备工作2.2.功能的实现2.2.1.显示链表(display) 和 是否包含某种元素(contains) 以及 获取链表节点个数(size())2.2.2.头插法(addFirst)&#xff0c;尾插法(addLast)&#xff0c;以及在指定位置进行插…

RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决

修改后的/usr/bin/usbdevice: #!/bin/sh # # Usage: # usbdevice [start|update|stop] # # Hookable stages: # usb_<pre|post>_<init|prepare|start|stop|restart>_hook # <usb function>_<pre|post>_<prepare|start|stop>_hook # # Example …

第三方配件也能适配苹果了,iOS 18与iPadOS 18将支持快速配对

苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的发布&#xff0c;苹果再次证明了其在移动操作系统领域的领先地位。 最新系统版本中的一项引人注目的功能&#xff0c;便是对蓝牙和Wi-Fi配件的配对方式进行了重大改进&#xff0c;不仅…

【LabVIEW学习篇 - 6】:数组、簇

文章目录 数组创建数组数组函数数组大小 根据索引取值数组与for循环 案例一案例二 簇LabVIEW簇的特点和用途&#xff1a;创建簇解除捆绑按名称解除捆绑簇的捆绑重新排序簇中控件 数组 在LabVIEW中&#xff0c;数组是一种用于存储相同数据类型的多个元素的数据结构。以下是关于…

技术探索之kotlin浅谈

Kotlin是一种静态类型编程语言&#xff0c;它运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;可以与Java代码互操作。Kotlin由JetBrains开发&#xff0c;是一种现代、简洁且安全的编程语言。它在2011年首次亮相&#xff0c;2017年被谷歌宣布为Android官方开发语言。…

作业7.16

第一题&#xff1a; 在终端的界面上输出:__-__-__-__ 1秒过后&#xff0c; 变成 1_-__-__-__ 再1秒过后&#xff0c;变成 12-__-__-__ 依此类推 经过8秒&#xff0c;最终变成 12-34-56-78 \b 是printf里面&#xff0c;光标向左移动的转义符 #include <stdio.h> #include …

视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机,包括T80004系列高清HDMI编码器、4K超高清HDMI编码器

视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机&#xff0c;包括T80004系列高清HDMI编码器、4K超高清HDMI编码器。 视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机(不带屏)&#xff0c;包括T80004系列高清HDMI编码器、4K超高清HDMI编码…

hid.dll丢失怎么办?hid.dll丢失解决步骤分享

hid.dll&#xff0c;即Human Interface Device Dynamic Link Library&#xff0c;是Windows操作系统中用于管理人机交互设备&#xff08;HID&#xff09;的核心组件。这些设备包括但不限于键盘、鼠标、游戏控制器等。该DLL文件确保这些设备能够与操作系统顺畅通信&#xff0c;实…

ECCV`24 | 编辑能力无上限!北航谷歌旷视等开源Chat-Edit-3D: 3D 场景编辑新范式!

文章链接&#xff1a;https://arxiv.org/abs/2407.06842 项目地址&#xff1a;https://sk-fun.fun/CE3D/ 代码&#xff1a;https://github.com/Fangkang515/CE3D/tree/main 引言 过去的3D场景编辑方法往往局限于固定的文本输入模式和有限的编辑能力。用户需要学习特定的命令或…

前端打包部署后源码安全问题总结

随着现代Web应用越来越依赖于客户端技术&#xff0c;前端安全问题也随之突显。源码泄露是一个严重的安全问题&#xff0c;它不仅暴露了应用的内部逻辑和业务关键信息&#xff0c;还可能导致更广泛的安全风险。本文将详细介绍源码泄露的潜在风险&#xff0c;并提供一系列策略和工…

C语言经典程序100案例

C语言经典程序100题(完整版) 【程序1】题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数都是多少 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 #include "stdio…

linux 安装 RocketMQ 4.7

安装介绍 Centos 7RocketMQ 4.7JDK 1.8 (安装JDK参考)RocketMQ的官网地址&#xff1a; http://rocketmq.apache.orgGithub地址是 https://github.com/apach e/rocketmq 安装操作 下载RocketMQ RocketMQ运行版本下载地址&#xff1a; Rocketmq-all-4.7.1-bin-release.zip …

【前端】零基础学会编写CSS

一、什么是CSS CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种是一种用来为结构化文档&#xff08;如 HTML 文档&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;能够对网页中元素位置的排版进行像素级别的精…