git reset 介绍、作用 和 应用场景

news/2024/12/24 11:39:08/文章来源:https://www.cnblogs.com/miracle-luna/p/18548928

git reset 是 Git 中一个非常重要且强大的命令,用于撤销或重置当前分支的状态。它可以修改版本历史记录,操作暂存区(staging area),以及工作目录(working directory)。根据使用的选项不同,git reset 的行为也有所不同。

git reset 的作用

git reset 可以执行以下操作:

  1. 撤销暂存区的更改:取消已加入暂存区(即 staged)的文件。
  2. 撤销工作目录的更改:将工作目录中的文件恢复到某个指定的提交状态。
  3. 修改分支历史:通过改变分支的 HEAD 指针,来修改历史提交。

git reset 的类型

git reset 有三个主要选项,这些选项决定了命令对工作目录、暂存区和分支历史的影响:

  1. --soft:只重置 HEAD 指针,保留暂存区和工作目录不变。

    • 这个选项用于撤销提交(commit),但保留修改过的文件在暂存区。
    • 用途:如果你提交了某些内容,但想重新提交(例如修改提交信息),可以使用 --soft
    git reset --soft <commit>
    
  2. --mixed(默认选项):重置 HEAD 指针,并将暂存区的内容恢复到与该提交一致,但不修改工作目录。

    • 这个选项会撤销暂存区中的文件变化,但是工作目录中的文件修改仍然保留。
    • 用途:如果你想撤销暂存(stage)操作,但保留文件内容进行修改,使用此选项。
    git reset --mixed <commit>
    
  3. --hard:重置 HEAD 指针,暂存区和工作目录都会恢复到指定的提交状态,丢弃所有未提交的更改。

    • 这个选项会彻底丢弃本地的更改,工作目录和暂存区都被重置为指定的提交。
    • 用途:当你确定不再需要本地更改时,可以使用 --hard 来丢弃所有修改,恢复到指定提交。
    git reset --hard <commit>
    

git reset 的常见应用场景

  1. 撤销暂存区的更改
    假设你执行了 git add 将某个文件添加到了暂存区,但是后来决定不提交它,你可以使用 git reset 撤销该文件的暂存操作:

    git reset <file>
    

    这会将 <file> 从暂存区移除,但工作目录中的更改仍然保留。

  2. 撤销最近的提交并修改提交内容
    如果你最近做了一次提交,但想要修改提交内容或者提交信息,可以使用 git reset --soft 回到上一个提交,并保留你的更改在暂存区。

    git reset --soft HEAD^
    

    这样,你就可以对已提交的更改重新进行修改或合并提交。

  3. 丢弃本地的更改并回到某个提交状态
    当你做了一些不必要的更改,或者试验性修改,并且决定放弃这些更改时,可以使用 git reset --hard 来恢复到某个提交的状态。

    git reset --hard <commit>
    

    这种方式将清除工作目录和暂存区中的所有更改,恢复到指定的提交。

  4. 回退到某个历史提交
    如果你想要撤销某次提交,并且不希望其出现在历史中,可以使用 git reset --hardgit reset --mixed 来回退到某个提交。注意,使用 --hard 选项会丢弃工作目录中的所有更改。

    git reset --hard <commit>
    
  5. 重新组织提交(交互式 rebase 的替代方式)
    你可以通过 git reset --soft 来撤销某个提交,然后合并多个提交或修改历史。在一些场景下,可以将 git reset 用作交互式 rebase 的替代方法来整理提交。

注意事项

  • 避免在共享分支上使用 git reset --hard:如果你已经将更改推送到远程仓库,使用 --hard 回退到某个提交会改变历史,可能会导致其他协作者的工作丢失。一般来说,git reset --hard 适用于本地分支,且未推送到远程时使用。
  • git reset --softgit reset --mixed 不会影响历史:这两个选项不会删除历史提交,只是调整 HEAD 的指向。它们适用于暂存区和工作目录的调整。

总结

