如何从不同分支中的特定提交创建分支

时间:2011-12-13 03:28:24

标签: git git-branch

我在master分支中做了几次提交,然后将它们合并到dev分支。

我想从dev分支中的特定提交创建一个分支,它首先在master分支中提交。

我使用了命令:

git checkout dev
git branch  <branch name> <commit id>

但是,这会从master分支创建分支,而不是我期望的dev分支。 master分支和dev分支中的commit id相同。 那么,我如何区分不同分支中的相同提交ID?

PS:我在github这里做了一个例子https://github.com/RolandXu/test_for_branch

我使用了命令:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8

我期望测试分支包含aa.txt bb.txt cc.txt。但是,测试分支仅包含aa.txt和cc.txt。它很可能是从主分支创建了分支。

5 个答案:

答案 0 :(得分:95)

如果您使用branch命令的这种形式(带起点),则HEAD的位置无关紧要。

你在做什么:

git checkout dev
git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8
  • 首先,您将HEAD设置为分支dev

  • 其次,您在提交07aeec98上启动新分支。此提交中没有bb.txt(根据您的github repo)。

如果你想在你刚签出的位置开始一个新的分支你可以运行没有起点的分支:

git branch test

或其他人在一次操作中回答,分支和结账:

git checkout -b test

我认为你可能会因07aeec98是分支dev的一部分而感到困惑。确实,此提交是dev的祖先,需要对其进行更改以达到dev中的最新提交。但是,它们是达到最新dev所需的其他提交,并且这些提交不一定在07aeec98的历史记录中。

8480e8ae(您添加bb.txt的地方)例如不在07aeec98的历史记录中。如果您从07aeec98分支,则不会获得8480e8ae引入的更改。

换句话说:如果将分支A和分支B合并到分支C中,然后在提交A时创建新分支,则不会获得B中引入的更改。

在这里,你有两个并行分支master和dev,你在dev中合并。从提交master(早于合并)分支出来将不会为您提供dev的更改。


如果您希望永久将来自master的新更改集成到功能分支中,则应将master合并到其中并继续。但是,这将在您的功能分支中创建合并提交。

如果您尚未发布功能分支,则还可以在更新后的主分支上重新定义它们:git rebase master featureA。准备好解决可能的冲突。

如果您想要一个工作流程,您可以在其中处理没有合并提交的功能分支,并且仍然可以与master中的较新更改集成,我推荐以下内容:

  • 将每个新功能分支基于主提交
  • 在提交主
  • 时创建dev分支
  • 当您需要查看功能分支如何与master中的新更改集成时,将master和功能分支合并到dev

不要直接提交dev,只能将其用于合并其他分支。

例如,如果您正在处理功能A和B:

a---b---c---d---e---f---g -master
    \       \
     \       \-x -featureB
      \
       \-j---k -featureA

将分支合并到dev分支中,以检查它们是否与新主分支一起使用:

a---b---c---d---e---f---g -master
    \       \            \
     \       \            \--x'---k' -dev
      \       \             /    /   
       \       \-x----------    /    -featureB
        \                      /
         \-j---k--------------- -featureA

您可以继续处理功能分支,并定期将主要功能和功能分支的新更改合并到dev

a---b---c---d---e---f---g---h---i----- -master
    \       \            \            \
     \       \            \--x'---k'---i'---l' -dev
      \       \             /    /         /
       \       \-x----------    /         /  -featureB
        \                      /         /  
         \-j---k-----------------l------ -featureA

当需要集成新功能时,请将功能分支(不是dev!)合并到主服务器中。

答案 1 :(得分:30)

您的参数顺序错误:

git branch <branch-name> <commit>

为此,检查哪个分支无关紧要;它会做你说的。 (如果省略commit参数,则默认为在当前位置创建分支。)

如果您想在创建时检查新分支:

git checkout -b <branch> <commit>

如果省略commit参数,则具有相同的行为。

答案 2 :(得分:8)

你必须这样做:

git branch <branch_name> <commit>

(您正在交换分支名称并提交)

或者你可以这样做:

git checkout -b <branch_name> <commit>

如果代替您使用分支名称,则会从分支的末端获得分支。

答案 3 :(得分:5)

尝试

git checkout <commit hash>
git checkout -b new_branch

提交应该只在树中存在一次,而不是在两个单独的分支中存在。

这允许您检查该特定提交并将其命名为。

答案 4 :(得分:0)

您可以像每个人所说的那样在本地进行

git checkout -b <branch-name> <sha1-of-commit>

或者,您可以在github本身中执行此操作,请按照以下步骤操作:

1-在存储库中,单击Commits

2-在要分支的提交上,单击<>以浏览历史记录中的存储库。

commits history

3-单击左上角的tree: xxxxxx。只需输入一个新的分支名称,然后单击Create branch xxx,如下所示。

create new branch

现在,您可以从本地该分支获取更改,然后从那里继续。