git中各个commit节点的查询 回溯 与 合并:git rebase与git reset

从“I‘m history”到技术栈:History在前端、Git与Shell中的核心原理与应用 在计算机科学中,历史(History)作为一种核心的数据管理机制,普遍存在于多个技术领域,其本质是记录状态变化以实现可追溯性与可逆性。从数据结构角度看,浏览器History基于栈(Stack)模型管理会话导航,支持前进后退操作,是现代单页应用(SPA)路由的基石;Git History则采用有向无环图(DAG)结构记录代码提交,保障版本控制的完整性与并行开发支持;Shell History通过线性列表与搜索优化提升命令行效率。这些实现共同体现了“约定大于配置”的设计哲学——开发者需理解其在特定上下文中的运行 阅读详情

概述:在利用git进行管理的时候,除了对不同的分支进行merge以外,往往需要对同一个一个分支上的不同commit进行合并或者撤销;或者对不同分支上的多次提交进行合并,形成一个线性的提交历史,等等:这些都要用到git rebase,git reset和git log这三个命令。


本文来源:git中各个commit节点的查询 回溯 与 合并:git rebase与git reset   http://blog.youkuaiyun.com/trochiluses/article/details/8996431

1.commit的信息查询——git log

如果我们在同一个分支上进行了多次commit,要想查找每次commit的信息,需要使用git log命令

$git log

commit daffbd39053d4f2e78f88955c2158de6092258a2
Author: hyk <hyk@hyk-linux.(none)>
Date:   Wed May 29 22:45:23 2013 +0800


    this is a test


commit 38d58591fc0607bfd262fc8d363e52047fcf0e9c
Author: Eryu Guan <eguan@redhat.com>
Date:   Wed May 29 08:12:44 2013 -0500


    xfstests: fix typo in check
    
    There is no $testname, should be $test_name
    
    Signed-off-by: Eryu Guan <eguan@redhat.com>
    Reviewed-by: Rich Johnston <rjohnston@sgi.com>
    Signed-off-by: Rich Johnston <rjohnston@sgi.com>

如上,commit按照时间的远近排列,最新的修改在最前面

使用以下两个命令,可以查看commit的详细信息

$git log --graph

$git log -p


2.commit点的撤销与分解——git reset


2.1命令概述:


1)命令解释:

git reset:Reset current HEAD to the specified state

2)命令模式:

 git reset [-q] [<commit>] [--] <paths>...
 git reset (--patch | -p) [<commit>] [--] [<paths>...]
git reset (--soft | --mixed | --hard | --merge | --keep) [-q] [<commit>]

3)模式详解:

上面的第一种和第二种形式中,直接从commit中copy条目到index,从而实现index的回滾。第三种形式中,将当前分支的HEAD设置到commit,同时可以选择是否对working tree和stage作相应匹配的更改。其中,在所有的命令形式中,<commit>默认是HEAD。        

git reset --<mode> [<commit>]

           This form resets the current branch head to <commit> and possibly updates the index (resetting it to the tree
           of <commit>) and the working tree depending on <mode>, which must be one of the following:


           --soft:仅仅更改本地仓库中的提交历史,修改HEAD所指向的commit
               

           --hard:重置index和working tree。任何在当前目录下的tracked文件,如果在commit之后,都会被废弃。
               注明:如果不指定mode的话,那么index也将会同步进行更新。这个操作用于实现对index中文件的撤销和更改。


2.2命令使用情景:


1)commit 节点的移动


现在有如图所示的版本情况:

---------(1.1)-----------(1.2)--------(1.3)------------(1.4)

其中HEAD指向1.4。此时想要生成patch,如果直接运行git format-patch的话,将生成1.3~1.4的patch,如果不想要1.2和1.3的提交记录,直接从实现1.1到1.4的修改,此时需要运行以下命令:

$git reset 1.1 

此时,当前工作目录下位1.4版本的文件,1.2 ,1.3这两个版本的修改历史被丢弃。然后可以继续 add然后commit

