如何从不同分支的特定提交中创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
提交应该只在树中存在一次,而不是在两个独立的分支中。
这使您可以检查出具体的提交并将其命名。