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

我已经在主分支做了几个提交,然后合并到开发分支。

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

我使用的命令:

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

但是,这从主分支创build分支,而不是我期望的开发分支。 主分支和开发分支中的提交ID相同。 那么,我怎样才能区分不同的分支相同的提交ID?

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

我使用的命令:

 git checkout dev git branch test 07aeec983bfc17c25f0b0a7c1d47da8e35df7af8 

我期望的是testing分支包含aa.txt bb.txt cc.txt。 但是,testing分支只包含aa.txt和cc.txt。 它很可能创build了主分支的分支。

如果您使用这种forms的branch命令(带有起始点),那么HEAD位置并不重要。

你在做什么:

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

  • 其次,你在提交07aeec98上开始一个新的分支。 在这个提交没有bb.txt(根据你的github回购)。

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

 git branch test 

或者像其他人一样在一个操作中进行了分支和结账:

 git checkout -b test 

我想你可能会对07aeec98是分支机构的一部分感到困惑。 确实,这个提交是开发者的祖先,它的变化需要达到最新的开发承诺。 然而,他们还需要其他的工作来达到最新的dev ,而这些并不一定是在07aeec98的历史上。

8480e8ae (你添加了bb.txt)例如不在07aeec98的历史中。 如果你从07aeec98分支,你将不会得到由8480e8ae引入的变化。

换句话说:如果将分支A和分支B合并到分支C中,则在A的提交上创build一个新分支,则不会得到在B中引入的更改。

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


如果您想永久性地将主人的新变更集成到您的function分支中,则应将master合并到他们中继续。 不过,这将在您的function分支中创build合并提交。

如果你还没有发布你的function分支,你也可以重新绑定更新的主控: git rebase master featureA 。 准备好解决可能的冲突。

如果您想要一个工作stream,您可以在没有合并提交的特性分支上工作,并且仍然集成了主控中较新的更改,我build议您采取以下措施:

  • 基于每个新的function分支在主提交
  • 在master的提交上创build一个dev分支
  • 当您需要查看function分支如何与主控中的新更改集成时,请将主控function分支和function分支均合并到dev

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

例如,如果您正在使用functionA和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 

您可以继续使用您的function分支,并定期将合并到主设备和function分支的新更改中。

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

当需要整合新function时,将function分支(不是dev !)合并到主设备中。

你有错误的顺序的参数:

 git branch <branch-name> <commit> 

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

如果您想在创build新分支时检出它:

 git checkout -b <branch> <commit> 

如果你省略提交参数,则采用相同的行为。

你必须做:

 git branch <branch_name> <commit> 

(你正在交换分支名称和提交)

或者你可以这样做:

 git checkout -b <branch_name> <commit> 

如果代替您使用分支名称,则会从分支的小费中获得分支。

尝试

 git checkout <commit hash> git checkout -b new_branch 

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

这使您可以检查出具体的提交并将其命名。