注意,git reset的意义是: git-reset - Reset current HEAD to the specified state,它改变的本地仓库中的文件和index中的记录,并没有改变当前工作目录之下的文件。运行这个命令以后,你可能得到如下的结果:

root@hyk-linux:/home/hyk/software/ltp# git reset  4bdda040bc045dd8d921d54d3b54db5dabeb9958



Unstaged changes after reset:
M testcases/kernel/mem/tunable/max_map_count.c



$git add file1

$git commit

$git add file2

$git commit


2)撤销add到staged中的文件

情景:add了两个文件到index,但是觉得没有修改好,现在需要撤销add这个操作。

               $ edit                                     (1)
               $ git add frotz.c filfre.c
               $ mailx                                    (2)
               $ git reset                                (3)
               $ git pull git://info.example.com/ nitfol  (4)


3)撤销一次提交,修改之后重做

相对于上个例子,更进一层,add完毕,而且已经commit,然后想要撤销这次提交,重做以后再进行提交。


       Undo a commit and redo


               $ git commit ...
               $ git reset --soft HEAD^      (1)
               $ edit                        (2)
               $ git commit -a -c ORIG_HEAD  (3)


3.git rebase:合并不同分支上的提交,形成线性提交历史

git rebase的说明:git-rebase - Forward-port local commits to the updated upstream head

rebase,顾名思义,rebase的意思就是改变某一个分支的base。本例中,就是将mywork这个分支的base从C2改动到C4

假设你现在基于远程仓库"origin",创建一个叫"mywork"的分支。

$ git checkout -b mywork origin

现在我们在这个分支做一些修改,然后生成两个提交(commit).

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
...

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

$ git checkout mywork
$ git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 到最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

$ git rebase --abort
注意:如果C3 C5里面改动的内容有冲突,那么这个时候先要解决冲突,然后才能提交。


TortoiseGit图形化解决Git代码冲突实战指南 Git代码冲突本质是多分支对同一文件行的并发修改导致的合并不确定性,其核心原理在于Git的行级文本比对机制而非语义理解。TortoiseGit通过三栏可视化对比、文件类型感知(如Java语法高亮、YAML缩进智能识别)和块级变更控制等技术手段,显著降低Windows平台下冲突解决的认知负荷与出错风险。相比命令行,它深度集成资源管理器交互范式,支持中文环境、DPI适配及企业级安全策略,成为金融、政务、电商等Java后端团队高频采用的协作基础设施。本文聚焦真实项目中编译失败型、业务逻辑型与格式型三类冲突的分级处 阅读详情

相关推荐

【Bug—eNSP】华为eNsp路由器设备启动一直是0解决方案!

软件,添加AR设备时启动异常,最开始错误代码是40,最后通过重新安装,又出现了新的问题,启动AR设备一直是0,而且界面卡住。打开控制面板→网络和Internet→网络和共享中心→更改适配器设置,然后再按以下步骤一次操作。重新打开eNsp,然后选择注册设备,注册成功后重新启动一下,这个时候AR设备就可以正常启动啦。打开eNsp→菜单→工具→选项→服务器设置,写入刚刚写的IP地址就可以了。打开VirtualBox,将左侧的文件全部删除(点击删除所有文件)

享你所想 3418

【GIT】 查看、合并、缓存分支

1 查看分支 1.1 列出本地已经存在的分支,并且当前分支会用*标记 1.2 查看远程版本库的分支列表 1.3 查看所有分支列表(包括本地和远程,remotes/开头的表示远程分支) 1.4 查看一个分支的最后一次提交 1.5 查看哪些分支已经合并到当前分支 1.6 查看所有未合并工作的分支 2 合并分支 2.1 首先切换到master分支上 2.2 确保master代码是最新的代码 2.3 然后我们把dev分支的代码合并到master上 2.4 然后查看状态及执行提交命令 2.5 执行将刚才合并的代码

千寻简笔记《chihiro-notes》已开源|公众号:千寻简 3780

避开这5个坑!Tushare金融数据获取与分析的常见错误排查指南

