我在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。它很可能是从主分支创建了分支。
答案 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
分支
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)