如何在 Git 中安全撤销提交与更改

news2024/9/22 3:52:54

文章目录

  • 前言
  • 一、Git Reset
    • 1. --soft:保留变更在暂存区
    • 2. --mixed(默认选项):保留变更在工作区
    • 3. --hard:彻底丢弃所有变更
  • 二、Git Revert
    • 1. 撤销单个提交
    • 2. 撤销多个提交
    • 3. 撤销合并提交
  • 三、实际例子
  • 总结


前言

在团队开发和个人项目中,代码变更是不可避免的。有时我们可能会提交错误的代码、误操作导致文件的更改,或者在合并分支时出现问题。这时候,了解如何撤销这些不必要的更改就显得尤为重要。Git 提供了一系列强大的命令来处理不同场景下的变更撤销操作。在本文中,我们将详细介绍 git resetgit revert 的使用方法,并通过实际例子帮助你选择合适的操作方式,以便安全、快速地恢复代码状态。
在这里插入图片描述


一、Git Reset

git reset 是一个非常强大的命令,可以用于撤销提交、修改暂存区的内容,以及恢复工作区中的文件,原来指向的提交记录就跟从来没有提交过一样。根据不同的选项,git reset 可以有不同的效果,适用于不同的场景。
在这里插入图片描述

1. --soft:保留变更在暂存区

  • 场景:当你已经提交了代码,但想要撤销这个提交,同时保留所有变更在暂存区中,以便可以重新提交或修改提交信息。
  • 效果:将当前分支的指针(HEAD)移动到上一个提交,暂存区的文件保持不变,允许你对这些文件进行进一步操作。
git reset --soft HEAD~1

2. --mixed(默认选项):保留变更在工作区

  • 场景: 当你希望撤销最近的提交,并且将这些更改从暂存区移除,但保留在工作区中。
  • 效果: 将当前分支的指针移动到上一个提交,同时将暂存区的内容重置为该提交的状态,但工作区中的更改仍然存在。你可以进一步检查这些更改,然后决定如何处理。
git reset --mixed HEAD~1

3. --hard:彻底丢弃所有变更

  • 场景: 当你希望完全撤销最近的提交和所有未提交的变更,不保留任何修改。
  • 效果: 将当前分支的指针、暂存区和工作区都恢复到上一个提交的状态,所有的更改将被彻底丢弃。使用这个命令时要特别小心,以免丢失重要的工作。
git reset --hard HEAD~1

二、Git Revert

git revert 是另一种常用的撤销方法,它的特点是通过创建一个新的提交来反转之前的提交,而不会直接修改提交历史。这使得 git revert 非常适合在已经推送到远程仓库的提交上使用,特别是在团队协作中。

1. 撤销单个提交

  • 场景: 当你发现最近的一次或某个历史提交中有错误,需要撤销该提交的更改,但保留提交历史。
  • 效果: 生成一个新的提交,内容是对 <commit_hash> 所指向的提交的反转。这个新提交将被添加到当前分支的末尾,历史记录将完整保留,并且撤销操作是可追踪的。

在这里插入图片描述
假设C2的<commit_hash>e5f6g7h8,运行下面的命令会得到

git revert e5f6g7h8

在我们要撤销的提交记录后面居然多了一个新提交,是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。也就是说 C2' 的状态与 C1 是相同的。
在这里插入图片描述

2. 撤销多个提交

  • 场景:当不止撤销一个提交时,要撤销多个连续的提交
  • 该命令会依次对从 <start_commit_hash> (不包括)到 <end_commit_hash> (包括)之间的每一个提交进行反转,并创建对应的新提交。
git revert <start_commit_hash>..<end_commit_hash>

3. 撤销合并提交

  • 场景: 在处理合并时,如果发现合并有误,需要撤销合并提交,但保留分支的其余部分。
  • 效果: 这个命令将撤销指定的合并提交,同时保留一个父分支的内容。-m 1 参数指定了要保留的父分支编号(通常为 1),这确保了合并的另一部分内容不会被撤销。
git revert -m 1 <merge_commit_hash>

三、实际例子

当不小心推送了不能上传的文件到远程仓库中,直接删除记录该怎么删掉呢,使用git revert会保留历史记录,那我们只能使用git reset来“改写历史”

  1. 用以下git log命令查看要撤回的提交哈希是什么,输出的commit 后跟着的字符串就是版本号