git reset 是一个非常强大的工具,可以让你撤销某些 Git 操作,调整分支历史,修改暂存区和工作目录。其常见的应用场景包括撤销已暂存的更改、修改最近的提交内容、丢弃本地修改等。理解其不同选项的作用,可以帮助你灵活高效地管理 Git 仓库。

===================

git reset 介绍

git reset 是 Git 中用来回滚代码、更新分支指针和更改文件状态的命令。它是一个非常强大的工具,可以用来撤销提交、修改暂存区内容或工作区内容。


git reset 的作用

  1. 回滚提交记录:将分支的 HEAD 指针移到一个特定的提交记录。
  2. 修改暂存区内容:将暂存区(staging area)的文件与指定提交同步。
  3. 更新工作区内容:将工作区的文件恢复到指定提交的状态。

git reset 支持三种主要模式:

  • --soft:仅移动 HEAD 指针,不改变暂存区和工作区。
  • --mixed(默认):移动 HEAD 指针,同时重置暂存区,但不改变工作区。
  • --hard:移动 HEAD 指针,同时重置暂存区和工作区。

git reset 的应用场景

  1. 撤销最近的提交但保留代码--soft 模式):

    • 当你提交了代码,但发现提交信息有误或需要追加修改时。
    • 示例:
      git reset --soft HEAD~1
      # 撤销最近一次提交,保留代码在暂存区中
      
  2. 从暂存区移除文件--mixed 模式):

    • 当你误将文件添加到暂存区,需要将其移回工作区。
    • 示例:
      git reset HEAD file.txt
      # 取消暂存 file.txt,但保留工作区的修改
      
  3. 回滚到指定提交--mixed 模式):

    • 当需要回到历史某次提交并重新开始工作,而不影响工作区的文件。
    • 示例:
      git reset --mixed <commit-id>
      # HEAD 指针移到 <commit-id>,暂存区重置为该状态,保留工作区的修改
      
  4. 完全回滚到指定提交--hard 模式):

    • 当需要彻底回到某次提交状态,丢弃暂存区和工作区所有后续的更改。
    • 示例:
      git reset --hard <commit-id>
      # HEAD 指针移到 <commit-id>,暂存区和工作区都重置到该提交的状态
      
  5. 丢弃最近的提交和更改--hard 模式):

    • 当最近的提交和更改都是错误的,想完全丢弃。
    • 示例:
      git reset --hard HEAD~1
      # 丢弃最近一次提交及其更改
      
  6. 清除未提交的临时代码

    • 当你修改了文件但发现需要从历史版本重新开始,可以使用 --hard 重置工作区。
    • 示例:
      git reset --hard
      # 将工作区和暂存区恢复到最近一次提交的状态
      

git reset 与其他命令的对比

命令 作用 场景
git reset 重置提交、暂存区或工作区到指定状态 回滚提交、更改暂存区内容、撤销工作区修改
git revert 创建新的提交以撤销指定提交(不会改变历史记录) 需要保留提交历史但想撤销某次提交
git checkout 切换分支或恢复工作区文件 切换到其他分支或丢弃文件的本地修改
git restore 恢复暂存区或工作区文件(Git 2.23 引入的命令,更直观) 替代部分 git resetgit checkout 的文件恢复功能

注意事项

  1. 谨慎使用 --hard 模式

    • --hard 会直接丢弃工作区和暂存区的更改,无法恢复。建议在使用前备份重要代码。
  2. 确认回滚范围

    • 回滚提交时,要明确回滚的范围(HEAD~1 表示回滚最近一次提交,<commit-id> 表示回滚到指定提交)。
  3. 不可撤销的更改

    • 如果已经将更改推送到远程仓库,请小心使用 git reset,因为它可能会导致远程仓库与本地仓库不同步,需要强制推送。

通过合理使用 git reset,可以更高效地管理代码版本,撤销错误的操作或清理工作区。

=================

Git reset:介绍、作用和应用场景

