【问题标题】:Does committing changes on a branch discard them from other branches?在一个分支上提交更改是否会从其他分支中丢弃它们?
【发布时间】:2020-10-10 18:45:38
【问题描述】:

考虑以下场景:

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

更改会永远丢失吗?

【问题讨论】:

  • 你从来没有检出一个新的提交或分支,所以即使“旧分支”消失了,它指向的提交实际上是在你当前的分支中。

标签: git git-branch


【解决方案1】:

回答你用作标题的问题:

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

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

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

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

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

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

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

仅当您在删除分支后立即执行此操作时才有效。如果您已移动 HEAD,则需要运行 git reflog 来查找提交哈希并改用 git checkout <hash>

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

从那里开始,您可以将新分支合并回您的主分支或做任何您想做的事情。你关心的提交现在在一个分支上,所以它不会被下一次 gc 删除。

【讨论】:

    【解决方案2】:

    更改会永远丢失吗?

    没有。您可以通过以下方式恢复已删除的提交:

    $ git reflog
    

    【讨论】:

      【解决方案3】:

      更改会永远丢失吗?

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

      【讨论】:

        猜你喜欢
        • 2021-09-20
        • 2022-11-17
        • 2013-04-18
        • 2015-04-10
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        相关资源
        最近更新 更多