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高端建站公司哪家好
从某种程度上讲,一个出色的建站公司需具备将无形的品牌价值巧妙转化为直观视觉元素的能力,这一转化过程极为考究,涵盖了设计的精细程度、色彩运用的巧妙以及空间布局的智慧,这些要素均不容忽视。 接下来考察网站的内容策划能力同…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
