当前位置: 首页 > news >正文

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几个核心概念,和最常用的几个内容操作命令:

  1. reset
  2. diff
  3. restore、checkout
  4. stash
  5. reflog
  6. revert
  7. cherry-pick(merge、rebase)

前置概念

首先我们来看一下几个非常重要的前置概念

.git目录

git目录说明

git init

我们执行上面命令就会生成一个.git目录

git 工作区、暂存区、本地仓库

【工作区】add就到【暂存区】commit就到【本地仓库】

objects目录

git objects目录
objects目录中保存的是add到暂存区和commit到本地仓库的文件

refs目录

git refs目录

HEAD文件

HEAD是一个文本文件,你们内容是HEAD当前指向的分支:

ref: refs/heads/feature-view

reset

我们首先来看一下我们最常用的reset操作。

git reset操作示意图

reset是重置,他重置的是commit

git reset [–soft | --mixed | --hard] HEAD

  1. –mixed:默认参数,撤销commit,所有commit和没有commit的代码放到工作区
  2. –soft:撤销commit,所有commit和没有commit的代码放到暂存区
  3. –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个操作:

  1. 感觉自己的commit有点问题,想重新commit,这个也可以用git commit --amend
  2. 自己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 reflog

再使用git reset --hard回退到reset的上一个版本

git reset --hard 8ca4549

commit的内容回来了,但是工作区和暂存区的内容掉了,找不回了

revert(撤销指定提交)

revert是用来将某次的commit的内容,提取出来到工作区。

这样就可以重新编辑,然后再一次提交。

主要使用场景就是:发现自己某一次提交有点问题,但是在这次提交之前已经有其他人提交了,怎么办呢?

可以用revert

# 查看提交记录
git log --oneline
# 撤销指定的提交
git log revert b1c305d

git revert

revert并不会修改指定的commit,只会根据指定commit做逆操作

可以checkout到指定commit,看到内容并没有少:

git checkout -b feature-view b1c305d

revert相当于将指定的commit合并到当前的head,还可能冲突。

所以,通常来说还不说直接改。唯一的作用可能就是记不清楚的commit的内容的时候,可以revert能自动帮你做。

stash

stash最常用的场景2个:

  1. 我们切分支的时候,有时候有修改不能切,就可以stash暂存
  2. 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
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是有递进关系:

  1. 可以从暂存区撤回到工作区使用–staged参数(相当于add的逆操作)
  2. 可以直接丢弃工作区的修改
# 丢弃工作区的修改
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:

  1. merge合并代码,注意合并解决冲突就可以
  2. rebase,优化commit,注意修改的开始commit之后没有其他人的提交就可以(如果提示需要git push -f时一定要注意)
  3. cherry-pick是从其他分支挑选commit到当前分支

这里我们重点说一下cherry-pick,比如一个任务我已经开发了一段时间了,但是临时需要发一个修复版本,但是修复版本使用了我开发这段时间的代码,这么办呢?

这个时候就可以使用cherry-pick。

git cherry-pick说明
如果有冲突,先解决冲突:
git 解决冲突
继续cherry-pick:
git cherry-pick continue

# 首先切到指定分支
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 训练、指令微调&#xff0…...

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++代码实现

代码中实现&#xff0c;顺序表的初始化&#xff0c;插入&#xff0c;查找&#xff0c;删除 废话不多说&#xff0c;直接上 #include<iostream> using namespace std; #define eleType int struct SequentialList {eleType* elements;//指针int size;int capacity;//容量…...

将图片转换成base64格式

1.先创建一个canvas对象&#xff0c;然后给canvas对象设置图片对象的宽高&#xff0c;再调用canvas的getContext获取2d上下文对象&#xff0c;再调用上下文对象的drawImage方法&#xff0c;再通过canvase对象的toDataURL方法&#xff0c;将图片转换成base64格式的字符串 2.将b…...

征服ES(ElasticSearch)的慢查询实战

在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;进行大数据查询时&#xff0c;常常会由于多种因素而导致性能显著下降。接下来&#xff0c;我们将深入探讨几种常见情况及其相应的解决方案。 一、常见问题分析 深分页、大排序 大量数据扫描与多分片上的多次排序会严…...

如何才能从普通程序员转行AI大模型?

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