git reset 是 Git 中一个强大的命令,用于 重置当前分支的状态。它可以更改 HEAD 指针的位置,同时可选择性地修改暂存区(staging area)和工作区(working directory)的内容。


作用

  1. 重置 HEAD 的位置:将当前分支的 HEAD 指针移动到指定的提交。
  2. 控制暂存区和工作区:根据不同模式(--soft--mixed--hard),同步或丢弃暂存区和工作区的更改。

基本语法

git reset [<mode>] <commit>
  • <mode>:可选模式,包括:

    • --soft:仅移动 HEAD 指针,保留暂存区和工作区的更改。
    • --mixed(默认):移动 HEAD 并重置暂存区,保留工作区的更改。
    • --hard:移动 HEAD,重置暂存区,同时清除工作区的更改。
  • <commit>:目标提交的哈希值或引用(如 HEAD~1master)。


三种模式的区别

模式 HEAD(分支) 暂存区(staging area) 工作区(working directory)
--soft 移动 不变 不变
--mixed 移动 清除 不变
--hard 移动 清除 清除

应用场景

1. 撤销最近的提交,但保留更改

  • 使用场景:你提交了代码,但发现有问题需要修改,想撤销提交但保留代码。
  • 使用命令:
    git reset --soft HEAD~1
    
  • 结果:最近一次提交的更改会移回暂存区,保留所有代码文件未变。

2. 撤销最近的提交并清除暂存区,但保留文件修改

  • 使用场景:你提交了代码,发现错误,想撤销提交并取消暂存,但保留文件的更改。
  • 使用命令:
    git reset --mixed HEAD~1
    
  • 结果:提交的更改从暂存区移到工作区,保留文件内容供进一步修改。

3. 撤销最近的提交并丢弃所有更改

  • 使用场景:你提交了代码,但不需要这些更改了。
  • 使用命令:
    git reset --hard HEAD~1
    
  • 结果:最近一次提交及其更改全部丢弃,工作区恢复到上一个提交的状态。

4. 切换到特定提交

  • 使用场景:你需要查看或恢复到某个历史提交点。
  • 使用命令:
    git reset --hard <commit_hash>
    
  • 结果:项目的 HEAD、暂存区和工作区都回到指定的提交状态。

5. 取消暂存区的更改

  • 使用场景:你错误地使用 git add 添加了不想提交的文件,想取消暂存。
  • 使用命令:
    git reset <file>
    
  • 结果:文件从暂存区移出,但工作区的文件内容保持不变。

6. 回退未推送的远程提交

  • 使用场景:本地提交后推送到远程仓库,但发现提交有误,需要回退。
  • 使用命令:
    git reset --hard HEAD~1
    git push origin <branch_name> --force
    
  • 结果:回退并强制更新远程分支(谨慎操作)。

注意事项

  1. 慎用 --hard
    • 它会清除暂存区和工作区的所有更改,一旦执行,除非通过 git reflog 恢复,否则无法找回。
  2. 影响未推送的提交
    • git reset 只影响本地仓库。如果想同步到远程仓库,需要使用 git push --force
  3. 避免在公共分支使用
    • 在共享分支上使用 reset 会重写提交历史,可能导致其他开发者的工作冲突。

总结

  • git reset 是用于撤销和调整提交历史的强大工具,它可以帮助开发者灵活地回退或修改工作状态。
  • 在日常开发中,选择合适的模式(--soft--mixed--hard)可以安全高效地管理代码变更。
  • 对于已推送的代码,谨慎使用 reset,确保不破坏团队协作环境。

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

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

相关文章

Spacedrive :一款开源超高颜值功能强大的跨平台文件管理器

我们的文件越来越来越多,大量的文件分布在网盘,硬盘里面。即使电脑硬盘里面,也是分布在不同的地方,管理起来越来非常麻烦。 要是能够有一个软件,可以将网盘,硬盘和网络驱动器统一起来管理,将会是多么的方便。 今天就给大家推荐一个高颜值的文件管理软件——spacedrive,…

【shell脚本】监控IP频繁登录服务器脚本

