我目前正在学习Git,并且在我看来,发现了许多来源的定义相互冲突。
我目前对基于我的教程的原点的理解是,每次从本地服务器获取文件时,原点“指针”移动到从那里下载的最新提交,因此我认为它是指针。
问题是我也听说过一个被称为分支的起源(Git branching: master vs. origin/master vs. remotes/origin/master)。我的问题是,当指针“指向”单个提交时,它如何被视为“指针”和分支,而分支指的是分支方向的改变,允许您将改变与当前分支分开,两件完全不同的事情。
分支机构:
master --> a
\
\
branch1 --> b
指针:
master --> a --> b --> c
--> C is the HEAD "pointer" and capable of moving if point D created
答案 0 :(得分:1)
git中没有任何内容称为 " origin"。标签"起源"只是默认情况下给自动配置的"远程"的名称。 git中没有任何东西叫做"指针",尽管有"引用"。
远程是一个名为git的存储库,而不是您正在使用的存储库。它可能是同一台计算机上的另一个目录,也可能位于世界其他地方的计算机上。 Git知道远程存储库中存在哪些分支(运行git branch -a
时可以看到这些分支,它显示本地和远程分支)。您将远程分支称为" 远程名称 / 分支机构",因此如果您有名为origin
的远程分支和名为master的分支,你可以通过运行来检查出来:
git checkout origin/master
如果您只是跑步:
git checkout master
然后(假设它还没有存在)git将创建一个名为master
的本地分支并配置为 track {{1} }。 "跟踪"表示您键入origin/master
,git知道您要从远程存储库更新git pull
,然后将这些更改合并到您的本地分支。同样,当您键入origin/master
时,git知道您要将更改发送到远程存储库的git push
分支。
分支是一种引用一系列更改的引用。在分支上创建新的提交时,分支引用将进入新提交。因此,如果您开始在分支master
上进行两次提交:
master
你在那个分支上做了一个新的提交,你得到:
master
/
A -> B
请注意,在这些示例中,分支名称是指最近的提交。
标签是另一种参考。与分支不同,标记仅在您明确更新时才会更改。因此,如果您在上一个示例中有一个标记 master
/
A -> B -> C
指向提交B,那么即使您进行了新提交,它仍将继续指向提交B.
您可以在The Git Book中找到有关上述内容的详细信息。
答案 1 :(得分:1)
当您clone存储库时,您实际上是从某个地方复制它。那个"某个地方"是git称之为"起源"。因此,原点是您从中获取源代码库。
现在,在克隆之后,您的计算机上有一个存储库,它可能会独立于原点(因为您将承诺它)。此外,在将来的某个时候,您需要将存储库与原点重新同步(因为您将把工作发布回原点)。
因此,它将您的存储库中的分支与原始分支的当前状态合并。您的分支和原始分支完全有可能具有相同的名称(如master),因此Git需要一种方法来区分这些分支。同样,它选择一种简单的方法 - 在分支名称前加上" origin /"。
因此,如果我们使用主分支的例子," master"是您的存储库中的主分支的状态和" origin / master"是原点中主分支的状态。
您需要知道的最后一件事:每次提交都有对其父级的引用。因此合并提交将有两个或更多父母(是的,您可以合并两个以上的分支)。因此,即使分支仅指向最新的提交,它最终会保留导航分支历史所需的整个提交链。
关于学习git的注意事项
不要尝试将git映射到现有的版本控制概念。使用git,所有分支基本上都是带有名称的指针,而存储库只不过是directed acyclic graph。以这种方式想想Git,突然间一切都有意义。