如何复制分支

The*_*ron 4 git merge branch

我有两个分支机构。“大师”和“测试”。

                ___testing____  
               /
------master--------
Run Code Online (Sandbox Code Playgroud)

我想继续测试分支来添加功能,但在此之前,我需要将测试分支合并到master。我想创建第三个名为“testing2”的分支,它与“testing”完全相同,但来自“master”分支,而不是“testing”的分支。

                   _____testing___
                  /
---------master----------
                  \____testing2____
Run Code Online (Sandbox Code Playgroud)

作为替代方案,我知道我可以将“测试”分支合并到“主”并创建两个新分支并以这种方式完成我的工作,

                _____testing_____        ____newtest___
               /                 \      /                 
---master-------------------------------------------------
                                        \____continuetest_____
Run Code Online (Sandbox Code Playgroud)

但有没有办法简单地复制分支“测试”?

tor*_*rek 6

如果您使用过其他版本控制系统\xe2\x80\x94,尤其是 Mercurial,它确实很像 Git,但有一些关键差异,包括这里的这个\xe2\x80\x94,您可能希望提交能够记住它们是在哪个分支上进行的。

\n\n

在 Mercurial 中,他们做到了。

\n\n

在 Git 中,他们没有。

\n\n

分支名称只不过是指向一个分支的标签提交的标签

\n\n

在 Git 中,可以将分支名称视为一种黄色便签。该注释上有分支的名称,但它只是松散地附加到提交本身:

\n\n
<--o   <--branch\n
Run Code Online (Sandbox Code Playgroud)\n\n

该提交有自己的传出箭头,该箭头指向该提交的父提交。这建立了一个向后的提交链。如果我们给每个提交一个字母名称并绘制箭头表示谁指向谁,我们会得到:

\n\n
A <- B <- C   <-- branch\n
Run Code Online (Sandbox Code Playgroud)\n\n

A是有史以来的第一次提交。它没有父级\xe2\x80\x94,它不可能有父级,所以它就没有。 B是第二次提交,其父级是A,因此B 指向 A。(从字面上看,内部B有的哈希 ID,作为其自身的一部分。)同样,指向。这个名字记住了提交的又大又难看的哈希IDABCBbranchC,这样我们就不必这样做。

\n\n

为了制作一个新的提交:

\n\n
    \n
  1. Git 收集日志消息您的
  2. \n
  3. Git 写出索引(又名暂存区):您更新过的任何内容git add,都是新的,其他一切都与以前相同。
  4. \n
  5. Git 写出一个新的提交。新提交的父级是当前提交(其哈希 ID)。新提交的日志消息是您编写的日志消息;新提交的作者和提交者是您;和被拯救的(源代码)是写出索引的结果。
  6. \n
  7. 这个新的提交有一个新的、唯一的哈希 ID,与所有其他提交不同。
  8. \n
  9. 这是分支的秘密:无论你现在在哪个分支,Git都会将新 ID放入分支名称中。现在branch记住我们刚刚做出的承诺D

    \n\n
    A <- B <- C <- D   <-- branch\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    实际上,Git 将旧提交上的便利贴撕下来,然后将其粘贴到新提交上。

  10. \n
\n\n

如果您将多个名称附加到一次提交,然后进行新的提交,Git 只会撕下一张便签纸。因此,如果您创建一个指向 的新名称C,然后进行新的提交D,则只有当前分支名称移动到D,旧的分支名称仍保留C

\n\n
A--B--C     <-- newname\n       \\\n        D   <-- branch\n
Run Code Online (Sandbox Code Playgroud)\n\n

你现在应该问 Git 如何知道哪个标签是当前分支!

\n\n

答案是HEAD。这就是为什么,如果您使用git log --decorate,您会看到类似以下内容:

\n\n
commit e0688e9... (HEAD -> master, origin/master, origin/HEAD)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这告诉我,Git 认为当前分支是,并且当前提交master三个e0688e9...名称:masterorigin/masterorigin/HEAD

\n