热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

之前“暂存但未提交”的更改会发生什么?

我是git新手,刚开始从这个网站学习:https://dev.to/unseenwizzard/learn-git-concepts-not-commands-4gjc我的

我是 git 新手,刚开始从这个网站学习:https : //dev.to/unseenwizzard/learn-git-concepts-not-commands-4gjc

我的疑问在于文档的这一部分:


总而言之,我们用这句话对 Bob.txt 进行了更改:- Hi!!我是鲍勃。我是新来的。

我们上演了这个更改,但没有提交

后来,我们继续对同一个句子进行了另一个更改,删除了多余的 ! 嗨之后。

所以现在这句话看起来像这样:-嗨!我是鲍勃。我是新来的。

现在我们上演提交了这个新的变化。

我的疑问是:之前对 Bob.txt 的修改(有两个!!)是不是从暂存区丢失了?我跑了git status但它没有提到以前的变化。我可以回去用两个“!!”提交更改吗??

回答



VonC 的答案和Romain Valeri 对该答案的补充都是正确的,但可能很难以各种方式形象化或理解。这是一种理解它的方法,它可能至少有点直观。

当您在 Git 中处理提交时,每个文件最多有三个副本。一旦您知道提交包含每个文件的完整快照,以只读(以及仅 Git、压缩和重复数据删除)格式,您就会明白为什么需要有两个副本:

Git's read-only copy in HEAD your working tree copy
---------------------------- ----------------------
file1.ext file1.ext
file2.ext file2.ext
readme.md readme.md

即使内容file1.ext提交的内容相匹配file1.ext你的工作树,你的工作树是在那里你能看到和工作在/与文件的Git提取提交- Git的副本是在一些特殊的,怪异的,压缩和只读格式。只有 Git 本身甚至可以读取这个文件,并且没有任何东西——甚至 Git 本身——都不能覆盖它。1 你的工作树包含普通的日常文件,每个人都可以用普通的方式读写,所以 Git 确实必须在每次检查提交时复制它。

同样的原则也适用于其他版本控制系统:在 Mercurial、SVN、CVS 或 ClearCase 或其他任何系统中,您经常会发现文件的多个副本(精确的细节很大程度上取决于 VCS)。然而,Git 特别奇怪的是,每个文件不是只有两个副本,Git 提供了三个:

HEAD (r/o) staging area working tree
---------- ------------ ------------
file1.ext file1.ext file1.ext
file2.ext file2.ext file2.ext
readme.md readme.md readme.md

HEAD副本是在提交和不能改变的,不过就是这样。您可以随意使用工作树副本。奇怪的是这个额外的副本位于HEAD 和工作树版本之间。

看不到这个额外的版本,至少不容易。2 但它就在那里。为什么?嗯,一个答案是:“无缘无故”——毕竟,其他版本控制系统不会这样做。3 但Git 确实做到了,而且Git 除了“与众不同”之外还有其他原因。特别是,这个“集结地”副本的存在可以让你使用git add -p部分添加一个文件。有一整套这些部分操作(git reset -pgit checkout -p等),我个人不是这些操作的忠实粉丝,但它们确实存在,并且经常被用作中转区存在的理由。

存储的数据临时区域是偷偷4在同一个只读,压缩和去重复的表单里面的提交Git使用。这对 Git 本身的作用是 make git commitgo非常快(无论如何与所有其他 VCS 相比)。运行时git commit,暂存区中的文件副本已准备好提交。几乎不需要额外的工作。5 当您运行git checkout,Git会预先填写指数/舞台区域,这是两个方面的同样的事情,在Git中,所有的文件提交你签出。当你运行时git add,Git:


  • 压缩和散列工作树文件的内容;

  • 检查是否重复;和

  • 如果是重复的,则重复使用旧的,否则保存新的

这样文件就可以使用了,并且 Git 可以使用新的或重用的内部哈希 ID 更新其索引条目/暂存副本。6 这意味着索引/暂存区现在已准备好提交。

