在git中删除合并的分支安全吗

在git中删除合并的分支安全吗,git,github,merge,Git,Github,Merge,假设我们在分支中开发了一个特性,认为它是完整的,将它合并为主功能并删除分支。后来在这个特定的特性中发现了bug,有人去重置全局存储库上的头部(您不应该这样做)。现在,我们可以修复这个bug,但是不再有分支,整个功能都丢失了。是否有方法恢复这些更改,合并后保留功能分支一段时间是否总体上是个好主意?您可以使用reflog恢复所有提交。请参阅下面的链接 链接摘录: 例如,考虑下面的回购: $ git show-ref -h HEAD 7c61179cbe51c050c5520b4399f7b14

假设我们在分支中开发了一个特性,认为它是完整的,将它合并为主功能并删除分支。后来在这个特定的特性中发现了bug,有人去重置全局存储库上的头部(您不应该这样做)。现在,我们可以修复这个bug,但是不再有分支,整个功能都丢失了。是否有方法恢复这些更改,合并后保留功能分支一段时间是否总体上是个好主意?

您可以使用reflog恢复所有提交。请参阅下面的链接

链接摘录:

例如,考虑下面的回购:

$ git show-ref -h HEAD
  7c61179cbe51c050c5520b4399f7b14eec943754 HEAD

$ git reset --hard HEAD^
  HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid

$ git show-ref -h HEAD
  39ba87bf28b5bb223feffafb59638f6f46908cac HEAD
现在头部向后移动1个提交。让我们看看git是否知道已删除的提交

$ git reflog
  39ba87b... HEAD@{0}: HEAD~1: updating HEAD
  7c61179... HEAD@{1}: pull origin master: Fast forward
  [... lots of other refs ...]
现在我们有了我们的SHA1:7c61179。如果我们想立即将其应用回当前分支,则执行git合并将恢复提交:

$ git merge 7c61179
  Updating 39ba87b..7c61179
  Fast forward
    css/screen.css |    4 ++++
    submit.html    |    4 ++--
    2 files changed, 6 insertions(+), 2 deletions(-)

此命令将恢复丢失的更改,并确保头部指向提交。从这里你可以继续正常工作

是的,通常最好将功能分支保留一段时间,至少在您100%确定永远不会返回之前

它不会伤害任何东西,也不会占用任何资源。分支只是指向提交的小便签。它在
git
中的唯一作用是防止垃圾收集器无法恢复地删除它指向的提交(及其祖先)

对于您当前的场景,我只需创建一个分支(或标记),指向有错误版本的
master
,然后将master重置回合并点后面。然后您就全部设置好了-
git
不会自动删除您原本“丢失”的分支,您可以在准备好后返回

当然,如果您想从它生成一个“真正的”分支,您需要在合并之前在分支端找到提交,然后执行
git branch mybranch
,这可能是最佳选择。

示例 使用释放分支。比如说,当您在项目开发中达到一个重要的里程碑时(完成并合并了一个新特性),您就可以进入生产环境

创建一个标记

git tag -a v1.0.0 -m "v1.0.0"
现在,假设您继续工作并开始使用一个新功能,过了一段时间后,您意识到有一个bug与您以前合并的功能一起引入。合并并删除后如何返回到它

让我们回到合并新功能时创建的标记

git checkout v1.0.0
我们不能直接提交到标签,但我们可以从中创建一个新的分支(发布分支)

现在我们可以应用热修复,然后将更改添加并提交到分支

git add <file> <file> 
git commit -m "<hot fix message>"
为了保持整洁,我们还将在此时删除发布分支

git branch -d rb1.0.0

假设在合并之前,提交历史是这样的。

功能
合并到
主功能
后,它变成了这样。

现在分支
功能
已被删除,情况如下。

正如我们所看到的,尽管ref
功能
已经消失,但是
功能
的提交历史仍然存在。branch ref只是一个变量,它存储从那时到现在指向的提交的sha1散列

M
是在将
功能
合并到
时创建的合并提交(仅当它是真正的合并,非快进合并时)。它有两个父级,
D
第一个父级,它指向
master
,而
F
第二个父级,它指向
feature
。如果我们将
master
合并到
feature
并创建
M
,那么
F
是第一个父级,而
D
是第二个父级

第一个父项可以通过
M^
引用,第二个父项可以通过
M^2
引用

现在,如果要重新创建分支ref
功能
,假设
M
的值为
af234342
,则可以运行
git分支功能af234342^2
。而且还会是这样。

合并一段时间后保留要素分支总体上是个好主意吗


视情况而定。有些人认为保留所有曾经存在的更改是很好的,包括所有提交和所有分支、标记等。毕竟,这些都是项目的宝贵遗产。

它不会伤害任何东西或占用任何资源,它占用认知资源,当你注意到你的回购有79个分支时,你会有一种古老的“WTF”感觉,有些可以追溯到六个月前。为什么回购协议中的分支机构数量会占用认知资源?“通常切断分支机构只会释放出一个非常小的、不可预测的空间。”这是在,我同意@Anoe的说法,它不会伤害任何东西或占用任何资源。没有人有一个克隆仍然包含合并提交?更新了答案。谢谢你的指导。
git checkout master
git merge rb1.0.0 -m "Merged <hot fix message>"
git branch -d rb1.0.0