本文详细解析了使用Tushare进行金融数据获取与分析时常见的5个问题,包括Token失效、数据缺失、频率限制、数据一致性和性能瓶颈,并提供了实用的解决方案和优化策略。通过Python代码示例和最佳实践,帮助金融数据分析师和量化开发者高效避开这些陷阱,提升工作效率。

x2y3z4a5b的博客 1037

git 常用命令记录

1、常用命令 图出自:Git 常用命令大全 git reflog (Reference logs): 查看所有分支的所有操作记录信息(包含已经被删除的 commit 记录和 reset 的操作),reflog属于本地存储,用于记录用户的本地操作,并不在Git仓库中存储,常用于恢复本地的错误操作(版本回退或恢复) git log:查看当前分支所有提交过的版本信息(不包括已经被删除的 commit 记录和reset的操作)--pretty=oneline只显示版本号、提交时备注信息 .....

J 博客 2234

Claude Code 完整学习笔记

Claude Code 学习笔记摘要 Claude Code是Anthropic推出的智能编码工具,基于Claude Opus 4.5模型构建,提供跨平台支持(终端/VS Code/JetBrains/Web等)。核心功能包括: 代码库理解与多文件编辑 命令执行与开发工具集成 智能体协作开发流程 安装要求Node.js≥18,提供原生/Homebrew/npm等多种安装方式,支持环境变量配置API访问。基础交互模式包括会话管理、文件操作和代码审查等功能,可自动读写文件并执行精确修改。 (149字)

虚心若愚 812

STM32G0实战:手把手教你用国产GD25Q16 Flash存储传感器数据(附完整驱动)

本文详细介绍了如何使用国产GD25Q16 Flash芯片与STM32G0系列MCU实现传感器数据存储的完整方案。从SPI接口配置、驱动层实现到存储系统架构设计,提供了实战代码和优化策略,帮助开发者快速构建高性价比的物联网数据存储系统。

weixin_30733003的博客 106

vsode 编译报错:main.c:4:10: fatal error: iostream: 没有那个文件或目录

main.c:4:10: fatal error: iostream: 没有那个文件或目录

Aliven888的博客 6435

从传感器到执行-智能家居 Agent 的感知-决策-执行闭环

本文提出了一种面向智能家居的感知型Agent架构,通过"感知-决策-执行"的闭环系统实现智能化控制。感知模块整合多源传感器数据,决策模块基于规则或机器学习模型生成控制策略,执行模块完成设备操作。系统能够实时监测环境参数和用户状态,自动调节温度、照明等设备,提升家居舒适度。该架构可扩展为多模态感知与强化学习相结合的智能系统,为智慧家居发展提供技术基础。

一键难忘的博客 1123

Git 之 revert

revert 可以撤销指定的提交内容,撤销后会生成一个新的commit。 1、两种commit: 当讨论 revert 时,需要分两种情况,因为 commit 分为两种:一种是常规的 commit,也就是使用 git commit 提交的 commit;另一种是 merge commit,在使用 git merge 合并两个分支之后,你将会得到一个新的 merge commit merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commi

赶路人儿 5万+

一文吃透 ABAP CDS SELECT:语法全景、关联与去重、可运行示例与实战心法

摘要: 本文深入解析ABAP中CDS视图的SELECT语法,重点介绍两种等价写法、关联与路径表达式优化、DISTINCT去重逻辑及WHERE/GROUP BY/HAVING/UNION等子句的应用。通过可运行的业务伙伴角色去重、关联路径查询及多角色筛选示例,演示如何将CDS特性转化为项目实践。强调关联复用性优于传统JOIN,并指出DISTINCT的权限边界与误用场景,帮助开发者从行式思维转向图式数据建模。(150字) 关键词: ABAP CDS、SELECT语法、路径表达式、DISTINCT去重、关联复用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

手把手教你学Simulink——基于Simulink的PMSM MTPA + FW 全速域平滑切换策略

