一次搞清 git checkout,git restore 和 git reset

2024-03-01 06:32

本文主要是介绍一次搞清 git checkout,git restore 和 git reset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、git checkout 用法总结
    • 1.切换与创建分支
    • 2.还原工作区(文件内容)
  • 二、git restore 用法总结
  • 三、git reset 用法总结
  • 四、对比分析
    • 1. restore 与 reset 对比
    • 2. restore 与 checkout 对比
    • 3. reset 与 checkout 对比


前言

作为刚转行的软件配置管理员(SCM),一直没搞清楚 git checkout,git restore 和 git reset的用法和区别,正好这几天不忙,简单梳理了一下,终身学习,持续进步。


一、git checkout 用法总结

1.切换与创建分支

git checkout <branch_name > 切换分支
#git switch <branch_name> 切换分支

git checkout -b <branch_name> 创建并切换至分支
#git switch -c <branch_name> 创建并切换至分支

git checkout -b <branch_name>origin/<branch_name> 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

2.还原工作区(文件内容)

git checkout – <file_name> 丢弃工作区的修改,并用最近一次的commit内容还原到当前工作区(对文件中内容的操作,无法对添加文件、删除文件起作用

git checkout HEAD^ – <file_name> 将指定commit提交的内容(HEAD^表示上一个版本)还原到当前工作区

git checkout <branch_name> – <file_name> 将指定分支的指定提交内容还原到当前分支工作区

二、git restore 用法总结

git restore --staged <file_name> 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件

git restore <file_name> 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件

三、git reset 用法总结

git reset HEAD <file_name> 丢弃暂存区的修改,重新放回工作区,会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(相当于撤销git add 操作,不影响上一次commit后对本地文件的修改) (包括对文件的操作,如添加文件、删除文件

git reset –hard HEAD 清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换(恢复到上一次commit后的状态,上一次commit后的修改也丢弃

四、对比分析

checkout、restore、reset这三个词刚开始真得把我整懵了,通过以上简单的梳理现在思路清晰了许多,最后通过例子实际操作对比一下,相信对你会有帮助的,感谢你看到这里。

1. restore 与 reset 对比

1.添加文件后想撤销:

新建文件practice1并git add:

$ ls
NXP_MPC5746C_Bootloader_Z4/
$ touch practice1
$ ls
NXP_MPC5746C_Bootloader_Z4/  practice1
$ git add practice1
$ git status
On branch st_dev
Your branch is up to date with 'origin/st_dev'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file:   practice1

现在不想要practice1文件了,用git restore --staged practice1命令重新放回工作区:

$ git restore --staged practice1
$ git status
On branch st_dev
Your branch is up to date with 'origin/st_dev'.Untracked files:(use "git add <file>..." to include in what will be committed)practice1nothing added to commit but untracked files present (use "git add" to track)

或者用git reset HEAD practice1命令重新放回工作区,此时两个命令的功能相同:

$ git reset HEAD practice1
$ git status
On branch st_dev
Your branch is up to date with 'origin/st_dev'.Untracked files:(use "git add <file>..." to include in what will be committed)practice1nothing added to commit but untracked files present (use "git add" to track)

工作区也不想要了,想删除文件(文件还未被跟踪,直接通过rm删除本地文件):

$ rm practice1
$ ls
NXP_MPC5746C_Bootloader_Z4/

2.删除文件后想撤销:

提交文件后,工作区是干净的:

$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)nothing to commit, working tree clean

现在删除文件,查看状态:

$ git rm practice1
rm 'practice1'
$ ls
NXP_MPC5746C_Bootloader_Z4/
$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted:    practice1

不想删除了,重新放回工作区:

$ git restore --staged practice1
$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)deleted:    practice1no changes added to commit (use "git add" and/or "git commit -a")
$ ls
NXP_MPC5746C_Bootloader_Z4/ #现在文件在工作区仍然是删除状态

用git restore practice1 恢复文件到工作区

$ git restore practice1
$ ls
NXP_MPC5746C_Bootloader_Z4/  practice1
$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)nothing to commit, working tree clean

或者用git reset HEAD practice1命令将文件重新放回工作区,此时两个命令的功能相同:

$ git rm practice1
rm 'practice1'
$ ls
NXP_MPC5746C_Bootloader_Z4/
$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted:    practice1
$ git reset HEAD practice1 #与git restore practice1作用相同
Unstaged changes after reset:
D       practice1
$ ls
NXP_MPC5746C_Bootloader_Z4/
$ git status
On branch st_dev
Your branch is ahead of 'origin/st_dev' by 1 commit.(use "git push" to publish your local commits)Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)deleted:    practice1no changes added to commit (use "git add" and/or "git commit -a")

再从工作区恢复文件:

$ git restore practice1
$ ls
NXP_MPC5746C_Bootloader_Z4/  practice1

2. restore 与 checkout 对比

3. reset 与 checkout 对比

这两点明天再写,我现在的想法是:
1.git checkout – <file_name>是将暂存区的修改重新放回工作区,但只能操作文件内容,不能添加、删除文件;
2.git restore --staged <file_name>相当于撤销git add 命令,git restore <file_name> 是放弃对工作区的修改,对文件内容的操作能使用此命令,但对文件的操作(添加、删除)不起作用;
3.而git reset HEAD <file_name>与 git restore --staged <file_name>的作用相同。

欢迎大家讨论,我总结的有问题的话欢迎指正。


这篇关于一次搞清 git checkout,git restore 和 git reset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761493

相关文章

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

电脑多久清理一次灰尘合? 合理清理电脑上灰尘的科普文

《电脑多久清理一次灰尘合?合理清理电脑上灰尘的科普文》聊起电脑清理灰尘这个话题,我可有不少话要说,你知道吗,电脑就像个勤劳的工人,每天不停地为我们服务,但时间一长,它也会“出汗”——也就是积累灰尘,... 灰尘的堆积几乎是所有电脑用户面临的问题。无论你的房间有多干净,或者你的电脑是否安装了灰尘过滤器,灰尘都

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情