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


102

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

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

我使用了以下命令:

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

但是,这是从master分支创建分支,而不是我期望的dev分支。提交ID在master分支和dev分支中相同。那么,如何区分不同分支中的相同提交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。它最有可能从master分支创建分支。

Answers:


145

如果您使用的是这种形式的branch命令(带有起点),则无论您身在何处都无所谓HEAD

你在做什么:

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

  • 其次,在commit上启动一个新分支07aeec98。提交时没有bb.txt(根据您的github存储库)。

如果要在刚签出的位置启动新分支,则可以在没有起点的情况下运行分支:

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中的新更改集成时,请将master和feature分支合并到中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!)合并到master中。


谢谢。你回答我的问题。我对git branch模式的理解是错误的。您对我的问题有什么建议吗?我有master分支,该分支具有与其他人的及时提交(与perforce同步)。我有dev分支,我从事个人工作。我想要一个包含master分支和dev分支的所有提交的分支,然后可以轻松地基于该分支创建分支,然后开始特定的工作。
RolandXu 2011年

我无法在评论中回答,因此我使用建议的工作流程更新了答案。
Gauthier

嘿-感谢您的出色回答!只是好奇:最后,为什么要选择一个merge the feature branches (not dev!) into master
cassi.lup 2014年

dev分公司没有真正的新发展。您应该保持分支功能特定。dev仅包含合并提交。将所有新功能直接master合并比将这些功能合并然后将结果合并到中更有意义master
Gauthier 2014年

@Gauthier您没有解决为什么的问题。对我来说,这听起来像一个合并dev只用功能A BC合并成成master是相同的单独合并A BCmaster。如果没有,那将挑战我对git如何工作的理解,而我对为什么会很好奇!
史蒂文·卢

53

您的参数顺序错误:

git branch <branch-name> <commit>

因此,检出哪个分支都无关紧要;它会照你说的做。(如果省略commit参数,默认情况下将在与当前分支相同的位置创建分支。)

如果要在创建新分支时签出新分支:

git checkout -b <branch> <commit>

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


22

每个人都可以使用

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

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

1-在存储库中,单击 Commits

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

提交历史

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

创建新分支

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


这就是我所需要的。如何在网站上进行
eharo2

我从来不知道 就是这个。GUI的东西很棒,我想离开CLI。
Rohit Gupta

10

尝试

git checkout <commit hash>
git checkout -b new_branch

提交仅在树中存在一次,而不能在两个单独的分支中存在。

这样,您就可以检出特定的提交,并将其命名为您想要的名称。


嗨,我尝试了git log dev和git log master,我发现提交哈希ID与我从master分支合并到dev分支的提交相同
RolandXu 2011年

使用诸如gitk可视化您的日志之类的方法可能会有所帮助
ZMorek 2011年

我在github中新添加了一个示例。而且Gauthier已经回答了我误解git branch模式的问题。谢谢您:)
RolandXu 2011年

我认为这是一个严格的答案。谢谢
virusss8'7

9

你所要做的:

git branch <branch_name> <commit>

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

或者您可以执行以下操作:

git checkout -b <branch_name> <commit>

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


那不是什么HEAD意思 您可以说“分支的尖端”或“分支指向的提交”。
卡斯卡贝尔2011年

@Jefromi-简而言之,我们只能说分支,因为分支本身就是分支尖端的指针。
manojlds 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.