本文提出一种基于Simulink的PMSM全速域平滑切换控制策略,通过融合MTPA和弱磁控制(FW)实现基速附近的无冲击过渡。在过渡区采用加权融合电流给定方法,使电流超调<5%、转速波动<2%,全速域效率>90%。文章详细介绍了系统架构、核心算法及Simulink建模步骤,包括融合控制器设计、切换逻辑实现和参数优化。仿真结果表明,该方法相比传统硬切换显著改善了动态性能,并扩展了调速范围。同时提供了可直接复用的工程模板和MATLAB代码,为电机控制工程师提供了实用的全速域控制解决方案。

MHD0815的博客 80

Git merge错了以后,回退到上一次commit的版本

在webstorm控制台里,点击Git 然后点击Log 在需要回退那里,点击鼠标右键,出现下图 点击Reset Current Branch to Here,在弹出的对话框里选择Hard选项 再点击Reset按钮即可

m0_46254595的博客 1333

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1430

commit节点号 git_git中各个commit节点的查询 回溯 与 合并:git rebase与git reset | 学步园...

概述:在利用git进行管理的时候,除了对不同的分支进行merge以外,往往需要对同一个一个分支上的不同commit进行合并或者撤销;或者对不同分支上的多次提交进行合并,形成一个线性的提交历史,等等:这些都要用到git rebase,git reset和git log这三个命令。1.commit的信息查询——git log如果我们在同一个分支上进行了多次commit,要想查找每次commit的信息,...

weixin_39847437的博客 453

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Git交互式变基:合并Commit的完整指南与实战

在版本控制系统中,提交历史是项目演进的宝贵记录。通过合并多个细碎的提交,可以形成逻辑清晰、意义完整的提交单元,这对于代码审查、问题回溯和生成更新日志至关重要。其核心原理在于对本地提交历史进行重写与整理,而非直接修改已发布的代码。从技术价值看,这能显著提升代码库的可读性与可维护性,是工程实践中的重要环节。在团队协作开发场景下,尤其是在准备合并请求(Pull Request)或功能分支集成时,一个整洁的提交历史能极大提升协作效率。本文聚焦于使用交互式变基(Interactive Rebase)这一强大工具,深入

weixin_30268921的博客 409

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python学习0_GIT

/

坏孩子的诺亚方舟 1396

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

实用Git命令总结

场景:在开发分支和稳定分支合并时,有时不想直接合并整个分支,以免稳定版本混乱,就可以选择一个或多个提交应用到当前分支,等价于用指定的commit再次提交。git cherry pick:选择某一个分支中的一个或几个commit(s)来进行操作。

golfxiao的专栏 175

30-seconds-of-code 实战指南:用 git log --oneline 查看简洁的 Git 提交摘要

