git操作之二:git restore
在上篇博客中留了一个问题,那就是git restore命令是做什么的,下面重点分析。
一、概述
git restore命令是撤销的意思,也就是把文件从缓存区撤销,回到未被追踪的状态。
该命令有git restore <file>和git restore --staged <file>两种常用的用法。
二、详述
在git中有工作区、暂存区、仓库区(本地代码区)三部分,要注意git restore命令在工作区是不会其作用的,也就是一个文件在工作区,使用git restore是不起作用的。如下图

MyFirst2.java该文件未被加入暂存区,也就是未使用过git add MyFirst2.java命令,那么使用git restore命令如下,

可见使用git restore命令报错。从使用git status命令查看的结果也可以看出,对应在工作区未使用过git add命令的文件,是untracked files的文件,需要使用git add命令,加入暂存区,那么放到暂存区的文件如何回到工作区那,下面再看下git status 的截图

从上面的图片中知道MyFirst.java在暂存区中,看上边的提示git restore --staged <file>也就是使用该命令可以把文件从暂存区撤销到工作区(前提是该文件未被修改),下面使用git restore --staged <file>命令的截图

从上图中可以看到暂存区中已无该文件,而在untracked files(工作区)中有src/文件夹(该文件夹下的所以文件均未被追踪),下面使用git add src/命令,

可以看到src下的两个文件均添加到了暂存区。现在把MyFirst.java文件进行修改,如下
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
}
}
使用git status查看状态,

从上面可以看出MyFirst.java出现了两次,第一次提示是使用git restore --stage <file>,下面使用该命令并查看git的状态

可以看到MyFirst.java从暂存区被移除了,现在看文件本身是否有变化
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
}
}
从上面看无变化,也就是git restore --staged <file> 会把文件从暂存区移除,文件的修改不会受影响。下面看第二种情况。再贴上上面的图,

此时MyFirst.java是下面的样子,
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
System.out.println("b");
}
}
此时,使用git restore <file>命令并查看状态,

此时,查看MyFirst.java文件的内容,
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
}
}
看到文件的内容第二行打印没有了,为什么那,因为第二行打印是再把MyFirst.java加到暂存区后新增的,也就是在把文件加到暂存区后对文件进行修改,再执行git restore <file>会撤销文件的修改,撤销到最近一次执行git add的内容。
下面把MyFirst提交到本地仓库,提交后的内容为,
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
}
}
在该基础上进行修改,修改为下面的内容,
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
System.out.println("提交后修改");
}
}
下面看git的状态,

看到上边给出了两个提示,先使用git restore <file>命令,

文件内容,
package cn.com.my;
public class MyFirst {
public static void main(String[] args) {
System.out.println("a");
}
}
可以看到使用git restore <file>后文件恢复为提交的状态。如果是使用git add命令,

