git 使用(9)git pull和git fetch、git reset 和 git revert 的区别用法

Git reset 与 revert 的本质区别:本地重写 vs 公共冲销 Git 中的版本控制不仅是文件快照管理,更是协作环境下的历史账本机制。reset 通过移动 HEAD 指针重写本地提交历史,适用于未推送的修正场景;revert 则生成反向新 commit,保持历史线性与可审计性,是共享分支上安全回滚的唯一推荐方式。二者差异源于 Git 的分布式设计哲学:本地操作可塑,公共历史不可篡改。在数据工程、MLOps 和 CI/CD 流水线中,错误选用 reset 覆盖远程分支极易引发‘删库跑路’级事故,而 revert 结合 --no-commit 模式可实现可控预演。掌握 re 阅读详情

前面有学到git中的大部门知识,基本够用,但是,代码回滚也是平时遇到的最多的。这一节就来仔细的说下git中的比较容易搞混淆的几个命令:

git pull 和 git fetch, git reset 和 git revert。

git reset 和 git revert

reset根据这个英文单词的意思直译的就是重置,就是还原的意思,在git中也是一样,用来将HEAD指针还原(指向)到某个提交(commit)。他是还原一段的,也就是说,如果这个commit 在log的中间位置,那么这个commit 之后的提交有可能都会消失掉!所以这个命令是蛮危险的。

revert根据这个英文单词的意思直译的就是恢复,撤销。git里面,用来撤销某一次提交(commit) 。他只会撤销这一次提交,无论这个commit在log的哪个位置,不会影响上下的提交。而且他会将撤销的作为一个新的commit提交。

下面,举例子来说吧:

➜  shop git:(master) git log --oneline

git log 前面已经讲过,这个命令用来显示提交的log 记录,加上-- oneline 表示,在一行精简的显示log信息。

我在项目下运行下:

643a5ee 关闭老爷
3deb0e4 add 3
c755be6 new 
889b027 + 聊天窗口右侧公告样式.
896ccee 仓鼠日志
be3b53a Merge remote-tracking branch 'origin/dev' into dev
5921f2d 移动端

上面是一部分log。比如,我刚错误提交了关闭老爷(643a5ee)功能,这一步,我想撤销,怎么办呢?可以用上面的哪个命令呢?其实2个都可以用。

git reset 3deb0e4 或者 git reset HEAD~1把指针移动643a5ee到的上一次提交,就表示还原了。

或者git revert 643a5ee 表示撤销这次提交。也可以。

git reset 还原已经commit的用法

git reset 命令的使用最多的2种形式是:

git reset commitId
git reset –hard commitId

不加任何参数 表示是软重置,它会改变本地HEAD的指针, 指向3deb0e4, 并把643a5ee这一步的提交,还原到工作区,我们可以再加工或者其他的操作。所以它是非常安全的。

--hard commitId 强制移动指针到这个分支,会销毁它前面的所有的信息,本地也没有了,是蛮危险的一种行为。

我们分别试一下:

 ➜  shop git:(master) git reset 3deb0e4
Unstaged changes after reset:
M   1.php
➜  shop git:(master) ✗ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   1.php

no changes added to commit (use "git add" and/or "git commit -a")
➜  shop git:(master) ✗

它提示我们:
Unstaged changes after reset:
M 1.php

表示,643a5ee的提交已经被放入到工作区了。所以,我们可以重新修改后再提交。

我们再来试一下 --hard模式。

➜  shop git:(master) git log --oneline
a98bbd3 add 4
5ca7693 add 3
c755be6 new
➜  shop git:(master) git reset --hard 5ca7693
HEAD is now at 5ca7693 new
➜  shop git:(master) git status
On branch master
nothing to commit, working directory clean
➜  shop git:(master)
➜  shop git:(master) git log --oneline
5ca7693 add 3
c755be6 new

可以看出,我们,加上--hard后,它把本地的修改也给还原了,所有要慎重加。

git reset命令还原暂缓区的用法

就是把暂缓区的修改还原到工作区,加入到暂缓区就是你已经使用git add命令了,那么用这个命令也可以的。

➜  shop git:(master) vi 1.php
➜  shop git:(master) ✗ git add --all
➜  shop git:(master) ✗ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   1.php

➜  shop git:(master) ✗

上面命令修改后加入到了暂缓区,那么我们就可以使用它提示的命令将这个文件或者所有的文件全部移除暂缓区到工作区:

➜  shop git:(master) ✗ git reset HEAD
Unstaged changes after reset:
M   1.php
➜  shop git:(master) ✗ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   1.php

no changes added to commit (use "git add" and/or "git commit -a")
➜  shop git:(master) ✗