在 30-seconds-of-code 仓库的 [Git 文章合集](https://link.gitcode.com/i/8e7154ca52620fa4d8af6e1e628efaea) 中,提交(commit)与仓库(repository)是两大核心主题,而 `git log` 是贯穿其中的最常用命令之一。本指南以 [view-commits-summary.md](https://lin

gitblog_00252的博客 203

Git 核心操作全解:提交、日志、版本回退与文件撤销实战指南

版本控制是软件工程协作的基石,而 Git 作为最流行的分布式版本控制系统,其核心操作逻辑值得每一位开发者深入理解。从工作区、暂存区到本地仓库的三区模型出发,可以清晰掌握代码从修改到提交的完整流转过程。日常开发中,高频使用的功能主要集中在提交代码、查看日志、版本回退和文件撤销这四个维度。通过合理运用 git log 进行历史追溯、利用 reset 与 revert 区分不同场景下的回退策略、借助 restore 精准恢复工作区或暂存区文件,以及运用 reflog 为误操作兜底,开发者能够建立一套完整的“后悔体

weixin_34005042的博客 194

嵌入式开发者如何借助AI优雅管理Git版本与固件协作

版本管理是软件工程的基础能力,尤其在嵌入式开发中,固件、硬件配置与工具链的复杂性让Git的使用难度远超普通Web项目。理解Git的核心原理,比如工作区、暂存区与仓库的关系,是高效协作的前提;而合理的仓库骨架、忽略规则与分支策略,则是保障固件代码可追溯、可回滚的关键。随着AI辅助编程工具的成熟,开发者可以借助AI自动生成规范的提交信息、解释晦涩的报错、预判合并冲突并辅助代码审查,大幅降低嵌入式场景下的版本管理门槛。本文从实际工程痛点出发,结合智能传感器固件迭代案例,演示了一套从仓库初始化到AI辅助审查的完整工

weixin_33946605的博客 436

Git误操作急救指南:20+场景恢复与预防策略

版本控制是软件开发的核心基础设施,Git作为分布式版本控制系统的代表,通过内容寻址机制管理代码变更历史。理解Git对象数据库、引用系统和垃圾回收原理,能有效应对commit丢失、分支覆盖等常见问题。针对敏感信息泄露等中高风险场景,结合git filter-repo工具可实现历史重写。通过配置pre-push钩子、启用分支保护等工程实践,可构建预防体系。本文重点解析git reflog、fsck等核心恢复命令,覆盖从本地误删到远程覆盖等20余种事故场景,提供成功率评估和分步抢救方案。

weixin_34204722的博客 450

Jujutsu 面向 Git 专家实战指南:在 Git 仓库中体验更简单、更安全、更快的历史编辑

这篇指南面向已经熟练使用 Git 的开发者,系统讲解 Jujutsu(`jj`)相对于 Git 的实际优势:从同仓库并存(colocation)、用提交替代暂存区,到自动化的历史改写、基于操作日志的撤销、演变日志(evolog)以及 `jj absorb` 补丁栈吸收。读完本文,你将掌握在熟悉的 Git 工作流中无缝切入 `jj` 的具体命令与适用场景,并能从源码层面理解这些能力为何更安全、更高效

gitblog_00506的博客 367

git常用命令总结

分支管理: git branch 查看本地所有分支 git branch -a 查看所有的分支 git branch -r 查看远程所有分支 git branch new_branch 创建新的分支 git branch -d 删除本地的分支 git checkout Linux_6700 切换到Linux_6700分支 git checkout sp_part.c 更新单个文件(会覆盖修改的内...

TSZ0000的博客 259

Git本地仓库操作指南:从基础到高级命令详解

版本控制系统是软件开发中管理代码变更的核心工具,Git作为分布式版本控制系统的代表,通过本地仓库机制实现高效的版本管理。其工作原理基于快照存储方式,每次提交都会记录完整的文件状态。本地仓库操作不依赖网络,适合开发者快速构建版本控制思维模型。通过git init初始化仓库、git add暂存变更、git commit提交版本的基础工作流,开发者可以建立完整的本地开发闭环。在实际工程实践中,结合.gitignore文件管理、git stash临时储藏、git rebase历史重构等高级技巧,能显著提升开发效率。

weixin_42537142的博客 7

Jujutsu (jj) 命令行参考完全指南:Git 兼容 VCS 的完整命令体系与实战用法

Jujutsu(命令名为 `jj`)是一个与 Git 兼容的版本控制系统,本指南基于仓库中自动生成的 CLI Reference([cli-reference.md](https://link.gitcode.com/i/6787af6be8e30b25ce232fede7ef6140) 与其数据源 [cli-reference@.md.snap](https://link.gitcode.com

gitblog_00162的博客 152

从System.out到Logback:Java日志与Git版本控制实战

在Java服务端开发中,可观测性与可追溯性是保障系统稳定运行的两大基石。日志记录作为程序运行时的“黑匣子”,从基础的System.out输出到工业级日志框架Logback的演进,解决了调试信息缺失、日志级别混乱、文件滚动与敏感信息泄露等核心痛点;而Git版本控制则为代码演化提供了完整的历史链,通过工作区、暂存区与版本库的协作,配合规范的commit message与分支管理,让每一次变更都有迹可循。理解日志级别(TRACE到ERROR)的合理配置、Logback的占位符与pattern设计,以及Git提交规

weixin_34221073的博客 161
上一篇: detached HEAD意义详解
下一篇: scp 出现错误ssh: connect to host 9.123.159.41 port 22:connection refused的解决办法
谁不小心的
博客等级 码龄15年 462粉丝 246原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值