说,如果来自master
分支,我们会创建一个foo
分支和一个bar
分支。
git checkout -b foo master
git checkout -b bar master
现在让我们说,如果我们根据wah
,foo
或bar
创建分支master
:
git checkout -b wah foo
或
git checkout -b wah bar
或
git checkout -b wah master
那么,wah
是基于foo
,bar
还是master
,是否存在任何差异?是否有任何Git命令可以告诉它基于foo
,bar
或master
?
答案 0 :(得分:6)
没有区别。分支只是指向提交的引用。我还没有检查过源代码,但我认为假设每次创建分支时引用最终都会被解引用到提交对象中,这是公平的。
因此,当你这样做时
git branch foo master
git branch bar master
分支foo
,bar
和master
都引用相同的提交对象。
因此,以下内容也是等效的,因为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
,那么它将如上所述工作。如果它设置为simple
或matching
,则推送将失败,表示您可以隐式地将分支仅推送到具有相同名称的其他分支。
一种简单的方法,你可以使用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
并不重要;重要的是它引用的提交。
您之前创建了两个名为foo
和bar
的分支。分支名称是指指定分支的当前 tip (与标记名称不同,标记名称是指特定提交,除非您重新定义标记,否则不会更改)。由于您尚未向foo
或bar
添加任何新提交,因此两个名称都引用相同的提交,以及三个命令中的任何一个:
git checkout -b wah master
git checkout -b wah foo
git checkout -b wah bar
做同样的事情。 (您也可以通过SHA1哈希引用相同的提交。)
(另一方面,如果您向foo
分支添加了新的提交,那么在foo
之上创建新分支会使wah
与不同分支,而不是在bar
之上创建的分支。)