可以看到使用了git add <file>后文件被加到了暂存区,需要重新提交到本地仓库。
三、总结
本文分析了git restore --stage <file>和git restore <file>两个命令,总结如下,
1、文件在暂存区且未作修改的情况
使用git restore --staged <file> 把文件从暂存区移动到工作区,即文件不被追踪;
2、文件在暂存区且已经修改的情况
使用git restore --staged <file> 把文件从暂存区移动到工作区,且不会撤销修改的内容;
使用git restore <file> 文件仍在暂存区且会撤销文件修改的内容;
3、文件在本地代码库已经修改的情况
使用git add <file> 把文件重新放到暂存区,且保留文件的修改;
使用git restore <file> 文件仍在本地代码库且会撤销文件的修改;
对于git restore <file>命令,会撤销文件的修改,使文件恢复到暂存区或本地代码库(取决于文件在修改前的状态);
对于git restore --staged <file>命令,把文件从暂存区撤回到工作区,保留文件最后一次修改的内容;
有不正之处,欢迎指正,感谢!
git操作之二:git restore的更多相关文章
- git操作之四:git branch(本地仓库)
前面,介绍了git init/add/commit/restore/reset等git命令,今天介绍下git branch,这个命令是和分支相关的.首先要理解什么是分支,简单来说在协作开发中,每个人开 ...
- Git知识总览(二) git常用命令概览
上篇博客我们从 git clone 和 git status 两个命令开始,引出了一系列的git操作命令, 请参见:<Git知识总览(一) 从 git clone 和 git status 谈起 ...
- git操作之三:git reset
在上篇文章中介绍了git restore命令,该命令的可以看作是撤销命令,文件在不同的状态下,使用git restore <file> 命令,会撤销对文件的修改,是文件回到修改前的状态也就 ...
- Git操作(二)
很久以前写的git入门,最近又巩固了一下Git分支操作,下面是我的一些整理. 1.分支与合并 #创建并切换到该分支 git checkout -b xxx #查看当前分支 git branch #进行 ...
- IDEA环境下GIT操作浅析之二-idea下分支操作相关命令
上次写到<idea下仓库初始化与文件提交涉及到的基本命令>,今天我们继续写IDEA环境下GIT操作之二--idea下分支操作相关命令以及分支创建与合并. 1.idea 下分支操作相关命令 ...
- 如何撤销Git操作?
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:如何撤销Git操作?: Git 版本管理时,往往需要撤销某些操作. 本文介绍几种最主要的情况,给出详细的解释.更多的命令可以参考< ...
- 使用git微命令深入理解git工作机制
首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...
- git-【二】本地git操作提交、版本回退
一.创建版本库,提交文件 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任 ...
- git的学习笔记(二):git远程操作
1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...
随机推荐
- JAVA Schedule的Cron表达式
spring中用到的定时任务,一般用到的有Timer()和Schedule Cron表达式一般是程序的定时任务中所要起的..我们用的springboot中的@Schedule中,启动类中添加enabl ...
- jmeter_04_常用取样器
目录 常用取样器详解 http取样器 1.1 基本配置 1.2 高级配置 jdbc取样器 2.1 JDBC Connection Configuration 2.1.1 **Variable Name ...
- linux(centos8):firewalld使用ipset管理ip地址的集合
一,firewalld中ipset的用途: 1,用途 ipset是ip地址的集合, firewalld使用ipset可以在一条规则中处理多个ip地址, 执行效果更高 对ip地址集合的管理也更方便 2 ...
- 一文读懂Redis常见对象类型的底层数据结构
Redis是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.Redis支持五种常见对象类型:字符串(String).哈希(Hash).列表(List).集合(Set)以及有序集合( ...
- 详解Kubernetes微服务自动化发布系统
实施微服务架构后,原先单一的系统结构统变成了数量众多的微服务应用,开发.测试.运维部署等都会面临不少挑战.在微服务架构下如何提高工程研发效率,确保开发.测试.运维部署等流程上的顺畅,是微服务技术体系能 ...
- 第10天 | 12天搞定Python,文件操作(超详细)
在开发系统的过程中,经常会用到XML存储和传输数据,XML是一种用于标记电子文件使其具有结构性的标记语言,在博客中经常会见到. JSON是一种轻量级的数据交换格式,常被用在后端和前端的数据交互上,如你 ...
- C++学习笔记---指针
1.基本概念 作用:可以通过指针直接访问内存 内存编号是从0开始记录的,一般用16进制数字表示 可以利用指针变量保存地址 2.定义和使用 定义指针 他们的关系就是这样的 运行输出 使用指针 运行输出会 ...
- git学习(十一) idea git pull 解决冲突
测试如下: 先将远程的代码修改,之后更新: 之后将工作区修改的代码(这里修改的代码跟远程修改的位置一样)提交到本地,之后拉取远程的代码,会发现有冲突: Accept Yours 就是直接选取本地的代码 ...
- shiro实现不同身份使用不同Realm进行验证
转载:https://blog.csdn.net/xiangwanpeng/article/details/54802509 假设现在有这样一种需求:存在两张表user和admin,分别记录普通用户和 ...
- 部署SpringBoot项目jar包到云服务器
前言 做安卓开发也有三四年了,但是对网络这块什么http.tcp/ip之类的一直不理解.并且想自己做一些小项目练练手的时候,数据库直接存在apk里总不是滋味,所以这次站在安卓开发的角度尝试着做一做简单 ...