【问题标题】:Create a branch in Git from another branch从另一个分支在 Git 中创建一个分支
【发布时间】:2011-05-27 02:41:15
【问题描述】:

我有两个分支:ma​​sterdev

我想从 dev 分支创建一个“功能分支”。

目前在 dev 分支上,我这样做:

$ git checkout -b myfeature dev

...(一些工作)

$ git commit -am "blablabla"
$ git push origin myfeature

但是,在可视化我的分支之后,我得到了:

--**master**
------0-----0-----0-----0-----0
------------------------**dev**----**myfeature**

我的意思是分支似乎合并了,我不明白为什么......

我做错了什么?

你能解释一下你是如何从另一个分支分支出来并推送回功能分支的远程存储库的吗?

所有这些都在像 the one described here 这样的分支模型中。

【问题讨论】:

    标签: git git-branch git-workflow git-flow


    【解决方案1】:

    如果您喜欢您发布的链接中的方法,请查看Git Flow

    这是他为该工作流程创建的一组脚本。

    但要回答你的问题:

    $ git checkout -b myFeature dev
    

    从 dev 中创建 MyFeature 分支。做你的工作,然后

    $ git commit -am "Your message"
    

    现在将您的更改合并到 dev 中,无需快进

    $ git checkout dev
    $ git merge --no-ff myFeature
    

    现在将更改推送到服务器

    $ git push origin dev
    $ git push origin myFeature
    

    你会看到你想要的样子。

    【讨论】:

    • myFeaturedev合并后推送有什么意义?
    • @spartacus 如果myFeature 分支在合并之前被推送到服务器,那么什么都没有。但是如果myFeature 还没有推送到服务器,而你希望它出现在服务器中,则必须将其推送到 appart 中。
    • git checkout -b myFeature dev 与这3个命令相同:git checkout dev,然后是git branch myFeature,然后是git checkout myFeature
    • 是,或者应该是。你看到了什么不同的东西吗?
    • 为其他新手澄清,this is what a --no-ff merge looks like
    【解决方案2】:

    如果您想从 Git 中的任何现有分支创建新分支,只需按照选项操作即可。

    首先更改/签出到要创建新分支的分支。例如,如果您有以下分支,例如:

    • 大师
    • 开发
    • branch1

    所以如果你想在名为 "branch1" 的分支下创建一个名为 "subbranch_of_b1" 的新分支> 请按照以下步骤操作:

    1. 结帐或更改为“branch1”

      git checkout branch1
      
    2. 现在使用以下命令在 "branch1" 下创建名为 "subbranch_of_b1" 的新分支。

      git checkout -b subbranch_of_b1 branch1
      

      上面将在分支 branch1 下创建一个名为 subbranch_of_b1 的新分支(请注意,上述命令中的 branch1 不是强制性的,因为 HEAD 当前指向如果你在不同的分支上,你可以精确它)。

    3. 现在使用 subbranch_of_b1 后,您可以在本地或远程提交和推送或合并它。

    将 subbranch_of_b1 推送到远程

     git push origin subbranch_of_b1 
    

    【讨论】:

    • 如何将 subbranch_of_b1 推送到远程??
    • @user269867 :“ git push origin subbranch_of_b1 ”将为您完成这项工作。
    • 现在,如果我将更改推送到 master ,它会自动发生在 branch1 中吗?
    • 请注意,上述命令中的 branch1 不是强制性的,因为 HEAD 当前指向它,但如果您在不同的分支上,您可以精确它 这就是我正在寻找
    • 我来到这里想知道git checkout -b some-branch 是否是git checkout -b some-branch master 的简写。原来git checkout -b some-branchgit checkout -b some-branch <current_active_branch>的简写
    【解决方案3】:

    创建分支

    • 签出主分支时创建分支。这里 master 中的提交将同步到您创建的分支。

      $ git branch branch1

    • 在 branch1 签出时创建分支。这里 branch1 中的提交将同步到 branch2

      $ git branch branch2


    结帐分行

    git checkout 命令切换分支或恢复工作树文件

    • $ git checkout branchname

    重命名分支

    • $ git branch -m branch1 newbranchname

    删除分支

    • $ git branch -d branch-to-delete
    • $ git branch -D branch-to-delete (不检查合并状态就强制删除)

    创建和切换分支

    • $ git checkout -b branchname

    完全包含的分支

    • $ git branch --merged


    ************************** 分支差异 [ git diff branch1..branch2 ] **** ********************

    多行差异
    • $ git diff master..branch1
    单行差异
    • $ git diff --color-words branch1..branch2

    【讨论】:

    • 同样在重命名分支后使用git push origin :old-name new-name删除旧名称远程分支并推送新名称本地分支。
    【解决方案4】:

    要从本地目录中的另一个分支创建分支,您可以使用以下命令。

    git checkout -b <sub-branch> branch
    

    例如:

    • 要创建的新分支的名称'XYZ'
    • 必须在其下创建 XYZ 的分支 ABC 的名称
    git checkout -b XYZ ABC
    

    【讨论】:

      【解决方案5】:

      在 git 中从另一个分支创建分支的各种方法:

      这个答案增加了一些额外的见解,现有答案中没有,仅关于问题本身的标题从另一个分支在 Git 中创建一个分支) , 但 没有 解决问题的更狭窄的细节,这里已经有足够的答案。

      我之所以添加这个,是因为我现在真的需要知道如何执行下面的 #1(从我没有签出的分支创建一个新分支),并且不清楚如何执行,并且谷歌搜索导致这里成为热门搜索结果。所以,我将在这里分享我的发现。此处的任何其他答案都没有很好地涉及到这一点。

      在此期间,我还将在下面添加我在常规工作流程中使用的其他最常见的git branch 命令。

      1。要从您尚未签出的分支创建新分支:

      branch1 创建branch2,同时签出任何分支(例如:假设您已签出master):

      git branch branch2 branch1
      

      一般格式为:

      git branch <new_branch> [from_branch]
      

      man git branch 显示如下。我叫&lt;new_branch&gt; 就是他们叫&lt;branchname&gt;,我叫[from_branch] 就是他们叫[&lt;start-point&gt;]

      git branch [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
      

      2。要从您已签出的分支创建新分支:

      git branch new_branch
      

      这非常适合在变基、压缩、硬重置等之前进行备份——在做任何可能严重破坏你的分支的事情之前。

      例如:我在 feature_branch1,我即将使用 git rebase -i master 将 20 个提交压缩为 1 个。如果我想“撤消”这个,让我们先备份这个分支!我这样做 ALL...THE...TIME 并发现知道我总是可以轻松回到这个备份分支并重新分支非常有帮助和安慰如果我在此过程中搞砸了feature_branch1,请再试一次:

      git branch feature_branch1_BAK_20200814-1320hrs_about_to_squash
      

      20200814-1320hrs 部分是格式为 YYYYMMDD-HHMMhrs 的日期和时间,因此将是 2020 年 8 月 14 日的 13:20 小时(下午 1:20)。这样我可以轻松找到我的备份分支,直到我确定我已经准备好删除它们了。如果你不这样做并且你搞砸了,你必须在搞砸之前使用git reflog去找到你的分支,这更难,压力更大,更容易出错。

      3。从您已签出的分支创建并签出一个新分支:

      git checkout -b new_branch
      

      为了明确那里发生的事情,要知道上面的这个命令等同于以下 两个 单独的命令:

      git branch new_branch
      git checkout new_branch
      

      4。要从您尚未签出的分支创建并签出一个新分支:

      git checkout -b new_branch from_branch
      

      为了让那里发生的事情一目了然,要知道上面的这个命令等同于以下 三个 单独的命令:

      git checkout from_branch
      git branch new_branch
      git checkout new_branch
      

      5。重命名分支

      就像重命名终端中的常规文件或文件夹一样,git 认为“重命名”更像是一个“m”ove 命令,因此您使用 git branch -m 重命名分支。这是一般格式:

      git branch -m <old_name> <new_name>
      

      man git branch 显示如下:

      git branch (-m | -M) [<oldbranch>] <newbranch>
      

      示例:让我们将branch_1 重命名为branch_1.5

      git branch -m branch_1 branch_1.5
      

      或者,如果您已经签出 branch_1,您可以将 currently-checked-out 分支重命名为 branch_1.5,如下所示:

      git branch -m branch_1.5
      

      【讨论】:

      • 最佳答案。其他答案令人困惑,因为他们倾向于使用git checkout同时关注分支和切换到创建的分支。
      【解决方案6】:

      Git 2.23 引入git switchgit restore 来拆分git checkout 的职责

      从 git 2.23 的现有分支创建新分支:

      git switch -c my-new-branch

      切换到新分支“my-new-branch”

      • -c--create 的缩写,取代了众所周知的 git checkout -b

      查看this Github 博客文章,更详细地解释更改:

      Git 2.23 为现有的套件带来了一对新的实验性命令 那些:git switchgit restore。这两个是为了最终 为著名的 git checkout 提供更好的接口。新的 命令意在各有分明,整齐划一 git checkout

      的许多职责是什么

      【讨论】:

        【解决方案7】:

        同时在dev 分支上工作。发生的情况是,在您的场景中,功能分支从 dev 分支的尖端向前移动,但 dev 分支不会改变。它更容易画成一条直线,因为它可以被认为是向前运动。您到达了 dev 上的 A 点,然后您只需继续沿着平行路径前进。这两个分支并没有真正分道扬镳。

        现在,如果您在 dev 上进行提交,在合并之前,您将再次从同一个提交 A 开始,但现在功能将转到 C,将 dev 转到 B。这将显示您尝试可视化的拆分,因为现在分支已经分岔了。

        *-----*Dev-------*Feature
        

        对比

               /----*DevB
        *-----*DevA
               \----*FeatureC
        

        【讨论】:

          【解决方案8】:

          如果您想从另一个分支创建一个分支,请按照以下步骤操作:

          假设

          1. 您目前在 master 分支中。
          2. 您没有要提交的更改。 (如果您有任何更改要提交,请将其隐藏!)。
          3. BranchExisting 是分支的名称,您需要从中创建一个名为 BranchMyNew 的新分支。

          步骤

          1. 获取分支到本地机器。

            $ git fetch origin BranchExisting : BranchExisting
            

          此命令将在您的本地创建一个具有相同分支名称的新分支。

          1. 现在,从 master 分支结帐到新获取的分支

            $ git checkout BranchExisting
            
          2. 您现在在 BranchExisting 中。现在从这个现有分支创建一个新分支。

            $ git checkout -b BranchMyNew
            

          给你!

          【讨论】:

            【解决方案9】:

            如果要从另一个分支创建分支,也可以使用以下语法:

            git push origin refs/heads/<sourceBranch>:refs/heads/<targetBranch>
            

            比“git checkout -b”+“git push origin”略短

            【讨论】:

              【解决方案10】:

              切换到开发分支:

              $ git checkout develop
              

              创建develop的feature/foo分支。

              $ git checkout -b feature/foo develop
              

              合并更改以进行开发,无需快进

              $ git checkout develop
              $ git merge --no-ff myFeature
              

              现在将更改推送到服务器

              $ git push origin develop
              $ git push origin feature/foo
              

              【讨论】:

              • 不确定为什么需要此评论,因为它与已接受的答案非常一致,并且在 cmets 中的上下文也较少。
              猜你喜欢
              • 2021-08-09
              • 1970-01-01
              • 2017-07-04
              • 1970-01-01
              • 2022-10-25
              • 2016-12-15
              • 1970-01-01
              • 1970-01-01
              • 2018-09-11
              相关资源
              最近更新 更多