如果他们在Git中指向相同的提交,那么在基于分支foo或bar创建分支之间是否存在任何差异?

时间:2014-05-10 19:31:35

标签: git

说,如果来自master分支,我们会创建一个foo分支和一个bar分支。

git checkout -b foo master
git checkout -b bar master

现在让我们说,如果我们根据wahfoobar创建分支master

git checkout -b wah foo

git checkout -b wah bar

git checkout -b wah master

那么,wah是基于foobar还是master,是否存在任何差异?是否有任何Git命令可以告诉它基于foobarmaster

4 个答案:

答案 0 :(得分:6)

没有区别。分支只是指向提交的引用。我还没有检查过源代码,但我认为假设每次创建分支时引用最终都会被解引用到提交对象中,这是公平的。

因此,当你这样做时

git branch foo master
git branch bar master

分支foobarmaster都引用相同的提交对象。

因此,以下内容也是等效的,因为wah最终也会引用相同的提交对象:

git branch wah master
git branch wah foo
git branch wah bar

验证分支引用只是提交标签

您只需获取每个分支的第一个日志条目即可轻松验证这一点(请注意每个分支的提交标识):

git log --pretty=oneline -1 master
952e133ff1d1616f068ca524af9f323f6e7f8b7a Add Bash alias for `pbcopy` (OS X)

另一种验证方法是查看参考文件本身。每个都包含一行,其中包含他们当前引用的提交sha:

cat .git/refs/heads/master
952e133ff1d1616f068ca524af9f323f6e7f8b7a

cat .git/refs/heads/foo
952e133ff1d1616f068ca524af9f323f6e7f8b7a

补充阅读

答案 1 :(得分:2)

不,在某种意义上,wah指向相同的提交,无论在这种情况下创建它的三个分支中的哪一个。

但是,是的,因为git会跟踪哪些分支位于其他分支的上游。因此,当需要将wah分支与其“上游”分支同步时,git将“想要”同步(发送)提交到被认为是上游的任何分支。使用以下命令:

git push . # '.' means the local repo

...如果wah被分支master,则推送将要发送提交(即合并)master;如果分支foo,则foo;等等。

当然,是否允许这样做是由另一个配置设置控制的:push.default。如果push.default设置为upstream,那么它将如上所述工作。如果它设置为simplematching,则推送将失败,表示您可以隐式地将分支仅推送到具有相同名称的其他分支。

一种简单的方法,你可以使用git来显示哪些分支基于哪些分支,使用以下命令:

git branch -avv

这会在括号中显示每个分支及其旁边的上游分支。

因此结果是肯定的,内部git会跟踪您分支的特定分支,并将这些知识应用于上述特定情况。

答案 2 :(得分:1)

要扩展基础问题:提交不知道它们是在哪个分支。甚至根本不需要在任何分支上进行提交。

分支只不过是历史图表叶子的廉价标签 - 分支只指向提交,而不是相反。如果您在master上进行新的提交,那么会将 master移动到新的提交中,并且之前的提交与master没有任何关联,除非它碰巧是新提交的父级。*

(*我有点撒谎; reflog会记住最后几次提交master 使用指向,这有助于面对例如一个不足之处非常糟糕。这是@{1}语法的用途。但这是暂时的,不与其他任何人共享。)

答案 3 :(得分:1)

命令:

git checkout -b new-branch-name existing-commit

从指定的提交开始创建一个新分支。是否通过分支名称,标签名称或sha1哈希指定existing-commit并不重要;重要的是它引用的提交。

您之前创建了两个名为foobar的分支。分支名称是指指定分支的当前 tip (与标记名称不同,标记名称是指特定提交,除非您重新定义标记,否则不会更改)。由于您尚未向foobar添加任何新提交,因此两个名称都引用相同的提交,以及三个命令中的任何一个:

git checkout -b wah master
git checkout -b wah foo
git checkout -b wah bar

做同样的事情。 (您也可以通过SHA1哈希引用相同的提交。)

(另一方面,如果您向foo分支添加了新的提交,那么在foo之上创建新分支会使wah不同分支,而不是在bar之上创建的分支。)