该脚本的作用是监控IP登录失败次数,如果某个IP的登录失败次数超过设定的最大次数,则阻止该IP的进一步登录尝试。通过iptables防火墙阻止连接,当一个IP尝试登录次数超过5次时,iptables会阻止来自该IP的所有连接。 #!/bin/bashfunction secrity(){ # 设置要监控的登录失败次数…

[OtterCTF 2018]-内存取证-WP

看了很多大佬的博客,才发现他们的文章都会写摘要~~ 我就没写过哈哈(比较懒)。我的博客比较水,内容少而质量低,分类挺乱的,后面慢慢改善吧!写这篇主要是为了学习 vol2 的使用(八神推荐的嘿嘿),有不好的地方可以指点一下![OtterCTF 2018] WP [OtterCTF 2018] What the…

vm最小化安装centos

前期准备 VMware Workstation CentOS-7-x86_64-DVD-2009.iso http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 创建虚拟机默认下一步,选择稍后安装接着默认下一步,完成后编辑虚拟机设置镜像安装centos 选择第一个Install CentOS 7接着一路默认 配置静态ip 查看子网地…

《Django 5 By Example》阅读笔记:p105-p164

《Django 5 By Example》学习第5天,p105-p164总结,总计60页。 一、技术总结 1.文章标签功能 Django自带django-taggit。 2.自定义template tags 3.roadmap功能 4.RSS功能 5.full-text搜索功能 这里使用的是Postgresql,使用pip install psycopg安装后,执行“python manage.py…

11/15

好讨厌现在的自己 我的能量太低了 需要不断的慰藉 我喜欢逃避 野心家,思想家,我真的sb 没有成就感 绝望绝望绝望绝望绝望今天很drama,不想说什么了,难受,以后再写 明天计划C语言5题【今天少了一道】 下午去比赛 前端考核作业【1/2】可能睡觉睡少了,不开心?洗洗睡了

团队项目4——项目冲刺-4

每日站立式会议昨天已完成的工作: 杨睿:完善社区活动模块接口 个人中心模块接口木萨江:投诉反馈页面开发 管理员管理用户相关接口巴音才次克:物业报修相关接口李佳聪:检查车位信息的删查改接口是否符合需求今天计划完成的工作: 杨睿:完善管理页面 对接个人中心接口木萨江…

团队作业4——项目冲刺5

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/作业要求 需求&原型改进、系统设计、Alpha任务分配计划、测试计划团队项目仓库 https://github.com/bitpurleclude/GDUT-Goofish/issues团队成员 李嘉锐 车峤锐 于海洋 林进光 黄健 钟启腾 钟月灿1…

基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现二

运行环境:jdk1.8、mysql5.x、idea、maven3.5/3.5 如果环境一致 运行不起来可以右侧联系我,包运行。 功能:管理员信息数据层Mapper、宠物信息数据层Mapper、宠物领养记录信息数据层Mapper、宠物评论信息数据层Mapper、宠物评论回复信息数据层Mapper、用户信息数据层Mapper 技…

Alpha冲刺(3/14)——2024.11.14

目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表 一、团队成员分工与进度成员 完成的任务 完成的任务时长 剩余时间施靖杰 编…

「AI Infra 软件开源不是一个选项,而是必然」丨云边端架构和 AI Infra专场回顾@RTE2024

在人工智能和开源技术蓬勃发展的当下,AI Infra 项目正经历着日新月异的变革。从跨平台运行时到云边端 AI 基础设施,再到多模态知识助手,创新浪潮席卷而来。这些进步不仅显著提升了技术指标,也为实时音视频处理、边缘计算、大模型应用等场景开辟了新的可能性。在 RTE 2024 大…

2024-2025-1 20241305 《计算机基础与程序设计》第八周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第八周作业这个作业的目标 1、功能设计与面向对象设计 2、面向对象设计过程 3、面向对象语言三要素 4、汇编、编译、解释、执行作业正文 本博客链接教材学习…