Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)
文章目录
- 简介
- 前置概念
- .git目录
- objects目录
- refs目录
- HEAD文件
- reset
- reflog 与 reset --hard
- revert(撤销指定提交)
- stash
- diff
- 工作区与暂存区差异
- 暂存区与HEAD差异
- 工作区与HEAD差异
- 其他比较
- restore、checkout(代码撤回)
- merge、rebase、cherry-pick
简介
本文将介绍Git几个核心概念,和最常用的几个内容操作命令:
- reset
- diff
- restore、checkout
- stash
- reflog
- revert
- cherry-pick(merge、rebase)
前置概念
首先我们来看一下几个非常重要的前置概念
.git目录
git init
我们执行上面命令就会生成一个.git目录
【工作区】add就到【暂存区】commit就到【本地仓库】
objects目录
objects目录中保存的是add到暂存区和commit到本地仓库的文件
refs目录
HEAD文件
HEAD是一个文本文件,你们内容是HEAD当前指向的分支:
ref: refs/heads/feature-view
reset
我们首先来看一下我们最常用的reset操作。
reset是重置,他重置的是commit
git reset [–soft | --mixed | --hard] HEAD
- –mixed:默认参数,撤销commit,所有commit和没有commit的代码放到工作区
- –soft:撤销commit,所有commit和没有commit的代码放到暂存区
- –hard:撤销commit,丢弃所有commit、工作区、暂存区代码
# head表示当前版本,head^等价于head~1表示回退所有内容到上一个版本
git reset head^# 回退2个版本
git reset head~2# 将tree.txt这个文件的版本到上一个版本
git reset head^ tree.txt# 回退到指定commit,commit-id:4889036387
git reset 4889036387
我们最最常用的reset的2个操作:
- 感觉自己的commit有点问题,想重新commit,这个也可以用git commit --amend
- 自己push之前有提交,导致push失败,pull之前要reset,这里可以用–soft参数,这样如果没有冲突就不用再add了
reset多个版本的这种操作不建议做,除非没有push到远程仓库,或者只有你一个人在提交代码。
如果修改了远程仓库的commit,通常push是不行的,必须使用git push -f。
git push -f是一个非常危险的操作,会导致push之前,其他人push的新代码丢失
git提示可以使用,是让我们知道自己在干什么,而不是告诉我们git push不行,用git push -f 吧。
一般来说,规范的团队都会把git push -f给禁用掉,不然一个人骚操作,代码丢了,可能啥证据都没有。
reflog 与 reset --hard
如果不小心执行了reset --hard,有机会补救吗?
git reset --hard head~2
答案是还能抢救一下:
首先:
git reflog
再使用git reset --hard回退到reset的上一个版本
git reset --hard 8ca4549
commit的内容回来了,但是工作区和暂存区的内容掉了,找不回了
revert(撤销指定提交)
revert是用来将某次的commit的内容,提取出来到工作区。
这样就可以重新编辑,然后再一次提交。
主要使用场景就是:发现自己某一次提交有点问题,但是在这次提交之前已经有其他人提交了,怎么办呢?
可以用revert
# 查看提交记录
git log --oneline
# 撤销指定的提交
git log revert b1c305d
revert并不会修改指定的commit,只会根据指定commit做逆操作
可以checkout到指定commit,看到内容并没有少:
git checkout -b feature-view b1c305d
revert相当于将指定的commit合并到当前的head,还可能冲突。
所以,通常来说还不说直接改。唯一的作用可能就是记不清楚的commit的内容的时候,可以revert能自动帮你做。
stash
stash最常用的场景2个:
- 我们切分支的时候,有时候有修改不能切,就可以stash暂存
- pull代码冲突,就可以先stash 再pull
# 默认暂存
git stash# 添加暂存提示信息
git stash save "暂存提示信息"# 查看暂存了哪些内容
git stash list# 查看最上面的暂存修改了哪些文件
git stash show
# 查看第2个暂存修改了哪些文件
git stash show stash@{1}# 查看最上面的暂存修改的具体内容
git stash show -p
# 查看第2个暂存修改的具体内容
git stash show stash@{1} -p# 应用最上面的暂存,不删除
git stash apply
# 应用第2个暂存
git stash apply stash@{1} # 应用最上面暂存,并删除(没有冲突才删除)
git stash pop
# 应用第2个暂存,并删除(没有冲突才删除)
git stash pop stash@{1}# 删除最上面暂存
git stash drop
# 删除第2个暂存
git stash drop stash@{1}# 删除所有暂存
git stash clear
diff
工作区与暂存区差异
git diff
git diff b.txt# 暂存区的文件在objects中,可以通过下面的命令查看
git cat-file -p 8fec8c3
# 工作区的对象还没有在objects中,会提示找不到对象
git cat-file -p 04a9f41# 可以通过HEAD查看已经commit的对象
git cat-file -p HEAD:b.txt
git cat-file -p d1d06ad
暂存区与HEAD差异
暂存区(stage)HEAD是当前分支最新的commit
git diff --cached
git diff --cached b.txt
工作区与HEAD差异
HEAD是当前分支最新的commit(通常就是master),也可以使用指定的commit-id
git diff HEAD
git diff HEAD b.txt# 工作区与指定commit的差异
git diff commit-id
其他比较
# 查看两个commit之间的差异
git diff commit-id1 commit-id2# 查看不同分支的文件差异
git diff branch-name1:file-path branch-name2:file-path
restore、checkout(代码撤回)
推荐使用restore,checkout还是让他去切分支吧。
restore是有递进关系:
- 可以从暂存区撤回到工作区使用–staged参数(相当于add的逆操作)
- 可以直接丢弃工作区的修改
# 丢弃工作区的修改
git restore a.txt
# 等价于
git checkout a.txt
# 丢弃工作区和暂存区所有修改,不能指定文件,指定文件就等价于git checkout filename.txt
git checkout -f# 将暂存区回退到工作区
git restore --staged a.txt
merge、rebase、cherry-pick
merge、rebase、cherry-pick主要是操作commit:
- merge合并代码,注意合并解决冲突就可以
- rebase,优化commit,注意修改的开始commit之后没有其他人的提交就可以(如果提示需要git push -f时一定要注意)
- cherry-pick是从其他分支挑选commit到当前分支
这里我们重点说一下cherry-pick,比如一个任务我已经开发了一段时间了,但是临时需要发一个修复版本,但是修复版本使用了我开发这段时间的代码,这么办呢?
这个时候就可以使用cherry-pick。
如果有冲突,先解决冲突:
继续cherry-pick:
# 首先切到指定分支
git checkout b1
# 查看需要pick哪些提交
git log --oneline# 切回到pick分支
git checkout master# cherry-pick指定的commit
git cherry-pick 1f54b01 0fed6dd# 如果有冲突手动解决冲突,然后add
git add .# 继续cherry-pick处理commit信息
git cherry-pick --continue
相关文章:

Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)
文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介 本文将介绍Git几个核心概念…...

