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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.04下GStreamer源码编译单步调试

前言 本文会通过介绍在linux平台下的GStreamer的源码编译和单步调试example实例。官网介绍直接通过命令行来安装gstreamer可以参考链接:Installing on Linux。 这种方法安装后,基于gstreamer的程序,单步调试的时候并不会进入到gstreamer源码…

API 接口封装技术详解

一、引言 在现代软件开发中,API(Application Programming Interface)接口的使用越来越广泛。封装 API 接口可以提高代码的可维护性、可扩展性和安全性。本文将详细介绍 API 接口封装的技术和方法。 二、API 接口封装的目的 提高代码的可维护…

5G band与子载波间隔 SSB pattern 和GSCN范围说明-FR1

本期给大家带来一个FR1的band号与SSB子载波间隔 SSB pattern以及对应的GSCN范围说明一下&#xff0c;希望能给研究5G的你带来帮助 NR band号子载波间隔SS Block patternGSCN范围n115 kHzCase A5279 – <1> – 5419n215 kHzCase A4829 – <1> – 4969n315 kHzCase …

李飞飞:不要数字孪生,要数字表兄弟,一张照片生成机器人训练场景

我们很多人都听说过数字孪生&#xff08;digital twin&#xff09;&#xff0c;在英伟达等公司的大力推动下&#xff0c;这种高效运营工作流程的方法已经在很多工业场景中得到应用。 但你听说过数字表亲&#xff08;digital cousin&#xff09;吗&#xff1f; 近日&#xff0…

HTML/JS添加音乐

HTML/JS添加背景音乐 由于需要避免浏览器不必要的资源消耗&#xff0c;音乐播放必须要有事件触发 文章目录 HTML/JS添加背景音乐htmljs手机浏览器自动播放 html 在body中添加你的音乐 <body> <audio autoplay"autopaly" loop"loop" id"audio…

2024年【浙江省安全员-C证】复审考试及浙江省安全员-C证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 浙江省安全员-C证复审考试是安全生产模拟考试一点通总题库中生成的一套浙江省安全员-C证证考试&#xff0c;安全生产模拟考试一点通上浙江省安全员-C证作业手机同步练习。2024年【浙江省安全员-C证】复审考试及浙江省…

vue3环境变量和模式

文章目录 一、vite文档介绍环境变量1.环境变量1.1创建文件 2.NODE_ENV 和 模式**2.1process.env.NODE_ENV&#xff08;Node.js 环境变量&#xff09;**2.2 **模式&#xff08;mode&#xff09;** 二、loadEnv获取环境变量&#xff08;针对在env文件夹下&#xff09;2.1创建环境…

FPGA图像处理之三行缓存

文章目录 一、前言二、FPGA实现三行缓存的架构三、Verilog代码实现四、仿真验证五、输入图像数据进行仿真验证 一、前言 在 FPGA 做图像处理时&#xff0c;行缓存是一个非常重要的一个步骤&#xff0c;因为图像输入还有输出都是一行一行进行的&#xff0c;即处理完一行后再处理…

【Golang】踩坑记录:make()创建引用类型,初始值是不是nil!!

文章目录 起因二、得记住的知识点1. make()切片&#xff0c;初始化了吗&#xff1f;2. make()切片不同长度容量&#xff0c;append时的差别3. 切片是指向数组的指针吗&#xff1f;4. 切片扩容时&#xff0c;重新分配内存&#xff0c;原切片的数据怎么办&#xff1f; 三、咳咳&a…

Linux 安装 JDK 环境

最近有小伙伴不怎么会在 Linux 服务器安装 JDK 环境&#xff0c;小格子给大家总结分享一下&#xff0c;下次直接看这篇文章就可以了。下面以 CentOS 为例。 1. 下载 JDK 安装包 由于 JDK1.8.202 是最后一个免费版本&#xff0c;建议下载此版本。由于在 Oracle 官方网站下载需…

JS | JS之元素偏移量 offset 系列属性详解

目录 一、offset 概述 定位父级 offsetParent 偏移量 offsetWidth offsetHeight offsetLeft offsetTop 计算页面偏移 注意事项 二、offset 与 style 区别 偏移offset 样式style 三、案例 ★ 案例&#xff1a;获取鼠标在盒子内的坐标 ★ 案例&#xff1a;模态框…

软件测试学习笔记丨Pytest的使用

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22158 1. 简介 pytest是一个成熟的全功能python测试框架测试用例的skip和xfail&#xff0c;自动失败重试等处理能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/ap…

2024互联网大厂营收排名:京东/阿里/华为前三,超多技术岗都在热招!

2024年已经过去一大半&#xff0c;各大互联网大厂的竞争如火如荼&#xff0c;营收都取得了不俗的成绩&#xff0c;京东、阿里、华为分别占领前三&#xff01; 第四第五名则为华为和拼多多。 根据排行榜里的公司名单&#xff0c;小码特意为大家整理了一批各大厂的招聘岗位。 阿…

super()和super().__init__()的解释

一、super 1.基本概念 在python继承当中&#xff0c;super()函数主要用在子类中调用父类的方法。它返回一个特殊对象&#xff0c;这个对象会帮我们调用父类方法 class Parent:def __init__(self, name):self.name namedef say_hello(self):print(f"Hello, Im {self.nam…

【论文#快速算法】Fast Intermode Decision in H.264/AVC Video Coding

目录 摘要1.前言2.帧间模式决策概览2.1 H.264/AVC中的帧间模式决策2.2 发现和动机 3.同质性和平稳性的确定3.1 同质性区域的确定3.2 稳定性区域的决定3.3 整体算法 4.实验结果4.1 IPPP序列的测试4.2 IBBP序列测试 5.结论 《Fast Intermode Decision in H.264/AVC Video Coding》…

基础数据结构——数组(动态数组,二维数组,缓存与局部性原理)

1.概述 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识 因为数组内的元素是连续存储的&#xff0c;所以数组中元素的地址&#xff0c;可以通过其索引计算出来&#xff0c;例如&…

C# 字符串处理与正则表达式

在C#中&#xff0c;字符串&#xff08;string&#xff09;是一个非常重要的数据类型&#xff0c;用于表示文本数据。C#提供了一系列丰富的方法和属性来处理字符串&#xff0c;包括拼接、截取、查找、替换、格式化等操作。 字符串拼接 可以使用运算符来拼接字符串。也可以使用St…

三、Linux 安装全攻略

Linux 安装全攻略 在当今的科技时代&#xff0c;Linux 操作系统以其稳定性、安全性和高度的可定制性而备受青睐。本文将详细介绍 Linux 的安装过程&#xff0c;包括关键步骤和下载资源获取方式&#xff0c;帮助你顺利踏上 Linux 之旅。 一、为什么选择 Linux Linux 有许多优…

HTTP协议基础

目录 HTTP是什么 HTTP请求&#xff08;get与post&#xff09; GET 方法&#xff1a; POST 方法&#xff1a; url的基本构成 常见的请求头与响应头 请求头&#xff08;Request Headers&#xff09; 响应头&#xff08;Response Headers&#xff09; HTTP相应码 100系…

生产力工具|vscode for mac的安装python库和使用虚拟环境(一)

一、在vscode中运行python代码&#xff08;mac或windows&#xff09; &#xff08;一&#xff09;在vscode中安装Python插件 若想在vscode中高效率的编辑Python代码&#xff0c;需要安装Python插件&#xff0c;点击下图中红框内的按钮&#xff1a; 然后在左上角的搜索框中输入…