如何重新创建合并的Git分支

时间:2017-08-01 21:23:25

标签: git

让我们假设一个功能分支在合并到主服务器后被删除了。

几天/几周后,我需要为该功能分支中的所有提交生成补丁文件。

如果我有功能分支,我可以使用以下命令生成补丁:

git format-patch $(git merge-base master my_feature_branch)..my_feature_branch

那么,我怎样才能重新创建功能分支,以便我可以使用上面的命令?

3 个答案:

答案 0 :(得分:4)

嗯,首先,分支机构并没有真正被删除。只删除分支名称。但这让我们陷入一个棘手的问题:What exactly do we mean by "branch"?

让我们快速浏览一下合并的过程。我们从提交图(或“DAG”;参见链接问题)中的一系列提交开始,如下所示:

...--o--*-----o   <-- master
         \
          o--o--o--o--o   <-- feature

然后我们运行:

git checkout master
git merge feature

以某种方式弄清楚自从我们最后一次合并它们之后我们在masterfeature中发生了什么变化(实际上从来没有,但它们在同一时间在一起,在标记的点上*这里)。然后Git创建一个新的 merge commit ,它指向这两个分支提示:

...--o--*-----o---------o   <-- master
         \             /
          o--o--o--o--o   <-- feature

我们有一个“合并”:提交类型为合并提交

我们现在可以删除单词feature和箭头,即删除名称保持不变,由名称master保留:

...--o--*-----o---------M   <-- master
         \             /
          o--o--o--o--F

我们是否希望通过master查看进入feature的内容,我们所要做的就是在此处找到我标记为F(针对功能)的提交。请注意,我还标记了合并提交M(用于合并)。

找到它的方法是从master开始并向后工作,直到我们找到M。 (现在就在master的顶端,虽然稍后会从提示中返回一些步骤。)然后,我们只看一下第二个父提交 M

要查找我们知道其哈希ID的提交的第二个父级,我们只告诉Git:告诉我这个其他哈希ID的第二个父级的哈希ID。这样做的简单方法是git rev-parse。假设M的哈希ID为badf00d

git rev-parse badf00d^2

Git吐出F的完整哈希ID。帽子两个后缀意味着“第二个父母”(帽子一个,或者只是帽子本身,意思是“第一个父母”)。

现在我们可能还想找到提交*。那是{em> {<1>}的第一个父项的提交的合并基础,以及我们刚刚找到的这个特定提交M。为了找到两个提交的合并基础,我们问Git:

F

然后,我们可以查看合并基础git merge-base badf00d^1 badf00d^2 之后开始的范围内的每个提交,并使用*F或者git log或不管。

我们可以使用原始哈希来执行此操作,或者我们可以指定名称(临时或永久,他们将完全按照您的意愿生活)来提交git format-patchM和/或{ {1}},使用F*。每个名称都会记住您的哈希ID。标记名称和分支名称之间的主要区别在于,如果您git branch标记名称,则会获得“分离的HEAD”并且不在分支上,但如果您git tag是分支名称,你进入那个分支,如果你进行 new 提交,它们将导致该分支前进:

git checkout

这就是Git中的所有分支:名称只指向提交,而分支结构,历史或DAGlet或任何你想要的名称,是由提交DAG的永久部分组成。分支机构名称具有以下特殊功能:git checkout它们可以通过运行$ git branch newname <hash-ID-of-commit-F> ...--o--*-----o---------M--o--o--o <-- master \ / o--o--o--o--F <-- newname $ git checkout newname ... hack away ... $ git commit ... ...--o--*-----o---------M--o--o--o <-- master \ / o--o--o--o--F--o <-- newname (HEAD) 来提升它们。

答案 1 :(得分:1)

让我们假设以下简化历史记录:功能分支基于提交N并包含提交PQ。与此同时,提交O已添加到主分支。功能分支在提交R中合并。之后,创建了提交ST,这是master现在的位置。

M -- N -- O -- R -- S -- T [master]
      \       /
       P --- Q

您想要找到提交Q。我不认为有一种编程方式可以执行此操作,因此您需要使用任何存储库浏览器,例如gitk

找到Q后,您可以轻松地重新创建要素分支:

$ git branch my_feature_branch <hash of commit Q>

我不确定你是否意识到这一点,但理解这一点的一个关键是知道一个分支不仅仅是一个&#34;指针&#34;或&#34;书签&#34;提交。

答案 2 :(得分:0)

如果你有一个基本提交,即现在删除的功能分支已经分歧的那个,你可以按照以下步骤进行 -

  1. 根据基本提交检出分支。
  2. 使用git cherry-pick,挑选将功能分支合并为主服务器的合并提交。如果这不起作用,您可以选择属于功能分支的单个提交。