【发布时间】:2020-10-10 18:45:38
【问题描述】:
考虑以下场景:
- 创建一个干净的 repo 克隆
- 更改一些文件
- 暂存更改
- 创建一个新分支
- 将更改提交到新分支
- 删除分支
更改会永远丢失吗?
【问题讨论】:
-
你从来没有检出一个新的提交或分支,所以即使“旧分支”消失了,它指向的提交实际上是在你当前的分支中。
标签: git git-branch
考虑以下场景:
更改会永远丢失吗?
【问题讨论】:
标签: git git-branch
回答你用作标题的问题:
在一个分支上提交更改是否会从其他分支丢弃它们?
当您提交到某个分支时,不会从其他分支中删除任何内容。在您的场景中,您从未将更改添加到主分支。它们在您的工作树中(当您编写这些更改时),然后您更新了索引以匹配您的工作树(当您暂存这些更改时),但您从未将更改添加到主分支,因为您从未提交到该分支。所以不是他们被从那个分支中删除,而是他们从未被添加到它。
可能给您的印象是您的更改已被删除,当您切换到新分支以在那里提交您的更改,然后切换回您的主分支时,工作树会更新以匹配分支上的内容并且您再也看不到更改了。
至于更改是否永远丢失,@Paolo 和@matt 已经回答:
在下一次垃圾回收 (gc) 之前,更改不会丢失,默认情况下,每 30 天运行一次。当指向该快照的提交被下一次 gc 清理时,它们确实会丢失,因为它不在任何分支上。
在此之前,您可以恢复您的更改,例如,通过:
git checkout HEAD@{1}
仅当您在删除分支后立即执行此操作时才有效。如果您已移动 HEAD,则需要运行 git reflog 来查找提交哈希并改用 git checkout <hash>。
git checkout -b newbranch
从那里开始,您可以将新分支合并回您的主分支或做任何您想做的事情。你关心的提交现在在一个分支上,所以它不会被下一次 gc 删除。
【讨论】:
更改会永远丢失吗?
没有。您可以通过以下方式恢复已删除的提交:
$ git reflog
【讨论】:
更改会永远丢失吗?
不是马上。但是如果没有引用(例如标签或分支名称)指向提交或其后代之一,那么是的,它最终会被清理并丢失。
【讨论】: