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

时间:2017-10-10 13:18:15

标签: git

我对git知之甚少。

我已经从master创建了一个分支B1,进行了一些编辑并提交给了这个分支。

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

我还想提交并推送B2(从B2和B1进行编辑)回到主

如何执行此操作,文档假定您始终从master创建分支,而不是另一个分支。我为我的愚蠢而道歉。

3 个答案:

答案 0 :(得分:4)

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

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

master没有什么特别之处。

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

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

  

我已经从master创建了一个分支B1,进行了一些编辑并提交给了这个分支。

x -- O <--(master)
      \
       A <--(B1)
  

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

x -- O <--(master)
      \
       A <--(B1)
        \
         B <--(B2)

此时,git不知道或不关心B2是从B1创建的。您可以说:

,而不是按照上述步骤操作
  • 从主人
  • 创建B2
  • 进行一些更改并提交(创建A
  • 进行一些更改并提交(创建B
  • 返回A并创建分支B1

一切都会一样。

  

我还想提交并推送B2(从B2和B1进行编辑)回到主

这里你的术语很混乱。

push更新远程存储库ref。通常,您的遥控器可能具有与每个本地分支对应的分支。虽然git非常灵活,你可以以不同的方式使用push,但它仍然不像你的意思。

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

此外,这触及了关于git中分支的常见误解 - 变更“属于”此分支或该分支。在许多源控制系统中可能是真的,但在git中它不是。相反,从分支(或其他参考)“可以”到达或不变化;并且可以(通常是)从许多引用中获得更改。

(本质上,一个分支(或其他ref)是一个指向提交的指针;该提交可以从ref访问。如果该提交有一个父提交,则父提交是可达的。这将通过父指针递归继续,以便可以从该参考文献中获得导致参考的整个历史记录。)

回到图表

x -- O <--(master)
      \
       A <--(B1)
        \
         B <--(B2)

您所描述的是AB应该合并到master。由于AB正好是可以从B2访问但无法从master访问的提交,因此这就像

一样简单
git checkout master
git merge B2

请注意,默认情况下,git会在此处执行快捷方式,方法是执行“快进”而不是真正的合并。这可以完成,因为master没有无法从B2无法进行的更改。在这种情况下,git只需更新master即可将其移至与B2相同的提交。

x -- O -- A <--(B1)
           \
            B <--(B2)(master)

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

git checkout master
git merge --no-ff B2

会给你

x -- O --------------- M <--(master)
      \               /
       A <--(B1)     /
        \           /
         B --------/
         ^
       (B2)

其中M是“合并提交”。如果可以从master到达但B2无法访问的其他更改,则合并提交会将这些更改与AB的更改结合起来。

无论哪种方式,B1仍然指向AB2仍然指向B,因此它们都可以从master完全到达。

答案 1 :(得分:2)

没有什么可以阻止你将任何分支合并回主人。该分支可以从master或任何其他分支分支。只需:

git checkout master
git merge B2

试试这个。如果你想将它重置为原点(假设您的远程仓库被称为原点,或者如果您没有远程仓库,您也可以提供提交哈希),则可以随时git reset --hard origin/master

答案 2 :(得分:1)

让我简要解释git如何运作,以便您理解 让我们在temp/文件夹

中创建一个存储库
$ cd temp
$ git init

现在,使用以下文本

创建一个文件hello.txt
in master

保存,提交更改并使用

检查您的分支名称
$ git add hello.txt
$ git commit -m 'committed in master'
$ git branch
* master                                  # the output

好的,现在您创建一个分支名称B1

$ git checkout -b B1

现在检查hello.txt里面有什么。

$ cat hello.txt
in master

它与master分支具有相同的文本。现在编辑文件并添加一些文本

in master
in B1

您将文件保存在 B1 分支中,并且它具有更新的数据。在 B1

中提交更改并创建新分支
$ git add hello.txt
$ git commit -m 'committed in B1'

创建分支名称B2,而无需返回主

$ git checkout -b B2

如果检查B2中hello.txt的内容,则会有与B2中相同的文本,因为分支B2来自分支B1。现在,如果你回到master分支并看到hello.txt的内容,你会发现==&gt;仅in master,分支 B1和B2 的更改不会影响主分支
现在更改hello.txt的内容

in master
in B1
in B2

保存并提交更改。

现在回到您的问题,您希望从 B2 分支合并 Not push )更改到 B1 。您可以返回分支 B1 来执行此操作。

$ git branch B1                        # To change the branch to B1
$ git merge B2                         # It will merge changes made in B2 to B1

现在检查 B1 hello.txt 的内容。尼斯。对吗?
同样,转到master分支并将 B1 中所做的更改合并到master。你有它。