首页 > 其他分享 >如何在 Git 中安全撤销提交与更改

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

时间:2024-08-23 23:51:50浏览次数:12  
标签:reset git 更改 -- 撤销 Git 提交

文章目录


前言

在团队开发和个人项目中,代码变更是不可避免的。有时我们可能会提交错误的代码、误操作导致文件的更改,或者在合并分支时出现问题。这时候,了解如何撤销这些不必要的更改就显得尤为重要。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 来管理项目中的代码变更,确保代码库的整洁和稳定。

标签:reset,git,更改,--,撤销,Git,提交
From: https://blog.csdn.net/Huahua_1223/article/details/141365280

相关文章

  • 基于gitlab钩子的自动CICD构建
    基于GitLab的钩子(Webhook)设置自动化CI/CD构建流程,可以让代码在每次推送到GitLab仓库时自动触发Jenkins构建任务,从而实现持续集成和持续交付。以下是一个常见的基于GitLab和Jenkins的自动化CI/CD流程设置步骤:1.在GitLab中配置Webhook登录GitLab,并导航到......
  • 网站cms备案号位置怎么更改
    要更改网站CMS备案号的位置,通常需要通过编辑模板文件来实现。以下是一般的步骤:登录CMS后台:登录你所使用的CMS(例如织梦CMS、帝国CMS等)的后台管理界面。找到模板管理:在后台管理界面中找到“模板管理”或类似的选项。编辑模板文件:选择需要更改备案号位置的模板文件,......
  • usb请求块以及提交方式
    URB结构体structurb{/*private:usbcoreandhostcontrolleronlyfieldsintheurb*/structkrefkref;/*referencecountoftheURB*/void*hcpriv;/*privatedataforhostcontroller*/atomic_tuse_count;/*......
  • P9640 [SNCPC2019] Digit Mode
    思路:定义\(F(l,r)\)表示若已经确定了\([1,l-1]\)的数,且\([l,r]\)没有限制的贡献数。设\(n\)的长度为\(len\),考虑先求出\([1,i](i\lelen-1)\)的贡献(是没有限制的),那么每次枚举第\(1\)位数字\(a_1\in[1,9]\),算上\(F(2,i)\)的贡献即可。则该情况贡献和为:\[\su......
  • Git GUI与命令全能操作,转载
    Git命令基本操作 GitGUI全能基本操作看https://blog.csdn.net/chehec2010/article/details/89950964  gui目录1、版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库,目录下多了一个.git文件夹,此目录是Git用于管理版本库的,不要擅自改动里面的文件,这样会......
  • Windows11 Docker镜像存储路径更改(非C盘路径)
    前言基于WSL2安装docker后,在使用过程中会发现大量的docker镜像文件,使系统C盘容量激增,对电脑后续使用造成不便,所以需要在安装的时候,手动修改docker的镜像地址,使得镜像文件保存到另外的非系统盘中。原因最新的windows提供了新的虚拟化技术(WSL/WSL2),所以设置页面不能镜像的存储位......
  • git revert操作引起的代码丢失以及解决方案
    场景如下:某项目下有很多开发中的分支,比如分支a,b,c,d都合并到了一个test分支上;某次误操作将test分支内容合到了分支e上,然后紧接着又revert了这次合并,试图撤销合并;接着将分支e合并master上线;过了若干天,将master再合并到a,b,c,d分支上时,发现之前修改的代码被合并丢掉了。这时候你......
  • IDEA中使用git合并分支的过程报错:cant checkout because of unmerged files
    使用idea的git插件控制代码分支合并时,由于操作不当,报错了,控制台报错如下:cantcheckoutbecauseofunmergedfiles,youhavetoresolveallmergeconflictsbeforecheckout.仔细回想报错的起因,经过大概是这样的:首先,远程仓库里面的代码版本是很老了,而本地的代码版......
  • 使用SVN服务器和GIT服务器管理同一个项目
    1. 背景软件发布版本代码需要提交公司SVN,中间开发环节代码管理采用Git,同一套代码需要同时在两个服务器间进行同步。 2. 解决方案方案1:SVN与Git共存,该方案需要手动同步本地代码、SVN服务器代码、Git服务器代码;方案2:SVN作为Git的远程分支,该方案在库搭建完成后,可以使用git自......
  • Git 全套流程命令Command
    Git全套流程命令Command假设你已经在本地初始化了一个Git仓库,并且已经添加了远程仓库地址。1.初始化本地仓库如果你还没有初始化本地仓库,可以使用以下命令:gitinit2.添加远程仓库地址gitremoteaddorigin<remote-repository-url>例如:gitremoteaddorigi......