4

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

但是有没有相反的方法,从一个节点同时产生多个分支?

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

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

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

4

2 回答 2

11

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

章鱼合并:

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 response 放在命令行调用下面,而不是单独注明什么是回复。)

让我们将文件“a”的内容添加到暂存区(索引)。

$ git add a

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

现在我们将更改提交到分支“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”提交的状态,测试更改,然后使用“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

您可以根据需要经常重复此操作,并且新分支不会变得更难。

高温高压

于 2009-01-14T18:16:29.513 回答
1

由于您刚刚开始使用 Git,因此重新开始并仅将“完整”代码提交到 Master 分支会更容易。然后从 master 签出一个新的分支以获得一个特性,并在它自己的分支上提交那个“未完成”的特性代码。对每个功能分支重复。

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

于 2009-01-14T18:06:36.990 回答