构造干净的 Git 历史线索

从Git泄露到权限夺取:利用git diff挖掘历史敏感信息实战 版本控制系统是现代软件开发的基石,它通过记录代码的每一次变更,实现了团队协作与版本回溯。其核心原理在于将文件内容、目录结构和提交信息以对象形式存储,构建出完整的项目历史图谱。这一机制在提升开发效率的同时,也带来了潜在的安全风险,即信息泄露。当.git目录因部署疏忽而暴露于公网时,其存储的所有历史对象便成为攻击者的目标。攻击者可以利用版本控制命令,深入分析提交历史,精准定位被删除或修改的敏感数据,例如数据库凭证、API密钥或硬编码的认证令牌,从而在渗透测试或CTF比赛中实现从信息泄露到权限提升的突破。本文将以 阅读详情

构造干净的 Git 历史线索

用 Git 也有一段时间了,看过一些 Git 工作流的文章,加上工作和业余中参与一些项目开发,对 Git 的工作流有一些心得,写下来整理一下。

如果你对 Git 并不是很熟悉,推荐两份阅读资料:

本篇文章是基于中心式的代码管理,但如果你理解其内涵,会发现这跟一般的 github 托管的开源项目是兼容的,只要把每个 fork 都当成特性分支,而项目的发源地是中心。

理想的历史线索

首先看一下这个流传很广的图(取自 A successful Git branching model)
A successful Git branching model

这确实是一个理想的版本分支控制流程,至少它有以下优点:

  • 分支成线性
  • 可追溯某 commit 什么时候被合并进主干

但是,实际中如果不加注意,很容易变成这样:

实际中
这个历史线索有两个很糟糕的地方:

  • 本来应该只有3个分支:internal,new_bbs,new_blog,但是却有5条线索
  • 分不清哪条是主干(你能看出吗?上数第3个commit连接的红色的那条才是)

实际上这种情况的发生很普遍,如果你自己在维护一个项目,并且有多人参与开发,可以用 gitg 这个工具打开项目目录看一看。

下面将会分析图中问题产生的原因和解决方法。

不要产生多余的分支

留意到上一节的糟糕例子中,有几条 merge 信息是这样的格式:

merge <branch> of <source_url> into <branch>

这类 merge 是在开发者向 git 源 push 的时候发生冲突,然后运行git pull的时候产生的。git pull 确实很便利,但是却产生了副作用:一个特性分支变成了两个。

git push # 冲突
git pull # !产生额外的分支

这里写图片描述

如果你认为每个 git 源都是平等的,而且每个开发者都是平等的,这没什么问题。不过如果需要一个中心式的开发历史,这些本地分支的合并信息就会成为干扰。

解决这些多余的 merge 信息的解决方案就是—— rebase。

git push # 冲突
git pull --rebase
git push

pull –rebase 可以基于远程分支重写自己的本地 commit,从而产生干净的线索。

这里写图片描述

有人可能会提出异议,pull –rebase 丢失了并行开发的这一信息,没错,这取决于你的项目开发是怎样的管理。如果你跟我一样喜好干净的分支线索,那么同一分支的提交应该用pull –rebase。确实需要保留分支线索的,应该另外开一条分支,而不要pull。

注意,rebase 某些时候是个危险的工具,因为它实际改写了你的 commit,千万不要 rebase 一些已经提交到公共源的 commit,详情可以看 progit 中 分支的衍合 这一章节。

避免线索“扭麻花”

依然是这个图

实际中

除了多出的分支外,还有一个严重的问题,就是主干线索(internal)被痛苦的扭到了一边。如果这种情况反复出现,各个线索就会像麻花一样扭在一起。

现在来重现一下这种扭麻花出现的原因:

1) 开发者以本地的 master 为基础新建了一个分支 feature A,以此工作,中途更新过 master,然后在工作完成后 merge 回 master 分支。

这里写图片描述

2) 但是向线上的 master push 的时候发生了冲突,因为线上的 master 比自己本地的 master 新。

这里写图片描述

3) 然后,开发者执行了 git pull

这里写图片描述

4) 最后,开发者愉快的 git push ,线上的 master 分支将会和本地一样

这里写图片描述

这样会导致什么问题呢?问题就是如果某个 commit 有 bug,你将无法查证这个 commit 被归入主干分支的上线时间。例如上图的红色色块,看起来是在最新的 merge 之后才进入 master 的,但是它在之前已经进入 master 了。作为 master 分支(甚至任一分支)的管理者,肯定不希望分支的主线索一直在开发者的本地线索中来回切换。

