一次搞清 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

相关文章

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

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

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

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

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看