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

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

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

我使用了命令:

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

但是,这将从主分支创建分支,而不是我期望的开发分支。在主分支和 dev 分支中,提交 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。它很可能从主分支创建了分支。

211623 次浏览

试试看

git checkout <commit hash>
git checkout -b new_branch

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

这允许您检查特定的提交,并将其命名为您想要的。

你的论点顺序错了:

git branch <branch-name> <commit>

为此,检查哪个分支并不重要,它会按照你说的做。(如果省略提交参数,它默认在与当前分支相同的位置创建分支。)

如果您想在创建新分支时签出该分支:

git checkout -b <branch> <commit>

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

你必须:

git branch <branch_name> <commit>

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

或者你可以这样做:

git checkout -b <branch_name> <commit>

如果在使用分支名称的地方,您将从分支的顶端得到一个分支。

如果使用这种形式的 branch命令(带起始点) ,那么 HEAD在哪里并不重要。

你在做什么:

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

  • 其次,在提交 07aeec98时启动一个新分支。在这个提交中没有 bb.txt (根据 github repo)。

如果你想开始一个新的分支 在你刚刚检查过的地方,,你可以运行没有起点的分支:

git branch test

或者像其他人回答的那样,在那里进行一次分支和结帐:

git checkout -b test

我认为您可能会对 07aeec98dev分支的一部分这一事实感到困惑。的确,这个提交是 dev的祖先,它的更改需要到达 dev中的最新提交。然而,它们是达到最新 dev所需的其他提交,而且这些不一定在 07aeec98的历史中。

例如,8480e8ae(您在其中添加了 bb.txt)不在 07aeec98的历史记录中。如果从 07aeec98进行分支,则不会得到由 8480e8ae引入的更改。

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

这里也一样,您有两个并行的分支 master 和 dev,并将它们合并到 dev 中。从 master 提交(比 merge 更早)分支出去不会为您提供 dev 的更改。


如果您想要 永久性的将来自 master 的新变更集成到您的特性分支中,那么您应该将 master合并到这些分支中,然后继续。但是,这将在特性分支中创建合并提交。

如果您还没有发布您的特性分支,您也可以将它们重新建立在更新的主控 git rebase master featureA上。准备好解决可能的冲突。

如果你想要一个工作流程,在这个工作流程中,你可以不用合并提交就可以处理特性分支,并且仍然可以集成到 master 中的更新中,我建议如下:

  • 将每个新特性分支建立在主控提交的基础上
  • 在 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!)合并到主特性中。

您可以在本地执行此操作,正如所有人提到的使用

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

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

1-在存储库中,单击 Commits

2-在您想要分支的提交上,单击 <>来浏览历史记录中的这一点。

commits history

点击左上角的 tree: xxxxxx。只需在那里键入一个新的分支名称,单击 Create branch xxx,如下所示。

create new branch

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