解决方法是,一定要在 merge 之前,将主干分支更新到最新状态。

git checkout master
git pull
git merge feature
git push

如果你事先把 master 更新,线索就会是这样的:

这里写图片描述

bug 点在什么时候进入主干分支一目了然。

线上分支合并一定要用 merge –no-ff

假设你已经知道,git 中的合并默认是快进合并(fast-forward)

这里写图片描述

线上分支间的快进合并会产生一个问题,就是丢失了合并的时间戳。试问上图的红色有 bug commit 是什么时候进入主分支?

如果每次分支合并时加上 –no-ff 参数,就可以避免信息的丢失

这里写图片描述

bug 进入主干的时间将很清晰。

总结

假如上面的规则让你感到混乱,那么下面整理两个法则,分别适用于两种身份。

1.代码提交者身份

向远程分支提交代码时,先 git pull –rebase,避免把本地状态当作分支提交。

2.分支管理者身份

进行线上分支合并时,一律使用 git merge –no-ff,保留合并时间戳。

不要混用两种身份,一边进行代码提交,一边进行分支合并。这样你的 git 管理将会轻松很多。

以上转自:构造干净的 Git 历史线索

多人协作规范

多人合作时比自己管理分支立马复杂了一个数量级,因为每人都会有一套分支结构,如果大家都遵循上一节分支规范还好,否则更加麻烦。

如果不是一个小团队可以达到内部高度规范和统一,那么大多数时候开源项目更适合使用Pull request的方式合作,这样的方式也更符合GitHub设计的精髓。

分支基点

Pull request永远使用主仓库的master(或dev,如果有)分支作为base,并新建一个feature-xxx或者fix-xxx分支进行开发,以保证不产生任何额外无关的commit造成合并困难。同时以此小步快跑的方式也能更大程度的保证分支的完整性和延续性,减少难以合并的分支。

推送合并目标

在发起pull request时,feature部分应对应到主仓库的dev分支,fix部分对应到master分支。

代码评审

Pull request必须经过主仓库成员code review,并由review人员完成合并。如果自己有主仓库的权限,又通过pull request进行代码分享,那么请不要自己完成合并,否则请直接推送到仓库。

处理期限

每个pull request的处理期限暂定为14天,超过2周并无人review的request任何有权限的用户(主仓库成员或自己)可以进行关闭,以减少干扰。

以上转自:Git使用规范建议

Git Explain TUI:交互式代码审查与AI辅助的Git提交探索工具 在软件工程实践中,版本控制系统是管理代码变更的核心工具,其原理基于记录文件快照和差异对比。Git作为分布式版本控制系统,通过提交历史、分支管理和差异对比等技术,为团队协作和代码追溯提供了基础能力。传统的Git命令行工具虽然强大,但在理解复杂代码变更的上下文和意图时,往往需要开发者手动拼接命令和查阅文档,效率有待提升。随着AI辅助编程技术的发展,将大语言模型与开发工具链结合,为代码审查和历史考古带来了新的可能性。Git Explain TUI正是这一趋势下的工程实践产物,它通过终端用户界面整合了提交浏览、差异 阅读详情

相关推荐

从Git泄露到二次注入:一次完整的手工SQL注入实战剖析

SQL注入作为Web安全领域的经典漏洞,其核心原理在于攻击者通过构造恶意输入,干扰应用程序与数据库交互的原始查询逻辑。理解其原理需要从数据库查询语句的拼接机制入手,当用户输入未经充分过滤便被直接嵌入SQL命令时,就可能改变查询的语义。这种漏洞的技术价值在于它可能直接导致数据库信息泄露、数据篡改甚至服务器被接管。在诸如内容管理系统、电子商务平台和在线论坛等涉及数据库交互的广泛应用场景中,SQL注入风险普遍存在。本文通过一个由`.git`泄露引发的真实案例,深入剖析了二次注入这一特殊类型,并详细展示了从源码审计

weixin_33889665的博客 404

git原理探究

概述 下面记录了git的常用命令 命令 git commit --amend:重写提交说明 git rebase -i :修改某个历史提交的提交说明 git rm --cached winxp.img:删除暂存区中的某个文件 git add -u命令可以将所以修改过的文件加如暂存区 git add -A可以将本地删除文件和新增文件都登记到暂存区 git add -p对一个文件内的修改进行有选择性的添加 git commit将等级再暂存区的内容提交 git diff:比较二进制文件的差异 git diff -

