Git的章鱼合并是否有反转?

时间:2009-01-14 16:48:52

标签: git branch

Git有一个备受吹捧的(?)章鱼合并功能,可以将多个头合并为一个。

但有没有相反的做法,从一个节点中同时生成几个分支?

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

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

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

2 个答案:

答案 0 :(得分:11)

旁注: 章鱼合并章鱼分支场景非常不同。请记住,提交的DAG(有向无环图)指针从子(较新的提交)指向父或父。所以在octopus merge 的情况下,你有提交(提交对象),它有两个以上的父母;在“章鱼分支点”的情况下,你只需要一些提交指向与其父级相同的提交。

章鱼合并:

1 <---- M
2 <----/ |
3 <------|

章鱼分支点:

P <----- 1
^-------- 2
^-------- 3

所以我认为这个问题的命名是错误的


答案

现在,如果您要做的是在不同分支之间拆分工作区域中的修改,将每个功能放在单独的主题分支中,您可以使用显式临时区域(也就是索引) )在Git。

假设您修改了两个文件'a'和'b',并且您希望修改文件'a'转到分支'A',并修改文件'b'转到分支'B' 。让我们假设你当前所在的分支,你想要成为许多分支的基础的分支点,被命名为“master”。

首先,让我们创建分支'A'

$ git checkout -b A master

Git回复:

M       a
M       b
Switched to a new branch "A"

“M”表示文件'a'和'b'相对于基于分支'A'的点('master'分支)进行修改。 (下面,我将简单地将git响应放在命令行调用之下,而不是单独注意什么是回复。)

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

$ git add a

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

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

$ git commit
Created commit 35d0061: Commit description...
 1 files changed, 1 insertions(+), 0 deletions(-)

注意我们没有使用'-a'选项进行git-commit!

顺便说一句,如果你想在从暂存区域进行测试之前测试更改,你可以使用“git stash save --keep-index”来使用“git commit”获取你要提交的状态的工作区域,test改变,然后使用“git stash pop --index”(或“git stash pop”;回到以前的状态;我不记得你在这里需要哪一个)。

现在我们创建另一个分支,分支'B',基于分支'master'

$ 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 :(得分:1)

由于您刚开始使用Git,因此再次启动并将“完整”代码提交给Master分支会更容易。然后从主服务器中检出一个新功能,并在其自己的分支上提交“未完成”功能代码。对每个功能分支重复此操作

无论如何,您必须将代码分区为功能和“完整”,因此请使用它来设置存储库。