Git branch-d newBranch,然后Git checkot master没有';我不能撤销纽伯兰的变化

Git branch-d newBranch,然后Git checkot master没有';我不能撤销纽伯兰的变化,git,git-branch,Git,Git Branch,这是第一次发生在我身上,我非常震惊。 昨天我创建了一个新的分支,其中包含git checkout-b recipients。我用git branch检查了我的位置。我做了一些更改,然后我想用git checkout master返回master。 尽管我回到了大师的位置,但变化仍然存在 我做错了什么 谢谢 更新1:现在我认为我没有提交也没有隐藏,但正如你所看到的,git没有抱怨(就像我认为在那些情况下那样)你需要重新调整你的心智模型。您认为Git是处理文件的,但Git内部并不是这样。在内部,G

这是第一次发生在我身上,我非常震惊。 昨天我创建了一个新的分支,其中包含
git checkout-b recipients
。我用git branch检查了我的位置。我做了一些更改,然后我想用
git checkout master
返回master。 尽管我回到了大师的位置,但变化仍然存在

我做错了什么

谢谢


更新1:现在我认为我没有提交也没有隐藏,但正如你所看到的,git没有抱怨(就像我认为在那些情况下那样)

你需要重新调整你的心智模型。您认为Git是处理文件的,但Git内部并不是这样。在内部,Git使用提交。要了解这一切是如何工作的,从而理解刚刚发生的事情,您必须了解很多关于提交的知识,以及Git如何创建新的提交

因此:

  • 每个提交都有一个唯一的编号。这些数字不是简单的计数数字:我们没有commit#1后跟2、3等等。相反,每个数字都是一个大的、丑陋的、看起来随机的散列ID,例如。提交存储在一个大文件中,提交的唯一编号作为键,提交的内容作为值

  • 这些数字实际上根本不是随机的。相反,它们是提交中任何内容的加密校验和。Git可以通过哈希ID找到任何提交或任何其他内部Git对象。但是,由于ID是内容的校验和,因此内容自动为只读。如果您要从数据库中取出一个,对它大惊小怪,甚至只更改一个位,然后将结果放回,您将得到一个新的、不同的提交,并使用一个新的、不同的键。旧的提交仍然存在,在其原始密钥下

  • 提交中包含的内容分为两部分。其中一部分是Git知道的所有文件的完整快照。稍后我们将回到这里,但现在,让我们注意到每个文件本身都以只读、压缩和消除重复的格式存储,只有Git本身可以读取。提交的另一部分是它的元数据:关于提交的信息,比如谁做的、什么时候做的等等。作为元数据的一部分,Git将原始散列ID存储在键值数据库中,用于上一次提交

这三个事实有很多后果,但现在我们最关心的是提交及其所有存储文件的只读性。如果提交中的文件实际上无法更改,而且无法更改,那么我们如何获得可以更改的文件?这就是Git的索引或暂存区域所在的位置,也是您的工作树所在的位置

你的工作树 您可以查看和处理的文件副本根本不在Git中。它们在你的工作树上。这些是普通的日常文件。第一次克隆存储库时,工作树完全为空。Git从一些提交中提取文件并填充您的工作树,现在您就有了文件。这还考虑了提交中的文件不可被非Git程序读取的事实。1

在您告诉Git将文件提取到您的工作树中之后,这些文件以及整个树本身将由您自己处理。Git实际上不会使用这些文件,除非您告诉它这样做。您可能希望
git commit
使用它们,但事实并非如此,2我们将在下一节中看到


1实际上有多种内部格式,其中一种称为松散对象并不困难,因此一些程序可以或可以直接读取这些文件。然而,对象的压缩形式更为复杂。一些程序可以读取包文件,但它们似乎都面向使用Git或直接使用Git。让Git来处理这些问题要简单得多

2一些选项和参数确实使
git提交
使用工作树文件。我们将在下面略加说明


吉特指数 其他版本控制系统则停留在“一个文件的两个副本”这一点上:有一个提交的版本,以某种内部格式,实际上是无法更改的,还有一个普通的文件版本,您可以使用它。他们的“提交”动词,不管拼写如何,都使用普通文件。但是Git没有做到这一点:相反,Git添加了第三个版本,介于提交副本和工作树副本之间

第三个“拷贝”——这里引用了“拷贝”一词,因为它是内部的、消除重复的格式,所以它实际上是自动共享的,每个文件都有Git的三个名称。这个东西被称为索引——一个没有实际意义的名称或临时区域,它指的是您使用它的方式。第三个名字是缓存,它指的是Git在内部使用这个东西来让Git运行得更快的方式,目前在
--cached
选项中最常见

最初,索引(或临时区域)保存来自当前提交的每个文件的相同副本。此副本为内部格式,可以进行下一次提交。但它实际上不是一个提交,所以与真正的提交不同,它不是只读的。您不能更改其中的现有文件,但可以将工作树文件的新副本放入其中

如果这没有意义,那么可以这样想:当您运行
git add file
时,git所做的是读取命名文件的工作树版本。Git在运行
GitAdd
时将其压缩为只读、消除重复的格式。如果该文件已经在任何其他提交中,Git只需重新使用冻结的副本。如果没有,Git现在已经准备好了一个可冻结的副本。3不管怎样,索引仍然可以提交

所以索引,或者说暂存区,如果你喜欢这个术语,总是准备好了
... <-F <-G <-H
...--G--H   <-- master (HEAD)
...--G--H   <-- master, recipients (HEAD)
          I--J   <-- branch1
         /
...--G--H   <-- master
         \
          K--L   <-- branch2