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 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