如果我们把它们放在一起,我们会看到以下内容:


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext -> file1.ext -> file1.ext
    file2.ext -> file2.ext -> file2.ext
    readme.md -> readme.md -> readme.md


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext file1.ext file1.ext
    file2.ext file2.ext <- file2.ext
    readme.md readme.md readme.md


现在各种其他操作也开始变得有意义:


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext file1.ext file1.ext
    file2.ext file2.ext
    readme.md readme.md readme.md


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext file1.ext file1.ext
    file2.ext -> file2.ext file2.ext
    readme.md readme.md readme.md


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext file1.ext file1.ext
    file2.ext
    readme.md readme.md readme.md


  • HEAD staging working tree
    ---- ---------- -------------
    file1.ext file1.ext file1.ext
    file2.ext -> file2.ext -> file2.ext
    readme.md readme.md readme.md


git checkout命令有模仿两个的事情模式git restore可以这样做:它可以从分段复制到工作树,或HEAD两者分期工作树。7 这有点危险,因为即使您从未将其保存在任何地方,这些操作也会覆盖工作树副本。这使得使用git switch而不是git checkout“更安全”,因为您不会意外获得这种破坏性的操作模式。8

因此,简短的回答(为时已晚)是您的第二个git add覆盖了您第一次 git add编写的暂存副本,丢弃了较早的暂存副本。现在很难回来了。


1从技术上讲,只要文件存储为 Git 所谓的松散对象,阅读起来并不难:用任何 zlib 解压程序打开底层对象并解压,然后丢弃 Git 添加的标头。但是,仅仅发现单独的对象是在凯斯特痛,然后它可能是“宽松”相反,这是不是“从紧”,而是包装,然后你真的遇到了麻烦。

覆盖文件在物理上是可能的,但由于对象的名称是对象数据的加密校验和,覆盖文件只会损坏数据到 Git 会说“此对象已损坏”并拒绝提取它的程度。您会知道存储库已损坏,并且您应该找到一些其他未损坏的克隆。

2要查看它不容易,请运行git ls-files --stage; 请注意,这会在大型存储库中转储大量输出。

3例如,Mercurial 从字面上看没有,但确实有一个隐藏的东西叫做“dirstate”,它做了一些Git 索引所做的事情。但是,Mercurial 的目录状态和 Git 的索引之间面向用户的区别在于,您甚至不必知道目录状态存在。Git 时不时地把它的索引/暂存区推到你的脸上:看!我有这个额外的副本!是不是很酷?看,看!你真的必须意识到这一点。

4使用git ls-files --stage自曝这个“秘密”,所以它不是真的秘密。但是,你不需要知道,除非你开始使用这个git ls-files --stage你自己,和/或夫妇与使用git update-index

5 需要做的一点额外工作是 Git 必须运行内部等效的git write-tree. 这将保存文件的名称和模式。该数据-the文件的内容-are已经“预存”,如罗曼·瓦列里指出。

6读者练习:如果您的git add某些内容然后从未提交,例如,通过用新内容覆盖它,该怎么办?有一个内部 Git 对象似乎从未在这里使用过。看的git gc文档,看看最终会发生。

7如果您愿意,该git restore命令可以从HEAD工作树复制到工作树,跳过临时副本;git checkout 不能这样做。你是否这样做,我不知道:这取决于你。但是,如果您决定希望这样做,请记住,git restore比这个其他方式能git checkout

8在 Git 2.23 及更高版本中不再发生“意外破坏模式”的事情,它现在指出您的git checkout zorg请求是模棱两可的。这是旧版本的 Git发生的情况:


  • 假设你有一个分支命名origin/zorg

  • 假设您还有一个名为的文件zorg,并且您已经运行git checkout develop并获得了develop该文件的-branch-tip 副本。

  • 假设现在你花了最后一个小时来制定你解雇出租车司机的邪恶计划。

  • 现在你休息一下(小心不要被樱桃呛到)。当你回来时,你会想:等等,我想在zorg树枝上。 所以你跑git checkout zorg

