让我们假设一个功能分支在合并到主服务器后被删除了。
几天/几周后,我需要为该功能分支中的所有提交生成补丁文件。
如果我有功能分支,我可以使用以下命令生成补丁:
git format-patch $(git merge-base master my_feature_branch)..my_feature_branch
那么,我怎样才能重新创建功能分支,以便我可以使用上面的命令?
答案 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
以某种方式弄清楚自从我们最后一次合并它们之后我们在master
和feature
中发生了什么变化(实际上从来没有,但它们在同一时间在一起,在标记的点上*
这里)。然后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-patch
,M
和/或{ {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
并包含提交P
和Q
。与此同时,提交O
已添加到主分支。功能分支在提交R
中合并。之后,创建了提交S
和T
,这是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)
如果你有一个基本提交,即现在删除的功能分支已经分歧的那个,你可以按照以下步骤进行 -
git cherry-pick
,挑选将功能分支合并为主服务器的合并提交。如果这不起作用,您可以选择属于功能分支的单个提交。