上面就成功将缓存区的修改还原到了工作区了。

总结下:

如果暂缓区是干净的,可以用 git reset HEAD~ 或者 {id} 还原到上一次 或者 几次前 的修改,加 –hard 强制还原。

如果暂存区有数据没有commit,用git reset HEAD {file} 来移除暂缓区。

git revert 命令移除某一次提交

git revert命令就温和的多,它仅仅是移除这个commit,而不是将指针移动到这个分支,所以这个命令常常用来会滚操作。

我们继续实验:我们继续修改这个文件,

~ shop git:(master) git log --oneline
79a2501 add 5
f56215c add 4
5ca7693 add 3
c755be6 new

我现在想将5ca7693 add 3这个修改移除掉,注意,它在log的中间,用git reset命令会不太好使。那么用git revert就很好了。

➜  shop git:(master) git revert 5ca7693

Revert "add 3"

This reverts commit 5ca76938b4ec5313aa7a3260bcdb802d3a767e73.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       modified:   1.php
#

确定推出后,就会成功了:

➜  shop git:(master) git revert 5ca7693
[master 39268a5] Revert "add 3"
 1 file changed, 1 deletion(-)

我们看了下内容,确实将3给删除掉了,而且还重新提交了一次

➜  shop git:(master) git log --oneline
39268a5 Revert "add 3"
79a2501 add 5
f56215c add 4
5ca7693 add 3
c755be6 new

git fetch

 download new branches and data from a remote repository.
 可以git fetch [alias]取某一个远程repo,也可以git fetch --all取到全部repo
 fetch将会取到所有你本地没有的数据,所有取下来的分支可以被叫做remote branches,它们和本地分支一样(可以看diff,log等,也可以merge到其他分支),但是Git不允许你checkout到它们. 

git pull

 fetch from a remote repo and try to merge into the current branch.
 pull == fetch + merge FETCH_HEAD
 git pull会首先执行git fetch,然后执行git merge,把取来的分支的head merge到当前分支.这个merge操作会产生一个新的commit.    
 如果使用--rebase参数,它会执行git rebase来取代原来的git merge.

http://blog.csdn.net/hudashi/article/details/7664460

http://hittyt.iteye.com/blog/1961386

http://www.douban.com/note/189603387/

Git五大核心命令本质区别:rebase/merge/stash/revert/reset场景决策指南 Git 是基于有向无环图(DAG)的对象数据库系统,其核心操作本质是对 HEAD、Index 和 Object Database 三大结构的指针移动或对象创建。理解 commit 对象的不可变性、分支的引用语义及历史重写的安全边界,是掌握版本控制的关键基础。rebase 通过复制提交实现历史线性化,适用于本地未推送的提交整理;merge 则创建新节点记录协作事实,保障多人开发可追溯性;stash 作为临时快照机制,不生成 commit 对象,仅在本地暂存工作区与暂存区状态;revert 以‘加法’方式安全撤 阅读详情

相关推荐

【GIT】git个人笔记

GIT个人手册 版本 日期 修订内容 作者 V01 2019-06-25 初稿 备注: 使用中不断迭代完善,其他人使用中有其他总结的,可以补充。 目录 第一章说明 一.1.1GIT 中文手册 一.1.2git仓库说明(工作区、暂存区、本地仓、远程仓)1 一.1.3git仓库说明(工作区、暂存区、本地仓、远程仓)2...

小鱼菜鸟的博客 1198

【git】reset,revert,fetch,pull,merge,rebase等命令的比较

git fetch和git pull git fetch:相当于是从远程获取最新版本到本地,不会自动merge git fetch origin master git merge origin/master git pull:相当于是从远程获取最新版本并merge到本地,相当于git fetch 和 git merge git pull origin master git merge和git rebase git merge:merge master,即将origin中和当前版本进行合并,创建一..

HNUJSY 1100

Git撤销合并实战指南:revert -m 1与快进合并回退

Git撤销合并是分布式协作中保障历史可审计、操作可追溯的核心能力。其本质在于区分快进合并(无merge commit,需reflog+reset)与三方合并(含双父提交,须用git revert -m 1精准反向)。技术价值在于不破坏commit history,兼容CI/CD与团队协同,避免强制推送引发的协作断裂。典型应用场景包括线上故障应急、集成测试失败回滚及多人并行开发中的安全修正。本文聚焦生产级落地路径,详解如何通过git cat-file -p验证父提交、用reflog定位快进前状态,并规避git

weixin_34112181的博客 603

【git】git 各种区别记录|pull和--rebase| reset和checkout