你不会一个zorg分支,但你有一个origin/zorg和你期待的Git创建一个新的分支zorgorigin/zorg并切换到它,如果是安全的,或者给你一个错误提醒您藏匿或提交您的文件。但是相反,Git 说:哦,您希望我删除您最后一小时对文件的工作zorg,从而将文件的暂存副本提取zorg到您的工作树中。

如果您使用git switch zorg,Git 就会知道您打算创建一个新分支,并且会安全地尝试。但是相反,Git 毁了你的工作。无赖!只是不要去杀死一群人(甚至是芒格洛尔人)来发泄你的沮丧,好吗?






推荐阅读
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • DDOSDDOS的中文名叫分布式拒绝服务***,俗称洪水***DDoS***概念DoS的***方式有很多种,最基本的DoS***就是利用合理的服务请求来 ... [详细]
  • 缓冲区溢出实例(一)–Windows
    一、基本概念缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被填满从而覆盖了相邻内存区域的数据。可以修改内存数据,造成进程劫持,执行恶意代码,获 ... [详细]
  • Proof (of knowledge) of exponentiation
    1.ProofofexponentiationProofofexponentiation是基于adaptiverootassumption(充分必要条件࿰ ... [详细]
  • Fixes#3560Itriedtodowhatproposedintheissue(inthisbranchhttps://gith ... [详细]
  • python 鸭子类型_Python中的鸭子输入是什么?
    python鸭子类型Python遵循EAFP(比许可更容易请求宽恕)而不是LBYL(跨越式)。EAFP的Python哲学在某 ... [详细]
  • SSL协议、TLS协议,使用哪一种更安全?
    在金融银行业,保护机密信息的安全至关重要。由于财务记录完全通过在线数据库维护,因此实施保护客户、银行和金融机构免受黑客攻击的安全功能比以往任何时候都更加重要。安全套接字层(SSL) ... [详细]
  • FroggerTimeLimit:1000MSMemoryLimit:65536KTotalSubmissions:32257Accepted:10396DescriptionFr ... [详细]
  • Linux提权之suid篇
    Linux提权之suid篇不知攻,焉知防一个在安服路上摸索的大三生,记录平时学习笔记suid前言:1.只有可以执行的二进制程序文件才 ... [详细]
  • NSSROUND#8[Basic]
    文章目录一、[NSSRound#8Basic]MyDoor二、[NSSRound#8Basic]Upload_gogoggo三、[NSSRound#8Basic]MyPage四、[ ... [详细]
  • 一、如果使用默认的1521端口,让实例自动注册到该监听上,那么local_listener无需设置,listener.ora文件按照正常方 ... [详细]
  • CentOS7.2详细安装步骤(二)
    7)语言设置(可以在上一个主界面进行设置,这里不用再次设置)8)SECURITY设置(安全设置)选择default(默认的)策略就可以,通过进行选择,单击完成即可Default#默 ... [详细]
  • linux树莓派和n1,树莓派 斐讯N1 搭建NFS
    什么是NFS?1台Linux主机的磁盘可以通过网络挂载到其他Linux主机上,实现云盘效果。NFS是一套软件和协议,同时也是一种文件系统& ... [详细]
  • 文章目录1.解释一下GBDT算法的过程1.1Boosting思想1.2GBDT原来是这么回事2.梯度提升和梯度下降的区别和联系是什么?3.GBDT的优点和局限性有哪 ... [详细]
  • 1、背景-在项目的实施过程中,由于有dev环境和pro环境,这时会有两个redis集群,但是部分数据从甲方的三方数据库中获取存入生产环境的redis集群中,为了方便测试和数据校验, ... [详细]
author-avatar
一鳞半爪恋歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有