weixin_40598838的博客 462

AI推荐系统中的历史语义断层与修复实践

推荐系统本质上是基于语义相似性匹配用户意图与商品资源的技术体系,其核心依赖词向量表征、商品建模和意图识别三大环节。当用户输入‘维京长船’这类承载历史纵深与文化符号的复合概念时,传统模型因训练数据偏斜、分类体系代际断层及时间维度缺失,极易将‘Viking’错误锚定至现代商业品牌,造成语义歧义与文化符号迁移失效。这种历史语义断层并非算法缺陷,而是商业导向系统对非标、低频、高语境化概念的结构性忽视。本文聚焦旅游垂直领域,提出融合历史语义词典、多粒度召回与动态意图解析的增强方案,为NLP工程师、旅游科技产品团队及跨

chikuai9995的博客 388

GitHacker:Git源码泄漏检测工具可恢复整个Git Repo

【代码】GitHacker:Git源码泄漏检测工具可恢复整个Git Repo。

just do it 1400

自己用python写的githack工具

自己用python写的githack工具,以前经常用别人写的,这次自己写了一个与大家分享有问题还请指出。请使用python2来运行

GitHack-master.zip

git源码泄露利用工具,`.git` 泄漏利用工具,可还原历史版本,不需要安装其它 Python 库,只需要有 git 命令

[网安工具] 敏感信息泄露利用工具 —— GitHack · 使用手册

GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析 前言方法一方法二总结 前言 本文仅分享Githack工具基本安装及使用相关知识,不承担任何法律责任。如果你本机之前已经配置过 Python 环境,那么,恭喜你,GitHack 已经安装完成 😊(没有配置过,那就查找相关教程配置一下呗)。注意:该工具的使用需要安装 Python 环境,笔者运行的环境是 Python 3.9.6。

Blue17 の 小窝 2934

git-timestamp:Zeitgitter 的 git 时间戳客户端

git timestamp — Zeitgitter 的Git 时间戳客户端 快速设置 在可以运行git timestamp创建分支时间戳(推荐)或git timestamp --tag SomeTimestampedTag (替代)(在任何git存储库中)之前,请遵循以下指示: 使用 Python 3 的 Ubuntu 16.04、18.04、19.10、20.04 或 20.10 sudo apt install python3-pip python3-pygit2 sudo pip3 install git-timestamp (并非在所有情况下都需要安装python3-pygit2 ,但在某些配置中运行pip3 install git-timestamp时,不这样做会导致奇怪的错误消息。) pygit2是一个非常脆弱的包,对系统包有微妙(或不那么微妙)的依赖。 如果以后要升级

爬取网站目录工具githack

一 git hack 下载地址: GIT:https://github.com/lijiejie/GitHack git hack介绍: a GitHack是一个.git泄露利用测试脚本,通过泄露的文件,还原重建工程源代码。 b 设置环境变量: 装上Python2,然后把Python2目录添加到环境变量 右键计算机-属性-高级系统设置 c 然后执行命令D:\Python27\python.exeD:\Users\cxt\Downloads\GitHack-master\GitHack...

m0_52663093的博客 2284

GitHack-master

git源码泄露利用工具,`.git` 泄漏利用工具,可还原历史版本,不需要安装其它 Python 库,只需要有 git 命令

运放+三极管恒流源电路设计实战:从原理到仿真一步到位(附Multisim文件)

本文详细解析了运放与三极管构建恒流源电路的核心原理,重点阐述了负反馈机制如何实现精准的电流控制。通过Multisim仿真实战,从电路搭建、参数计算到负载调整率与动态响应分析,一步步指导设计过程,并提供常见故障的调试技巧与PCB设计要点,帮助工程师从理论平稳过渡到可靠实践。

7z8x2c4v6b9的博客 711

GitHack & GitHacker

写这个的原因是在做CTFHub的Git泄露题目时发现GitHack并不能正常将服务器中的 .git 文件正常保存下来,问了问工作室的好哥哥,告诉我GitHack就是有这个问题,使用GitHacker即可,于是记录下此问题 GitHack 下载地址:https://github.com/lijiejie/GitHack GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。 渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等web安全漏洞。 G.

z1moq的博客 4892

基于传输门与传输管逻辑的全加器设计

