git 在中间提交时重置:最后一次提交真的丢失了吗?

问题描述 投票:0回答:1

我有一个

branch2
从另一个
branch1
分支,没有额外的提交
branch1
所以分支树实际上是线性的。

现在我发现

branch1
中的最后一次提交实际上应该是
branch2
中的第一次提交。 所以我认为它会保存到命令
git reset --hard HEAD~
。 在文档中,我们发现之后的提交丢失了, 但我认为因为我们有
branch2
,所以在给定的场景中这是不正确的。

当然,我想得到社区的意见。

git
1个回答
0
投票

你是对的,没有什么损失。要理解原因,有必要了解一下 git 的工作原理:

  • 在 git 中,“分支”实际上只是指向单个提交的命名指针。
  • 每个提交都有一个指向其“父级”(或者,对于合并,多个)的指针。
  • 当我们谈论提交“在分支上”时,从技术上讲,更准确的说法是它们“可从引用访问”;例如“commit
    abc123
    is on
    branch1
    ”实际上意味着“如果您从
    branch1
    引用的提交开始,并向后跟随“parent”指针,您将在某个时刻到达提交
    abc123
    ”。

git reset --hard
所做的(以及丢弃未提交的更改,这永久的)是更改命名引用以指向不同的提交。

警告是,这可能会使先前的提交“无法访问”——也就是说,不在任何命名分支或标签的历史记录中。无法访问的提交会定期被“垃圾收集”,并从数据库中删除。在那之前,如果您知道它们的哈希值,或者在类似

git reflog

的地方找到它,仍然可以访问它们

在您的情况下,从

branch1
可以访问的所有提交也可以从 branch2 访问,因此不会有任何内容变得无法访问。
你正在改变这样的历史:

a <- b <- c <- d <- e <- f ^ ^ branch1 branch2

对于这样的人:

a <- b <- c <- d <- e <- f ^ ^ branch1 branch2

	
© www.soinside.com 2019 - 2024. All rights reserved.