当前位置: 首页 > news >正文

Git的使用教程(五)管理修改

  Git比其他版本控制工具优秀的地方就在于Git跟踪并管理的是“修改”,而非文件。

    什么是修改?新增一行是修改,删除一行也是修改,只要让文件变得跟原来不一样就是修改。

    如何证明Git管理的是修改而非文件?下图就充分说明了这一点。

    具体操作过程:第一次修改README.md——>git add——>第二次修改README.md——>git commit。如果Git管理的是文件,那么二次修改操作都会被提交到版本库,而事实上,只有添加到暂存区的第一次修改操作才被提交,第二次操作由于没有加入到暂存区,所以未被提交。

    

    撤销修改

    在“工作区和暂存区”一文中,提到了暂存区的两个优点,一个是“多次修改一次提交”,另一个是可以”撤销修改“,接下来我们就来看下Git是如何撤销修改的。

    状况一:git add之前

    还记得刚才的操作吗,第二次修改的内容还没有被git add到暂存区中,此时我们又想了下,觉得这次修改没有必要,想要撤销,我们可以使用git checkout -- file

[plain]  view plain  copy
  1. git checkout -- README.md  

    其实系统对于如何撤销修改早有提示,当我们新增或者修改了一个文件在添加到暂存区之前,我们使用git status命令的时候,系统便会提示我们,是要git add(添加到暂存区)还是git checkout -- <file>(丢弃工作区的修改)。
     状况二:git add之后,git commit之前
    刚才的情况是修改并未添加到暂存区,如果修改不小心增加到了暂存区,还能撤销吗?答案是肯定的,能。相比于之前,我们需要多一步操作,那就是把修改首先撤出暂存区。
[plain]  view plain  copy
  1. git reset HEAD README.md  


   撤出了暂存区并没有撤销该修改,我们需要重复”git add之前“之前的操作,使用git checkout -- file来完全撤销该修改。

    删除文件

    日常工作当中除了新增,修改操作,删除操作也必不可少。Git是如何管理删除操作呢?

     当我们删除一个文件的时候,git status查看文件状态的时候,会给你提供两种选择,一种是确认删除,则使用git rm(或者git add),然后git commit。另一种是反悔了,想要找回被删除的文件,此时跟找回修改前的文件一样,使用git checkout -- <file>。首先我们来看下确认删除操作。

    

    确认删除情况比较单一,没那么多讲究,但是找回被删除的文件讲究就有很多了。   

    背景一:新文件,从未git commit(版本库中没有该文件),以下状况均在此前提下

    状况一:文件未被git add

    如果你新建了一个文件,还没有被git add,此时如果删除了这个文件,很遗憾,你无法通过git找回该文件。

    状况二:文件被git add,未被git rm

    如果新建的文件已经被git add过,之后又删除了,此时git status的时候就会看到deleted相关信息,此时的deleted信息还未被git rm,所以只要通过git checkout即可恢复。

         

    状况三:文件被git add,又被git rm

    如果新建的文件被git add过,又被git rm过,很遗憾的告诉你,这个文件已经丢失,你无法使用git来恢复了。

    

    背景二:文件被git commit过,版本库中有该文件的信息,以下状况均在此前提下

    状况一:文件未被git add

    由于版本库中有该文件,即使文件未被git add,删除该文件也能找回来,但是找回的文件是最后一次入库的文件,最后一次入库到现在之间的修改操作都会全部丢失。

    

    状况二:文件被git add,未被git rm

    此时是最佳状况,我们不但能够使用git checkout恢复文件,而且能够保持文件的原貌。

    

    状况三:文件被git add,又被git rm

    跟状况一类似,虽然仍然可以找回文件,但是只能找回最后一次入库的状态,最后一次入库到现在的修改全部丢失了。


     注意事项

    1.只有git add到暂存区的修改才会被提交,没有被git add到暂存区的修改不会被提交。

    2.git checkout的时候--必须要有,不能少,少了--的git checkout就变成切换分支命令了,撤销命令仅能用于修改未被提交到暂存区的时候使用(即该修改未被git add)。

    3.添加到暂存区后,可以使用git reset HEAD file来撤出暂存区,但是此时该修改并没有撤销,仍需要借助git checkout -- file来完全撤销修改操作。

    4.进行删除操作的时候一定要小心,如果你的文件没有进入过版本库,那么git rm之后你的文件就再也找不回来,进入了版本库,你就不用担心该文件找不回来,但是只能找回最后一次入库的信息,最后一次入库到现在所进行的修改将会全部丢失。

相关文章:

  • Git本地分支与远程分支的追踪关系
  • Git-命令行-删除本地和远程分支
  • Git的使用教程(六)远程仓库
  • 如何去解决fatal: refusing to merge unrelated histories
  • QT跨目录编译及多工程集成(动态库的创建、引用及工程间相互依赖关系的pro文件编写方法)
  • Pro文件变量详细说明
  • 浅谈 qmake 之 pro、pri、prf、prl文件
  • android实现点击两次返回键实现退出功能
  • Qt共享内存的使用
  • Qt for android 弹出Detected problems with app native libraries (please consult log for detail): 解决方案
  • qml去掉标题栏后实现窗口拖动
  • Qt for android 在安卓上面运行app启动闪黑屏的解决方法
  • Qt 中文及字符混合加密,双重加密解密
  • Qt 实时监控网络状态
  • VNISEdit工具打包QT程序
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 〔开发系列〕一次关于小程序开发的深度总结
  • JAVA多线程机制解析-volatilesynchronized
  • java取消线程实例
  • js如何打印object对象
  • Laravel5.4 Queues队列学习
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue.js 移动端适配之 vw 解决方案
  • Windows Containers 大冒险: 容器网络
  • 从tcpdump抓包看TCP/IP协议
  • 聊聊flink的BlobWriter
  • 七牛云假注销小指南
  • 如何在GitHub上创建个人博客
  • 事件委托的小应用
  • 数据科学 第 3 章 11 字符串处理
  • 用Python写一份独特的元宵节祝福
  • 怎么将电脑中的声音录制成WAV格式
  • ​第20课 在Android Native开发中加入新的C++类
  • ​虚拟化系列介绍(十)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (0)Nginx 功能特性
  • (8)STL算法之替换
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)一些感悟
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • . Flume面试题
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net core控制台应用程序初识
  • .NET Core中Emit的使用
  • .NET Core中的去虚
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net Web项目创建比较不错的参考文章
  • .NET 服务 ServiceController
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 验证控件和javaScript的冲突问题
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件