使用下面的关系区别这两个操作: git pull = git fetch +git merge git pull --rebase = git fetch + git rebase git pull = git fetch+ git merge FETCH_HEAD git pull --rebase = git fetch + git rebase FETCH_HEAD 差距就在git fetch之后的操作: 现在来看看git me...

我的笔记本 3333

Plant Simulation 实战指南:从二次分配问题到优化布局设计

本文是一份Plant Simulation实战指南,详细讲解了如何利用该仿真软件解决工厂布局中的二次分配问题。通过从数据准备、模型搭建到集成遗传算法进行自动化优化的完整流程,帮助工程师在数字孪生环境中高效寻找最优设备布局方案,从而显著降低物流成本,提升生产效率。

i1j2k的博客 559

网闸的基本配置

本文详细介绍了网闸的基本配置流程,包括物理连接与初始化、网络基础配置、核心数据交换策略配置、安全增强配置、管理与运维以及测试验证等关键步骤。网闸通过在物理隔离环境下建立"数据摆渡通道",实现特定业务数据的安全交换。配置时应遵循最小化、单向化、内容控制和审计原则,确保只开放必要通道,优先采用单向传输,进行内容安全检查并记录操作日志。不同厂商网闸的配置界面可能不同,但核心逻辑是相通的。

qq_39980997的博客 1827

git中push和pull的区别是什么

git中push和pull的区别,push命令的matching方式与simple方式的区别

lwx33912138的博客 4313

Clion+platformIO开发ESP32时找不到lib文件中引入第三方库的头文件(头文件下有波浪线),实际编译是成功的解决方法

Clion+platformIO开发ESP引入第三方库文件编译器无法找到.h文件但编译成功

zs5218的博客 1847

git 笔记/常见命令/as的fetch,pull ,update project的区别/标签管理

git

qq_33552379的博客 7433

ADNI数据集下载(详细)

刚刚接触到这个数据集的时候比较头疼,用了好长的时间才把下载过程和预处理过程弄明白。需要发送电子邮件给官方平台,收到回信后才能够下载到数据集。 1、ADNI账号注册 第一步:搜索百度打开ADNI 第二步,点击ADTA&amp;amp;SAMPLES 第三步:一直将鼠标往下拉 点击ADNI,进入里面填写信息。需要填写的信息还是挺多的,耐心填写,再等到邮件回复就可以了 2、ADNI数据集下载 登录申请的邮...

蜗牛遥遥 3万+

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9908

git pull 和 git pull --rebase

git pull的默认行为是git fetch + git merge, git pull --rebase则是git fetch + git rebase. 从目的来说,两者没差别,运行之后, 你能获得一样的code base。 但从版本管理角度,这两者有各自的使用意义。 git merge: 简单来说,它把两条不同分支历史的所有提交合并成一条线,并在“末端”打个结,即生成一

vtion001的专栏 1878

pytorch-cifar100学习资料汇总 - 基于PyTorch的CIFAR-100图像分类实践

pytorch-cifar100是一个基于PyTorch实现CIFAR-100数据集图像分类的开源项目。该项目实现了多种经典的深度学习网络模型,如ResNet、DenseNet、VGG等,为开发者提供了在CIFAR-100数据集上进行图像分类实验的代码范例。pytorch-cifar100项目为我们提供了在CIFAR-100数据集上进行图像分类实验的完整代码实现。无论你是想要学习PyTorch的使用,还是研究不同网络模型在CIFAR-100上的表现,这个项目都是一个很好的起点。

helloaiworld的博客 1113

Git fetch和pull系列命令完全指南

​​和​​​仅从远程仓库下载最新的提交记录和文件,但不会自动合并到本地分支。它会更新本地的远程分支引用(如origin/master),但不影响当前工作目录。这相当于给了你一个缓冲区,可以先查看远程变更再决定是否合并。​​实际上是的组合,它会自动将远程分支的更新合并到当前分支。如果配置了,则会使用git rebase代替git merge。

Rysxt_的博客 908

ROS2 Nav2 - 模型预测路径积分控制器(MPPI)

这是一个预测控制器(局部轨迹规划器),用于实现模型预测路径积分(MPPI)算法,以跟踪具有自适应避障功能的路径。它包含基于插件的 critic 函数,可影响算法的行为。它由 Aleksei Budyakov 创建,由 Steve Macenski 为 Nav2 进行改编和开发。该插件实现了 nav2_core::Controller(控制器)接口,可在整个导航堆栈中作为控制器服务器的动作服务器(controller_server)中的局部轨迹规划器使用。据测定,该控制器可在中等英特尔处理器(第四代 i5)上

机器人控制与仿真应用 3898

大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