全加器是指对输入的两个二进制数相加(A与B)同时会输入一个低位传来的进位(Ci-1),得到和数(SUM)和进位(Ci)。一位全加器可以处理低位进位,并输出本位加法进位。由于这种晶体管的漏极和源极完全可以互换使用,因此这种电路的输入端与输出端也可以互换,这就是具有信号传输双向特性的传输管。传输管的输入信号可以传输到输出端,同时输出端的信号也可以传输到输入端。半加器是指对输入的两个一位二进制数相加(A与B),输出一个结果位(SUM)和进位(C),没有进位的输入加法器电路,是一个实现一位二进制数的加法电路。

qq_40353731的博客 4381

怎样使Git 的历史线索更清晰

用 Git 也有一段时间了,看过一些 Git 工作流的文章,加上工作和业余中参与一些项目开发,对 Git 的工作流有一些心得,写下来整理一下。 如果你对 Git 并不是很熟悉,推荐两份阅读资料: ProGit 中文版A successful Git branching model 本篇文章是基于中心式的代码管理,但如果你理解其内涵,会发现这跟一般的 github 托管的开源项目是

blacksoil55的博客 391

一文读懂,WMS仓库管理系统模块功能

对于仓库管理人员来说,仓储管理是一件需要十分负责、又精细化的工作。

深蓝易网的博客 5216

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

git-game开发者指南:如何创建自己的Git学习游戏

想要创建一个有趣且教育性的Git学习工具吗?git-game是一个创新的终端游戏,通过10个渐进难度级别测试用户的Git命令知识。这个开源项目不仅帮助新手学习Git,也为开发者提供了创建类似教育工具的绝佳模板。 ## 🎯 什么是git-game? git-game是一个基于终端的交互式Git学习游戏,每个级别都是一个需要在Git仓库中完成的任务。玩家通过执行正确的Git命令来解锁下一个级别,

gitblog_00924的博客 936

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1209

git参考资料

个人博客http://www.iwangzheng.com/ $git log --graph $git reset --hard 67889898... $ssh-add $git pull --rebase $git fetch (相当于pull新分支) $git branch (查看当前所在分支) $git checkout fetch-xml (转到fetch-xml分支)...

weixin_34242658的博客 161

汽车UDS诊断之诊断会话控制服务(0x10)深度剖析

DiagnosticSessionControl就是诊断会话控制。 请求消息定义 A_Data类型 参数名称 Cvt 字节值 助记符 #1 诊断会话控制请求SID M 0x10 DSC #2 子功能=[诊断会话类型] M 0x00-0xFF LEV_DS_ ...

心骗小白话的博客 7419

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1140

git学习笔记

本文主要记录在学习使用git过程中的一些问题,总结,资料。 Git使用概述: 安装软件git 设置用户 git config –global user.email 你的email地址 git config –global user.name "Arthur" 基本操作(在一个项目的根目录下) git init git status git add . git commit 如

bugaoni的专栏 748

【人工智能论文发表】基于医学病例文本和多模态大模型的医疗影像分割方法研究

摘要:本研究提出MMS-Former,一种基于级联多模态Transformer的文本引导医学图像分割框架。该模型创新性地将临床文本信息深度融入图像分割全过程,通过SwinUNETR提取视觉特征,ClinicalBERT编码病历文本,并在解码器的每个上采样阶段通过交叉注意力模块实现多级文本特征融合。实验表明,相比纯视觉模型,MMS-Former在Dice系数和IoU指标上分别提升3%以上,在处理边界模糊目标时表现尤为突出。模型还设计了结合Dice损失和图文对比损失的复合目标函数,确保分割精度与语义对齐。代码实

u012133341的博客 139

Difference between git pull and git pull --rebase

个人博客地址: http://www.iwangzheng.com/ 推荐一本非常好的书 :<Pro Git>http://iissnan.com/progit/ 构造干净的 Git 历史线索 http://codecampo.com/topics/379 git pull=git fetch+git mergeagainst tracking up...

weixin_34032779的博客 94

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

从.git泄露到逻辑漏洞:攻防世界Lottery实战解析

本文深入解析了攻防世界CTF题目Lottery的完整解题思路。通过信息收集发现.git源码泄露,审计代码后利用PHP弱类型比较漏洞(true == 字符串),构造特殊Payload实现无限刷钱,最终购买Flag。文章详细展示了从信息收集、源码审计到漏洞利用的完整攻击链,对Web安全实战具有重要参考价值。

metaverse5vr的博客 438

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: nodejs javascript 实现随机数种子的几种方法
下一篇: C++11新特性之新类型与初始化
whitehack
博客等级 码龄19年 67粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值