是否存在Git'的反比;什么是章鱼合并?

是否存在Git'的反比;什么是章鱼合并?,git,branch,Git,Branch,Git有一个广受吹捧的(?)八达通合并功能,可以将多个头合并成一个 但是,是否有相反的方法,从一个节点同时生成几个分支 让我们假设我有一堆项目代码,我刚刚开始使用Git。该项目中的一些功能已完成,其他功能仍在进行中。我想要的是将那些未完成的特性移到它们各自独立的分支中,并使主程序尽可能“完整”,没有未完成的代码 现在,我当然可以一步完成所有这些:创建一个“未完成的特性#1”分支,并从主控中删除特定于该特性的文件。然后,我将主文件重新分支到“未完成的特性2”,并再次从主文件中删除特性2特定的文件,

Git有一个广受吹捧的(?)八达通合并功能,可以将多个头合并成一个

但是,是否有相反的方法,从一个节点同时生成几个分支

让我们假设我有一堆项目代码,我刚刚开始使用Git。该项目中的一些功能已完成,其他功能仍在进行中。我想要的是将那些未完成的特性移到它们各自独立的分支中,并使主程序尽可能“完整”,没有未完成的代码

现在,我当然可以一步完成所有这些:创建一个“未完成的特性#1”分支,并从主控中删除特定于该特性的文件。然后,我将主文件重新分支到“未完成的特性2”,并再次从主文件中删除特性2特定的文件,但也从第一个分支中删除。因此,我做的每一次分割都会增加工作量


在这种情况下,有什么东西可以帮助我吗?

因为您刚刚开始使用Git,所以重新开始并只将“完整”代码提交给主分支会更容易。然后从主功能签出新的分支,并在其自己的分支上提交“未完成”的功能代码。对每个要素分支重复此操作


您必须将代码划分为多个功能并“完成”,因此使用这些功能来设置存储库

旁注:八达通合并和八达通分支点场景非常不同。请记住,提交的DAG(有向无环图)中的指针从子(较新的提交)指向父或父。因此,在八达通合并的情况下,您有commit(commit对象),它有两个以上的父对象;在“octopus branchpoint”的情况下,您只需要有几个提交指向与其父级相同的提交

八达通合并:

1 <---- M
2 <----/ |
3 <------|
Git回复如下:

M       a
M       b
Switched to a new branch "A"
“M”表示文件“a”和“b”相对于您基于分支“a”的点(“主”分支)进行修改。(下面,我将简单地将git响应放在命令行调用下面,而不是单独指出什么是应答。)

让我们将文件“a”的内容添加到临时区域(索引)

请注意,如果您只想将文件“a”中的某些更改子集添加到分支“a”,则可以使用“git add--interactive”(缩写为“-i”)或“git gui”对暂存区域进行逐块添加更改和其他此类操作

现在我们将更改提交到分支“A”

$ git checkout -b A master
$ git commit
Created commit 35d0061: Commit description...
 1 files changed, 1 insertions(+), 0 deletions(-)
注意我们没有使用'-a'选项提交git

顺便说一句,如果您想在从暂存区输入之前测试更改,可以使用“git stash save--keep index”将工作区设置为要使用“git commit”提交的状态,测试更改,然后使用“git stash pop--index”(或“git stash pop”;我不记得这里需要哪个状态)

现在,我们根据分支“master”创建另一个分支“B”

$ git checkout -b B master
M       b
Switched to a new branch "B"
您可以很容易地看到,为分支“B”留下的更改(您没有提交到分支“A”的更改)将转到新创建的分支“B”。无需删除文件或删除更改。不需要知道其他分支中有什么。一切都是自动的。
再次将文件“b”的内容添加到临时区域(索引),并在分支“b”上提交:

$ git add B
$ git commit
您可以根据需要经常重复这一过程,而使用新分支不会变得更困难


HTH

重新命名:将其中一张图片上的箭头颠倒,则会显示另一张图片。我会说,打个比方,称这种“章鱼”是“合理的,如果有误导性”,而不是“完全错误”。但是“章鱼”这个名字在这里是因为它有两条腿以上(父母)。分支点没有多个分支。而且你不能回复箭头:指针指向一个特定的方向,而不是另一个方向。+1与其对抗git的工作方式,不如接受它,减少损失,继续前进。
$ git checkout -b B master
M       b
Switched to a new branch "B"
$ git add B
$ git commit