新分支从复制的分支获取所有先前的提交

时间:2014-08-11 10:53:16

标签: git

如果我创建一个新分支,则从复制的分支中提交的所有提交都将被新建一个提交。

我怎么能阻止这个?我想在新的分支机构中进行新的提交..

2 个答案:

答案 0 :(得分:2)

git中的提交包含对其父提交的引用。这就是git如何构建存储库的历史记录。

另一方面,分支只指向特定的提交。 字面上一个包含当前提交的SHA-1密钥的文件。您可以在存储库的.git/refs/heads文件夹中找到它们。


当您创建新分支而未指定提交时,分支将指向当前指向的同一提交HEAD。 (请注意,HEAD并不直接指向提交但指向分支,但这是一个不同的故事。)

假设您当前在development分支机构,并希望创建一个新分支来处理新功能。

git checkout -b new-branch

现在,developmentnew-branch都指向同一个提交,假设密钥为DEF456。这个提交包含对它的父提交的引用 - 就像每个提交一样 - 它是ABC123,而git merge --no-ff <branch-to-merge>又包含对它的父提交的引用,依此类推。

你知道,git在创建新分支时不会复制分支的历史记录,它只是指向与当前分支相同的提交。

如果您想了解更多关于git如何在内部存储信息的信息,您可以查看Git Objects chaptergitpro book


正如您在this question中找到的那样。您可以使用{{1}}强制进行合并提交,而不是快进。

合并提交是特殊的,因为它在父提交中不包含一个refence,因为大多数提交在git do中,但它包含对它的父提交的多个引用。这定义了合并。

答案 1 :(得分:2)

听起来你真的在问强迫&#34;真实&#34;合并而不是&#34;快进&#34;合并,以及&#34;壁球&#34;合并(根本不是实际的合并)。但是,为了完整起见,我想提一下,在创建新的分支名称时还可以做一件事:

git checkout --orphan -b newbr

在这种情况下,git会让您newbr,而不会实际创建newbr。这意味着 next 提交将在您的存储库中启动一个新的独立提交图。换句话说,您将拥有多个&#34; root提交&#34;在单个存储库中(根提交是具有 no 父级的提交,与具有一个父级的普通提交和具有两个或更多父级的合并提交)。

存储库中的多个独立提交图是不寻常的,但是受到支持:例如,git自己的源存储库包含它们。 (使用git维护git程序。)