git 分支离开另一个分支

use*_*076 -3 git branch github branching-and-merging

嗨,我有两个并行的“dev”和“prod”分支,我想将另一个本地分支添加到名为“issue22”的本地开发分支(GitPro 将此称为主题分支 - 其他人称之为功能分支)。所以在终端我创建了我的功能/主题分支

git checkout -b issue22 dev
Run Code Online (Sandbox Code Playgroud)

我认为这会“创建一个名为 issue22 的分支”,并从 dev 分支中的相同源代码开始。我期待看到

prod
dev
dev/issue22
Run Code Online (Sandbox Code Playgroud)

但是当我发送命令 git branch -a

相反,我看到

prod
dev
issue22
remotes/origin/head -> origin/master
remotes/origin/dev
remotes/origin/prod
Run Code Online (Sandbox Code Playgroud)

我应该使用什么命令来创建一个新分支,以便“issue22”看起来像一个与“dev”分支并行运行的主题/功能分支,并且似乎也源于 dev 分支?

非常感谢

Chr*_*ris 5

提交之间的父级关系赋予存储库其“结构”。使用 Git 绝对可以实现像Git Flow 网站上显示的那样的可视化。它是围绕Git设计的!

这是一个应该可以帮助您入门的示例:

  1. 首先,创建一个新的存储库并添加一个空提交:

    $ mkdir test-repo && cd test-repo
    $ git init
    $ git commit --allow-empty -m "Initial empty commit"
    
    Run Code Online (Sandbox Code Playgroud)

    在这一点上,你有一个分支和一个提交。你的网络看起来像

    [master]  A
    
    Run Code Online (Sandbox Code Playgroud)

    此处,A代表 Git-Flow 站点最右上角的蓝点。

  2. 此提交在图中缺少其标记。让我们添加它:

    $ git tag -a 0.1
    
    Run Code Online (Sandbox Code Playgroud)

    现在我们有

    [master] [0.1]  A
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在我们将创建我们的develop分支:

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

    此时,我们还没有添加任何develop不在 in 中的提交master,因此分支指向完全相同的提交

    [master] [develop] [0.1]  A
    
    Run Code Online (Sandbox Code Playgroud)
  4. 这里变得有点拥挤。让我们再添加一些提交develop

    $ # Hack, hack, hack...
    $ git add somefile.txt otherfile.dat
    $ git commit
    $ # Hack, hack, hack...
    $ git add foo.bar
    $ git commit
    
    Run Code Online (Sandbox Code Playgroud)

    现在我们的网络更有趣了。当我们创建这两个新提交中的每一个时,我们的develop分支被更新以依次指向它们中的每一个。现在我们有

    [master] [0.1]  A
                     \
    [develop]         B---C
    
    Run Code Online (Sandbox Code Playgroud)

    develop实际上此时指向 commit C,我们可以追溯到Ccommit 的祖先A

  5. 我们可以对 new branch 做同样的事情issue22,尽管它不会被命名,develop/issue22除非我们明确地调用它:

    $ git checkout -b issue22
    $ # Hack, hack, hack...
    $ git add foo.bar
    $ git commit
    
    Run Code Online (Sandbox Code Playgroud)

    现在我们有了

    [master] [0.1]  A
                     \
    [develop]         B---C
                           \
    [issue22]               D
    
    Run Code Online (Sandbox Code Playgroud)

    issue22develop 凭借D其父存在的C分支。我们可以做两个更多的工作developissue22

    [master] [0.1]  A
                     \
    [develop]         B---C---F---G
                           \
    [issue22]               D---E---H
    
    Run Code Online (Sandbox Code Playgroud)

    不改变这种关系。然后我们可以合并issue22develop(或直接合并到master,尽管这不是“Git-Flow 方式”)并得到类似的东西

    [master] [0.1]  A
                     \
    [develop]         B---C---F---G---I
                           \         /
    [issue22]               D---E---H
    
    Run Code Online (Sandbox Code Playgroud)

这个模型可以扩展到任意数量的分支,只要稍加注意,您就可以准确地重现 Git-Flow 图。分支在包含不同的提交之前不会“发散”。

稍微了解一下 Git 的内部工作原理可能会对您有所帮助。网站Think like (a) Git是一个很好的介绍。

  • 谢谢。一个巧妙而彻底解释的答案。非常冷静和知识渊博。你清楚地明白这一点,我很感激你能把它传达给我。非常感谢。 (2认同)