commit 91089df9cc4581d82d454a16fc15b8501d239128
  1. --hard参数将本地仓库回滚到之前某版本,此时本地已经回滚,远程仓库还未回滚
git reset --hard 版本号
  1. --force (或 -f): 强制推送选项。这会覆盖远程仓库的提交历史,即使本地分支的提交历史不是远程分支的子集也会强制推送。也就可以将本地仓库的历史直接覆盖掉远程仓库的历史
git push -f 

注意:强制推送会覆盖远程仓库的现有内容,因此团队成员的提交可能会丢失。确保所有相关人员已经备份或同意这个操作。如果其他人已经从远程仓库拉取了代码,强制推送可能会导致他们的本地分支和远程分支不一致。


总结

撤销变更是 Git 日常使用中的一项重要操作。无论是通过 git reset 重置提交历史,还是使用 git revert 创建新的反转提交,这些命令都能帮助我们在不同的场景中有效地处理代码问题。在进行这些操作时,理解每个命令的作用和潜在影响尤为重要,特别是在团队协作环境中。希望通过本文的讲解,你能够更加熟练地使用 Git 来管理项目中的代码变更,确保代码库的整洁和稳定。

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

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

相关文章

你知道手机零部件尺寸检测的重要性吗?

手机零部件作为手机制造行业的基础&#xff0c;其品质的优劣直接关系到行业的发展&#xff0c;所以加强手机精密零部件尺寸检测非常重要。如今&#xff0c;手机零部件变得更加精细&#xff0c;对质量的要求也在不断提高&#xff0c;随着生产规模逐渐扩大&#xff0c;传统的检测…

java ssl使用自定义证书

1.证书错误 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 2.生成客户端证书 openssl x509 -in <(openssl s_client -connect 192.168.11.19:8101 -prexit 2>/dev/null) -ou…

