我有两个分支机构。“大师”和“测试”。
___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)
但有没有办法简单地复制分支“测试”?
如果您使用过其他版本控制系统\xe2\x80\x94,尤其是 Mercurial,它确实很像 Git,但有一些关键差异,包括这里的这个\xe2\x80\x94,您可能希望提交能够记住它们是在哪个分支上进行的。
\n\n在 Mercurial 中,他们做到了。
\n\n在 Git 中,他们没有。
\n\n在 Git 中,可以将分支名称视为一种黄色便签。该注释上有分支的名称,但它只是松散地附加到提交本身:
\n\n<--o <--branch\nRun Code Online (Sandbox Code Playgroud)\n\n该提交有自己的传出箭头,该箭头指向该提交的父提交。这建立了一个向后的提交链。如果我们给每个提交一个字母名称并绘制箭头表示谁指向谁,我们会得到:
\n\nA <- B <- C <-- branch\nRun Code Online (Sandbox Code Playgroud)\n\n这A是有史以来的第一次提交。它没有父级\xe2\x80\x94,它不可能有父级,所以它就没有。 B是第二次提交,其父级是A,因此B 指向 A。(从字面上看,内部B有的哈希 ID,作为其自身的一部分。)同样,指向。这个名字记住了提交的又大又难看的哈希IDABCBbranchC,这样我们就不必这样做。
为了制作一个新的提交:
\n\ngit add,都是新的,其他一切都与以前相同。这是分支的秘密:无论你现在在哪个分支,Git都会将新 ID放入分支名称中。现在branch记住我们刚刚做出的新承诺D:
A <- B <- C <- D <-- branch\nRun Code Online (Sandbox Code Playgroud)\n\n实际上,Git 将旧提交上的便利贴撕下来,然后将其粘贴到新提交上。
如果您将多个名称附加到一次提交,然后进行新的提交,Git 只会撕下一张便签纸。因此,如果您创建一个指向 的新名称C,然后进行新的提交D,则只有当前分支名称移动到D,旧的分支名称仍保留C:
A--B--C <-- newname\n \\\n D <-- branch\nRun Code Online (Sandbox Code Playgroud)\n\n答案是HEAD。这就是为什么,如果您使用git log --decorate,您会看到类似以下内容:
commit e0688e9... (HEAD -> master, origin/master, origin/HEAD)\nRun Code Online (Sandbox Code Playgroud)\n\n这告诉我,Git 认为当前分支是,并且当前提交master有三个e0688e9...名称:master、origin/master和origin/HEAD。
| 归档时间: |
|
| 查看次数: |
18107 次 |
| 最近记录: |