问题描述
|
如果我做
$ git branch a
$ git checkout a
Switched to branch \'a\'
$ git branch b
$ git checkout b
Switched to branch \'b\'
$ git branch c1
$ git branch c2
这些分支之间是否存在任何关系,还是因为它们中没有任何提交,所以都被视为“扁平”吗?在SVN中,我将像这样对这些分支进行建模:
master
|
+-a
|
+-b
|
+-c1
|
+-c2
但是,当我尝试遵循这个问题并做gitk master a b c1 c2
时,我得到的是一条平线,而不是上面放的图表。
解决方法
git没有严格的父分支,它只有特定的提交路径。在这种情况下,它们都具有与起始点相同的提交,因此它们都相同。一旦他们开始拥有自己的提交,它们就将成为他们自己的“行”,但是它们实际上不会与彼此建立联系。
尽管在任何时候都可以使用
git merge
轻松地与任何分支合并,所以\“ parent \”关系并不是那么基本。对于使用--track
(您收到父母的承诺)的情况,Git确实具有父母的概念,但这只是一个特殊的便利功能。如果在I上加点并在T上交叉(cross5ѭ,git merge branch B
,等等),您可以很容易地拥有任意数量的“父母”。
, 对我来说,将分支视为指针是有帮助的。您从一个称为master的指针开始,该指针指向特定的提交。创建分支时,您只是在创建另一个指向同一提交的指针。因此,上面具有的命令集会导致5个指针(master,a,b,c1,c2)全部指向同一提交。
, 分支之间没有关系。
该指令:
git branch c1
等效于:
cat .git/HEAD > .git/branch/ref/heads/c1
因此,在创建分支时,您仅在分支名称和由SHA1标识的提交之间设置键-值关系。
, 我相信,如果您与--no-ff合并,它将不会快速转发更改,并且您将拥有与创建时完全相同的树历史记录。