1376

我有两个分支:masterdev

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

目前在分支开发,我做:

$ git checkout -b myfeature dev

... (一些工作)

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

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

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

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

我做错了什么?

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

所有这些都在一个分支模型中,就像这里描述的那样。

4

10 回答 10

1946

如果您喜欢您发布的链接中的方法,请查看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

你会看到你想要的样子。

于 2010-12-17T13:23:08.950 回答
578

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

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

  • 掌握
  • 开发者
  • 分支1

因此,如果您想在名为“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 的新分支请注意,在上面的命令中不是强制性的,因为 HEAD 当前指向它,但如果你在不同的分支上,你可以精确它)。branch1

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

在另一个分支下创建分支的示例图形说明

将 subbranch_of_b1 推送到远程

 git push origin subbranch_of_b1 
于 2015-09-04T07:00:06.483 回答
67

创建一个分支

  • 签出主分支时创建分支。这里 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
于 2016-12-08T18:13:47.760 回答
33

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

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

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

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

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

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

git branch branch2 branch1

一般格式为:

git branch <new_branch> [from_branch]

man git branch如下所示。我叫<new_branch>什么叫他们叫<branchname>什么,我叫什么叫什么叫[from_branch]什么[<start-point>]

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

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

git branch new_branch

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

例如:我在feature_branch1,我即将使用git rebase -i master. 如果我想“撤消”这个,让我们先备份这个分支!我一直在做这一切...THE...TIME并发现它非常有帮助和令人欣慰的是,知道我总是可以轻松地回到这个备份分支并重新分支它以防万一我feature_branch1在这个过程中搞砸了:

git branch feature_branch1_BAK_20200814-1320hrs_about_to_squash

20200814-1320hrs部分是格式的日期和时间YYYYMMDD-HHMMhrs,因此将是 2020 年 8 月 14 日的 13:20hrs (1:20pm)。这样我可以轻松找到我的备份分支,直到我确定我准备好了删除它们。如果你不这样做并且你搞砸了,你必须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_1branch_1.5

git branch -m branch_1 branch_1.5

或者,如果您已经branch_1签出,您可以将当前签出的分支重命名为branch_1.5

git branch -m branch_1.5
于 2020-08-14T18:30:36.857 回答
29

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

git checkout -b <sub-branch> branch

例如:

  • 要创建的新分支的名称 'XYZ'
  • 必须在其下创建 XYZ 的分支 ABC 的名称
git checkout -b XYZ ABC
于 2019-11-19T23:15:39.290 回答
17

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

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

git switch -c my-new-branch

切换到新分支“我的新分支”

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

看看这篇Github 博客文章,更详细地解释了这些变化:

Git 2.23 为现有的套件带来了一对新的实验性命令:git switchgit restore。这两个旨在最终为众所周知的 git checkout 提供更好的界面。新的命令打算每个都有一个明确的分离,巧妙地划分了git checkout的许多职责

于 2019-08-18T22:33:08.453 回答
13

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

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

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

相对

       /----*DevB
*-----*DevA
       \----*FeatureC
于 2014-12-05T14:46:12.130 回答
10

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

假设

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

步骤

  1. 将分支获取到本地计算机。

    $ git fetch origin BranchExisting : BranchExisting
    

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

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

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

    $ git checkout -b BranchMyNew
    

干得好!

于 2019-08-26T10:44:45.393 回答
1

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

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

它比“git checkout -b”+“git push origin”短一点

于 2019-02-25T14:39:34.467 回答
0

切换到开发分支:

$ git checkout 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
于 2020-11-22T22:43:16.600 回答