在一个分支上提交更改是否会从其他分支中丢弃它们?

Does committing changes on a branch discard them from other branches?

考虑以下场景:

  1. 制作一个干净的 repo 克隆
  2. 更改一些文件
  3. 进行更改
  4. 创建一个新分支
  5. 将更改提交到新分支
  6. 删除分支

更改会永远丢失吗?

Are the changes lost forever?

没有。您可以使用以下命令恢复已删除的提交:

$ git reflog

Are the changes lost forever?

不是马上。但是,如果没有引用(例如标记或分支名称)指向提交或其后代之一,那么是的,它最终将被清理并丢失。

回答您用作标题的问题:

Does committing changes on a branch discard them from other branches?

当您提交到一个分支时,不会从其他分支中删除任何内容。在您的场景中,您从未将更改添加到主分支。它们在您的工作树中(当您编写这些更改时),然后您更新索引以匹配您的工作树(当您暂存这些更改时),但您从未将更改添加到主分支,因为您从未提交给该分支。所以不是他们从那个分支中删除了,而是他们从未被添加到它。

可能会给您的印象是您的更改已被删除,当您切换到一个新分支以在那里提交更改,然后切换回您的主分支时,工作树已更新以匹配当前的内容分支,您不再看到更改。

关于更改是否永远丢失,@Paolo 和@matt 已经回答:

在下一次垃圾 collection (gc) 之前更改不会丢失,默认情况下,每 30 天 运行s。当指向该快照的提交被下一个 gc 清除时,它们确实会丢失,因为它不在任何分支上。

在此之前,您可以恢复您的更改,例如,通过:

  1. 检查包含更改的提交(您删除了分支,它只是一个指针,但提交仍然存在)。这将使您处于分离的 HEAD 状态,因为 HEAD 不会像通常那样指向分支,而是直接指向提交:
git checkout HEAD@{1}

只有在删除分支后立即执行此操作才有效。如果您移动了 HEAD,您将需要 运行 git reflog 来查找提交哈希并使用 git checkout <hash> 代替。

  1. 从该提交创建一个新分支并检查它(您将不再处于分离的 HEAD 状态,因为 HEAD 现在将指向该新分支):
git checkout -b newbranch

从那时起,您可以将新分支合并回您的主分支或对其进行任何您想做的事情。您关心的提交现在在一个分支上,因此不会被下一次 gc 删除。