C语言 | Leetcode C语言题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; typedef struct {int tweetId;int userId; } Tweet;typedef struct {int* dict[501];Tweet* tweetList;int tweetListLen; } Twitter;Twitter* twitterCreate() {Twitter* obj malloc(sizeof(Twitter));for (int i 0; i < 501; i) {ob…

【Linux】 gdb-调试器初入门(简单版使用)

&#x1f525;系列文章&#xff1a;《Linux入门》 目录 一、背景 二、什么是GDB &#x1f337;定义 &#x1f337;GDB调试工具---提供的帮助 三、GDB的安装教程-Ubuntu &#x1f337;gdb的安装 四、哪类程序可被调试 &#x1f337;程序的发布方式 &#x1f337;Debug版…

力扣 | 背包dp | 279. 完全平方数、518. 零钱兑换 II、474. 一和零、377. 组合总和 Ⅳ

文章目录 一、279. 完全平方数二、518. 零钱兑换 II三、474. 一和零四、377. 组合总和 Ⅳ 一、279. 完全平方数 LeetCode&#xff1a;279. 完全平方数 朴素想法&#xff1a; 这个题目最简单的想法是&#xff0c;可以用 O ( n n ) O(n\sqrt{}n) O(n ​n)的动态规划解决&#x…

OpenCV几何图像变换(1)映射转换函数convertMaps()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像变换映射从一种表示形式转换为另一种表示形式。 该函数将用于 remap 的映射对从一种表示形式转换为另一种表示形式。以下选项 ((map1.type…

车辆类型检测算法、车辆类型源码及其样本与模型解析

车辆类型检测算法是利用计算机视觉和深度学习技术&#xff0c;对车辆图像进行自动分析和识别&#xff0c;以判断车辆的类型&#xff08;如轿车、SUV、货车等&#xff09;的一种算法。以下是对车辆类型检测算法的详细解析&#xff1a; 一、算法基础 车辆类型检测算法的基础是图…

区间预测|基于长短期记忆网络LSTM分位数单变量时间序列区间预测Matlab程序QRLSTM

区间预测|基于长短期记忆网络LSTM分位数单变量时间序列区间预测Matlab程序QRLSTM 文章目录 前言区间预测|基于长短期记忆网络LSTM分位数单变量时间序列区间预测Matlab程序QRLSTM 一、QRLSTM模型1. 基本原理1.1 LSTM (Long Short-Term Memory)1.2 量化回归&#xff08;Quantile …

移动端GenAI应用的崛起:从市场规模到成功案例分析

随着生成式人工智能&#xff08;GenAI&#xff09;技术的飞速发展&#xff0c;移动应用市场正经历一场前所未有的变革。从图像编辑到聊天机器人&#xff0c;这些基于AI的应用不仅满足了用户日益增长的需求&#xff0c;也为企业带来了巨大的商业机遇。本文将探讨这一领域的最新趋…

网站建设中:高效利用Robots.txt文件的策略与实践

原文&#xff1a;网站建设中&#xff1a;高效利用Robots.txt文件的策略与实践 - 孔乙己大叔 (rebootvip.com) 在网站中使用robots.txt文件是一种控制搜索引擎爬虫访问网站内容的方法。以下是关于如何在网站中使用robots.txt的详细步骤和注意事项&#xff1a; 一、创建robots.t…

集团数字化转型方案(四)

集团数字化转型方案通过全面部署人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;技术&#xff0c;创建了一个智能化的企业运营平台&#xff0c;涵盖从业务流程自动化、实时数据监控、精准决策支持&#xff0c;到个性化客户服务和高…

PV、UV、IP:网站流量分析的关键指标

原文&#xff1a;PV、UV、IP&#xff1a;网站流量分析的关键指标 - 孔乙己大叔 (rebootvip.com) 摘要&#xff1a; 在浩瀚的互联网海洋中&#xff0c;PV&#xff08;Page View&#xff0c;页面浏览量&#xff09;、UV&#xff08;Unique Visitor&#xff0c;独立访客数…

Eclipse SVN 插件在线下载地址

Eclipse SVN 插件 Subversive 在线安装 1、选择help下的install new software 2、点击 add 3、Name随便写&#xff0c;Location输入&#xff1a; https://download.eclipse.org/technology/subversive/4.8/release/latest/ 点击Add 4、然后一直下一步&#xff0c;Finish&am…

【QT】——1_QT学习笔记

一、QT是什么&#xff1f; QT 是一个功能强大、应用广泛的跨平台 C 应用程序开发框架&#xff0c;它不仅提供了丰富多样、美观实用的图形界面组件&#xff0c;还具备高效灵活的信号与槽通信机制&#xff0c;能够帮助开发者轻松构建出复杂且性能优越的应用程序&#xff0c;广泛…

VS Code中基于MSTest编写和运行测试

MS Test&#xff08;Microsoft Test Framework&#xff09;是微软提供的一个用于.NET应用程序的单元测试框架。以下是一个使用MS Test进行单元测试的示例&#xff0c;该示例将涵盖测试的基本步骤和概念。 项目搭建 在VS Code中开发C#时&#xff0c;创建solution&#xff08;解…

AI绘画Stable Diffusion画全身图总是人脸扭曲?ADetailer插件实现一键解决!商业级AI人物生成教程

大家好&#xff0c;我是灵魂画师向阳 你是否遇到过SD生成的人物脸部扭曲、甚至令人恶心的情况&#xff1f;也曾感到束手无策&#xff1f;别担心&#xff0c;这份教程专为你而来。 在使用SD生成人物全身照时&#xff0c;你可能经常发现人物的脸部会出现扭曲问题。这是因为人物…

整体思想以及取模

前言&#xff1a;一开始由于失误&#xff0c;误以为分数相加取模不能&#xff0c;但是其实是可以取模的 这个题目如果按照一般方法&#xff0c;到达每个节点再进行概率统计&#xff0c;但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…

如何在IIS中为typecho博客启用HTTPS访问

在上篇文章中&#xff0c;介绍了如何安装typecho博客系统&#xff0c;默认是没有启用https访问的&#xff0c;这篇文章介绍如何 在IIS中开启 https访问。 开启https访问需要两个步骤&#xff1a; 1、申请 一个ssl证书&#xff0c;我这里以阿里云上面的申请流程为例。其它云服务…

[Linux网络】基本网络命令socket编写TCP应用层实现简易计算器

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们在上篇博客中学习了使用socket套接字完成了UDP的网络编程&#xff0c;今天我们继续使用套接字完成TCP的学习。 首先我们先来了解一些网络指令&#xff0c;让大家可以在实现网络编程后查看一些与网…

勇闯机器学习(第五关--中文文本特征提取)

以下内容皆为原创&#xff0c;制作实属不易&#xff0c;请点点关注和赞赞❥(^_^) 第一关&#xff1a;机器学习概念和流程http://t.csdnimg.cn/IuHh4第二关&#xff1a;数据集的使用http://t.csdnimg.cn/2jsdi第三关&#xff1a;特征工程-字典特征提取http://t.csdnimg.cn/ZpMt…