寻道AI,探索AI无限可能! 6831

git操作代码流程:add/commit/push/checkout/reset/revert/pull/fetch/update

1、代码操作步骤图: 其中, 名称 解释 Workspace 工作区 Index / Stage 暂存区 Repository 仓库区(或本地仓库) Remote 远程仓库 2、代码提交方式—add/commit/push 1)add(由工作区提交到暂存区) 命令行:git add -A 提交所有变化 ...

dsydly的博客 534

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

git 基础知识

本文系统介绍Git核心概念与操作,涵盖三大分区(工作区、暂存区、版本库)、基本命令(克隆、拉取、提交、日志、撤销恢复)、分支管理及合并策略。重点讲解git reset与git revert的区别,强调rebase慎用原则,并推荐提交规范与学习资源,适合初学者快速掌握Git实战技能。

青蛙king的博客 9992

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

git用法总结

当前工作区有修改,但是需要切换到其它分支做事情,可以用git栈先存起来,否则checkout时会丢失非暂存区内的内容,等切换回来后再拿出来,git栈是全局的。功能上来看都是进行分支的合并,merge会保留原来的分支结构并产生一个新的提交记录,rebase是进行变基,把一个分支的提交在处理冲突后移到另一个分支后面,HEAD 是一个对当前所在分支的符号引用 —— 也就是指向正在其基础上进行工作的提交记录,用。把暂存区的内容提交到本地仓库,然后清空暂存区用于下一次的提交。git的基本操作可以用下面的图来表示。

m0_56049283的博客 1242

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

git pull 是到工作区还是暂存区_git知识总结-2.git基本操作之原理说明,简单对比git pull和git pull --rebase的使用,git checkout 命令详解...

0.前言本文主要对git常用命令的工作原理做一个详细的说明,常用命令主要包括:1.git addgit add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。2. git commitgit commit主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。3. git branch关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作...

weixin_35260789的博客 509

Git撤销提交完全指南:reset、revert与amend实战

版本控制是软件开发的基础设施,Git作为分布式版本控制系统,其核心在于通过指针移动和提交追加来管理代码历史。理解Git的三区模型(工作区、暂存区、版本库)是掌握撤销操作的关键。git reset通过移动分支指针实现时间倒流,git revert通过追加反向提交实现安全抵消,git commit --amend则替换最后一次提交。这些技术价值在于帮助开发者高效管理代码变更,避免因误操作导致团队协作混乱。在个人分支开发、团队协作、紧急修复等场景中,合理选择撤销方式能显著提升工程效率。本文深入解析Git撤销提交的

weixin_33912638的博客 244

Git 快速上手

Git 是一款由 Linux 之父 Linus Torvalds 于 2005 年开发的免费、开源的分布式源码管理(SCM,Source Code Management)工具,也称为版本控制系统(VCS,Version Control System),最初的目的是为了管理 Linux 内核的开发。

Doublelv 的博客专栏。 6249

Git撤销提交完全指南:reset、revert与push回退实战

版本控制中,撤销提交是高频操作,涉及工作区、暂存区与版本库的协同。Git通过移动HEAD指针或创建反向提交实现回退,核心命令包括git reset、git revert和git commit --amend。理解其原理可避免历史混乱,技术价值在于安全修正错误、保持协作流畅。典型场景有本地误提交、已推送提交撤销及多分支协作。本文围绕Git撤销提交、git reset、git revert、撤销commit和撤销push,系统梳理适用场景与操作细节,助你精准选择方案。

weixin_33802505的博客 369

在Git中的fetch的使用[拉取最新的远程的代码]

理解 fetch 的关键, 是理解 FETCH_HEAD,FETCH_HEAD指的是: 某个branch在服务器上的最新状态’。这个列表保存在 .Git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支。 当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支. 一般来说, 存在两种情况: 如果没有显式的指定远程分支, 则远程分支的master将作为默认的...

徐小冠 7465

git部分关键点说明

【git reset,git revert,git checkout】 git reset与revert一般用来撤销commit或push,非特殊情况不得已时建议不用。git reset,针对“工作区、暂存区、索引区”(倒序覆盖代码),默认表示git reset --mixed(都可以后边再加个“空格commitId”来指定,特别的如果是HEAD就等于没写,注意跟HEAD^不同),做两件事一是索引区退回(到指定id)二是进而让暂存区退回;如果不是mixed而是soft,只做一件事就是索引区退回;如果不是m

xy100xy100xy100的博客 381
上一篇: 欢迎使用CSDN-markdown编辑器
下一篇: nginx的配置、虚拟主机、负债均衡和反向代理(3)
domorejojo
博客等级 码龄17年 223粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值