将分支和子分支合并回主分支

Ror*_*ory 1 git

我对 git 的了解有限。

我从 master 创建了一个分支 B1,做了一些编辑并提交到这个分支。

我想从 B1 创建另一个分支 B2,我在 B2 中进行了一些编辑

而且我还想提交并将 B2(从 B2 和 B1 进行编辑)推回 master

我该怎么做,文档假设您总是从 master 创建一个分支,而不是另一个分支。我为我的 git 愚蠢道歉。

Mar*_*ger 6

tayfun 的回答基本上是正确的。如果您想了解更多关于原因的概念背景:

该文档不应该对从 master 分支做出假设(至少如果您正在查看规范的 git 文档,则不会;显然我不知道您在查看什么文档)。示例通常可能master仅仅因为它们是简单的示例而开始,但要理解的是:

没有什么特别之处master

一个分支就是一个分支;其中一个恰好首先出现在那里,按照惯例,它被称为master.

此外,git 没有“父分支”或类似的记忆。在任何给定时间,您都可以专注于当前的提交拓扑。所以:

我从 master 创建了一个分支 B1,做了一些编辑并提交到这个分支。

x -- O <--(master)
      \
       A <--(B1)
Run Code Online (Sandbox Code Playgroud)

我想从 B1 创建另一个分支 B2,我在 B2 中进行了一些编辑

x -- O <--(master)
      \
       A <--(B1)
        \
         B <--(B2)
Run Code Online (Sandbox Code Playgroud)

在这一点上,git 不知道也不关心B2“创建自B1”。除了遵循上述步骤,您还可以说:

  • B2从主创建
  • 进行一些更改并提交(创建A
  • 进行一些更改并提交(创建B
  • 返回A并创建分支B1

一切都会一样。

而且我还想提交并将 B2(从 B2 和 B1 进行编辑)推回 master

这里你的术语很混乱。

Topush是更新远程存储库引用。通常,您的遥控器可以有一个对应于每个本地分支的分支。尽管 git 非常灵活并且您可以以不同的方式使用 push,但它似乎仍然不是您在这里的意思。

将一个本地分支的更改合并到另一个本地分支是为了merge。(实际上有几种方法可以解决这个问题,但从概念上讲,最直接的是合并......)

此外,这触及了对 git 中分支的常见误解 - 更改“属于”这个分支或那个分支。在许多源代码控制系统中这可能是真的,但在 git 中却不是。相反,更改是或不是从分支(或其他参考)“可达”;并且可以(通常)可以从许多参考文献中获得更改。

(本质上,一个分支(或其他 ref)是一个指向提交的指针;该提交可从 ref 访问。如果该提交有父提交,则父提交是可访问的。这通过父指针递归地继续,以便整个历史记录最多可从该 ref 访问 ref。)

所以回到图表

x -- O <--(master)
      \
       A <--(B1)
        \
         B <--(B2)
Run Code Online (Sandbox Code Playgroud)

你所描述是什么AB应该合并master。因为AandB正是可以从 访问B2但不能从访问的提交master,这很简单

git checkout master
git merge B2
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下 git 将在此处采用快捷方式,通过执行“快进”而不是真正的合并。之所以可以这样做master,是因为没有无法从B2. 在这种情况下,git 可以更新master以将其移动到与B2.

x -- O -- A <--(B1)
           \
            B <--(B2)(master)
Run Code Online (Sandbox Code Playgroud)

您可能不希望 git 这样做。(某些分支/合并策略要求保留分支拓扑。)在这种情况下,您可以说

git checkout master
git merge --no-ff B2
Run Code Online (Sandbox Code Playgroud)

这会给你

x -- O --------------- M <--(master)
      \               /
       A <--(B1)     /
        \           /
         B --------/
         ^
       (B2)
Run Code Online (Sandbox Code Playgroud)

M“合并提交”在哪里。如果有其他更改可从 访问master但无法从 访问B2,则合并提交会将这些更改与来自A和的更改合并B

无论哪种方式,B1仍然指向AB2仍然指向B,因此它们都可以从master.