【人工智能在医疗企业个人中的应用】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
IPv4头部和IPv6头部
IPv4和IPv6是互联网协议(IP)中的两个主要版本,它们在数据包头部(Header)结构上存在显著差异。以下是IPv4头部和IPv6头部的主要结构和区别: IPv4头部结构 IPv4(Internet Protocol Version 4&…...

从零开始手把手带你训练LLM保姆级教程,草履虫都能学会!零基础看完这篇就足够了~
导读 ChatGPT面世以来,各种大模型相继出现。那么大模型到底是如何训练的呢,在这篇文章中,我们将尽可能详细地梳理一个完整的 LLM 训练流程,包括模型预训练(Pretrain)、Tokenizer 训练、指令微调࿰…...
strcat函数追加字符串
char * strcat ( char * destination, const char * source ); dest:目标字符串,即要将源字符串追加到其末尾的字符串。src:源字符串,即要追加到目标字符串末尾的字符串 使用strcat函数给目标字符串追加字符时,首先要…...

每月洞察:App Store 和 Google Play 的主要更新
Google Play 和 App Store 的算法不断发展,定期更新和变化会显着影响其功能。对于开发人员和营销人员来说,跟上这些变化至关重要,因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新,解释它…...
【python openai function2json小工具】
两种方法 一种openai-swarm中提供的、一种langchain实现的 一、openai工具函数调用 import inspectdef merge_chunk(final_response: dict, delta: dict) -> None:delta.pop("role", None)merge_fields(final_response, delta)tool_calls delta.get("tool_…...
super()和super().__init__()的解释
一、super 1.基本概念 在python继承当中,super()函数主要用在子类中调用父类的方法。它返回一个特殊对象,这个对象会帮我们调用父类方法 class Parent:def __init__(self, name):self.name namedef say_hello(self):print(f"Hello, Im {self.nam…...

【C++】—— 多态(下)
【C】—— 多态(下) 4 多态的原理 4.1 虚函数表指针4.2 多态的原理4.3 动态绑定和静态绑定 4.4 虚函数表 4 多态的原理 4.1 虚函数表指针 我们以一道题来引入多态的原理 下面编译为 32 位程序的运行结果是什么() A、编译报错 B…...

idea 2023 配置 web service
前言 能在网上查到的资料,都是比较老的,搞了一上午才配置好了环境 因此记录一下,服务你我他 我的环境: java 1.8,Idea2023.1 配置web service 服务端 直接新建一个java新项目 下载插件 添加框架支持 启动项目 配置web service 客户端 新建项目,下载三个插件的步骤和上面服务…...
MYSQL数据库SQL+DQL
关于MySQL数据库中的SQL和DQL,以下是一些关键信息: SQL概述 SQL(Structured Query Language,结构化查询语言)是用于操作关系型数据库的编程语言。它定义了一套操作关系型数据库的统一标准。SQL语句可以单行或多行书写…...

Java中的异常Throwable
原文链接https://javaguide.cn/java/basis/java-basic-questions-03.html#%E5%BC%82%E5%B8%B8 Java 异常类层次结构图 Exception 和 Error 的区别 在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。Throwable 类有两个重要的子类: Excep…...

Day4顺序表c++代码实现
代码中实现,顺序表的初始化,插入,查找,删除 废话不多说,直接上 #include<iostream> using namespace std; #define eleType int struct SequentialList {eleType* elements;//指针int size;int capacity;//容量…...
将图片转换成base64格式
1.先创建一个canvas对象,然后给canvas对象设置图片对象的宽高,再调用canvas的getContext获取2d上下文对象,再调用上下文对象的drawImage方法,再通过canvase对象的toDataURL方法,将图片转换成base64格式的字符串 2.将b…...
征服ES(ElasticSearch)的慢查询实战
在 Elasticsearch(ES)中,进行大数据查询时,常常会由于多种因素而导致性能显著下降。接下来,我们将深入探讨几种常见情况及其相应的解决方案。 一、常见问题分析 深分页、大排序 大量数据扫描与多分片上的多次排序会严…...

如何才能从普通程序员转行AI大模型?
人工智能已经成为一个非常火的方向。作为一名普通的程序员,该如何转向AI大模型方向。以程序员为例,看看普通程序员如何开启AI大模型之路。 接下来给大家分享一下程序员转大模型的一些注意点: 作为一名程序员,在考虑转行至大模型领…...

【番外】软件设计师中级笔记关于数据库技术更新笔记问题
提问 由于软件设计师中级笔记中第九章数据库技术基础的笔记内容太多,我应该分几期发布呢?还是一期一次性发布完成。 如果分为一期发布,可能需要给我多一些时间,由于markdown格式有所差异,所以我需要部分进行修改与调…...

【代码】约瑟夫问题——故事背景
Hello!大家好,我是学霸小羊,今天先来讲讲约瑟夫问题的背景。 在古罗马时期,犹太历史学家约瑟夫斯领导犹太人反对罗马帝国的统治,并与罗马军队进行激烈的战斗。然而,在罗马军队的围困下,约瑟夫与…...
什么是事件冒泡和事件捕获
文章目录 1. 事件传播机制2. 事件冒泡(Event Bubbling)3. 事件捕获(Event Capturing)4. 事件冒泡和事件捕获的区别5. 阻止事件传播总结 事件冒泡和事件捕获是两种处理网页中事件传播的机制,特别是在 JavaScript 中处理…...

高端优质建站公司具备哪些优势?2024高端建站公司哪家好
从某种程度上讲,一个出色的建站公司需具备将无形的品牌价值巧妙转化为直观视觉元素的能力,这一转化过程极为考究,涵盖了设计的精细程度、色彩运用的巧妙以及空间布局的智慧,这些要素均不容忽视。 接下来考察网站的内容策划能力同…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...