【番外】软件设计师中级笔记关于数据库技术更新笔记问题

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

【代码】约瑟夫问题——故事背景

Hello&#xff01;大家好&#xff0c;我是学霸小羊&#xff0c;今天先来讲讲约瑟夫问题的背景。 在古罗马时期&#xff0c;犹太历史学家约瑟夫斯领导犹太人反对罗马帝国的统治&#xff0c;并与罗马军队进行激烈的战斗。然而&#xff0c;在罗马军队的围困下&#xff0c;约瑟夫与…...

什么是事件冒泡和事件捕获

文章目录 1. 事件传播机制2. 事件冒泡&#xff08;Event Bubbling&#xff09;3. 事件捕获&#xff08;Event Capturing&#xff09;4. 事件冒泡和事件捕获的区别5. 阻止事件传播总结 事件冒泡和事件捕获是两种处理网页中事件传播的机制&#xff0c;特别是在 JavaScript 中处理…...

高端优质建站公司具备哪些优势?2024高端建站公司哪家好

从某种程度上讲&#xff0c;一个出色的建站公司需具备将无形的品牌价值巧妙转化为直观视觉元素的能力&#xff0c;这一转化过程极为考究&#xff0c;涵盖了设计的精细程度、色彩运用的巧妙以及空间布局的智慧&#xff0c;这些要素均不容忽视。 接下来考察网站的内容策划能力同…...

word删除空白页 | 亲测有效

想要删掉word里面的末尾空白页&#xff0c;但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01&#xff0c;按ENTER&#xff08;回车键&#xff09; 3.成功删除了&#xff01;&#xff01;...

YashanDB学习-服务启停

YashanDB学习-服务启停 1、查看YashanDB 当前实例状态和数据库名称2、使用 yasboot 工具启停YashanDB3、服务器重启后无法通过yasboot命令运维管理数据库4、正常关闭数据库的方式 数据库安装过程中将实例自动切换成OPEN阶段&#xff0c;并创建名为yashandb的数据库。 1、查看Ya…...

在未排序的整数数组找到最小的缺失正整数

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; &#x1f50d;【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&am…...

TCP连接管理机制:三次握手四次挥手

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 连接管理机制三次握手三次握手的目的三次握手的步骤第一次握手第二次握手第三次握手注意&#xff1a; 为什么建立连接是三次握手&…...

1022. 宠物小精灵之收服

思路 双层dp 代码 #include <bits/stdc.h> using namespace std;const int N 1010, mod 1e9 7;int n, m, k, x, y, z, ans, t; int w[N], f[N][N];void solve() {cin >> n >> m >> k;for (int i 1; i < k; i ){cin >> x >> y;f…...

人工智能生成内容(AI-Generated Content)

此外&#xff0c;ALGC还在影视剧本创作、音乐创作、设计与创意、虚拟助手与聊天机器人、教育与培训、新闻报道与文学创作等领域发挥着重要作用。 三、技术架构 ALGC产业生态体系通常呈现为上中下三层架构&#xff1a; 四、优势与挑战 优势&#xff1a; 挑战&#xff1a; 一、…...

深度学习:强化学习(Reinforcement Learning, RL)详解

强化学习&#xff08;Reinforcement Learning, RL&#xff09;详解 强化学习是机器学习的一个重要分支&#xff0c;它涉及到智能体&#xff08;agent&#xff09;通过与环境&#xff08;environment&#xff09;的交互学习如何做出决策。在强化学习中&#xff0c;智能体在不断…...

C语言笔记20

指针运算 #include <stdio.h>int main() {char ac[] {0,1,2,3,4,5,6,7,8,9,};char *p ac;printf("p %p\n", p);printf("p1%p\n", p1);int ai[] {0,1,2,3,4,5,6,7,8,9,};int *q ai;printf("q %p\n", q);printf("q1%p\n", q1)…...

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…...

selenium案例——爬取哔哩哔哩排行榜

案例需求&#xff1a; 1.使用selenium自动化爬虫爬取哔哩哔哩排行榜中舞蹈类的数据&#xff08;包括视频标题、up主、播放量和评论量&#xff09; 2.利用bs4进行数据解析和提取 3.将爬取的数据保存在本地json文件中 4.保存在excel文件中 分析&#xff1a; 1.请求url地址&…...