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

Hen*_*aul 4 git branch

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

但有没有相反的东西,从一个节点中同时分支?

我们假设我有一堆项目代码,我刚开始使用Git.该项目中的一些功能已完成,其他功能仍在进行中.我会希望是让搬进自己的那些未完成的功能,相应的独立的分支,有主的"完整"地,没有未完成的代码.

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

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

Jak*_*ski 11

附注:章鱼合并章鱼分支点的情况有很大的不同.请记住,提交的DAG(有向无环图)中的指针指向从子(较新的提交)到父或父.因此,在章鱼合并的情况下,你有提交(提交对象),它有两个以上的父母; 在"章鱼分支点"的情况下,您只需要一些提交指向与其父级相同的提交.

章鱼合并:

1 <---- M
2 <----/ |
3 <------|
Run Code Online (Sandbox Code Playgroud)

章鱼分支点:

P <----- 1
^-------- 2
^-------- 3
Run Code Online (Sandbox Code Playgroud)

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


答案

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

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

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

$ git checkout -b A master
Run Code Online (Sandbox Code Playgroud)

Git回复:

M       a
M       b
Switched to a new branch "A"
Run Code Online (Sandbox Code Playgroud)

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

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

$ git add a
Run Code Online (Sandbox Code Playgroud)

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

现在我们对分支'A'进行更改

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

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

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

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

$ git checkout -b B master
M       b
Switched to a new branch "B"
Run Code Online (Sandbox Code Playgroud)

您可以很容易地看到您为分支"B"所做的更改(您未提交到分支"A"的更改)将转到新创建的分支"B".无需删除文件或删除更改.不需要知道其他分支是什么.一切都是自动的.
再一次,将文件'b'的内容添加到临时区域(索引),并在分支'B'上提交:

$ git add B
$ git commit
Run Code Online (Sandbox Code Playgroud)

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

HTH