什么是跟踪分支?


173

有人可以解释适用于git的“跟踪分支”吗?

这是git-scm.com的定义:

Git中的“跟踪分支”是连接到远程分支的本地分支。当您在该分支上推入并拉出时,它会自动推入并拉到与其连接的远程分支。

如果您始终从同一上游分支拉入新分支,并且不想显式使用“ git pull”,请使用此方法。

不幸的是,对于git来说是新手,来自SVN,对我而言,这个定义绝对没有意义。

我正在阅读《Git实用指南》(顺便说一句好书),他们似乎建议跟踪分支是一件好事,并且在创建第一个远程对象(在这种情况下为起源)之后,您应该将您的主分支设置为跟踪分支,但是不幸的是,它没有涵盖为什么跟踪分支是一件好事,或者将主分支设置为原始存储库的跟踪分支可以带来什么好处

有人可以启发我(英语)吗?


6
一个术语注释:Git中的单词track非常重载。有些文件已被跟踪,有些文件未跟踪;一些分支名称称为远程跟踪分支;并且您可以使用该--track选项来创建一个(本地)分支,该分支将这些远程跟踪分支之一设置为其上游。该术语已经2006年至2019年间有所发展,所以不同的人可能会通过这些词有时意味着不同的东西。
torek '19

我个人建议使用短语“ 远程跟踪名称 ”代替远程跟踪分支,部分原因是“ 分支”一词也相当重载。远程跟踪名称看起来像origin/master:它们位于您的存储库中,但是它们是Git记住分支名称的一种方式,如在上其他 Git存储库中所见origin。然后,如果您使用上游一词(这是更现代的术语)来表示您master已将origin/master其设置为上游,则可以避免所有这些术语的混淆。
torek '19

Answers:


141

ProGit本书一个很好的解释

追踪分行

从远程分支签出本地分支会自动创建所谓的跟踪分支。跟踪分支是与远程分支有直接关系的本地分支。如果您在跟踪分支上并输入git push,则Git会自动知道要推送到哪个服务器和分支。同样,git pull在这些分支之一上运行时,将获取所有远程引用,然后自动合并到相应的远程分支中。

克隆存储库时,它通常会自动创建一个主分支,该分支会跟踪源/主数据库。这就是为什么git push,并git pull没有其他参数工作开箱。但是,您可以根据需要设置其他跟踪分支,即那些不跟踪原点分支也不跟踪主分支的分支。最简单的例子是您刚刚看到的运行示例git checkout -b [branch] [remotename]/[branch]。如果您具有Git 1.6.2或更高版本,则也可以使用--track速记:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

要使用与远程分支不同的名称来设置本地分支,可以轻松地使用具有不同本地分支名称的第一个版本:

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

现在,您的本地分支sf将自动推入和拉出origin/serverfix

奖励:额外git status信息

有了跟踪分支,它git status会告诉您是否离跟踪分支有多远-有助于提醒您尚未推送更改!看起来像这样:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

要么

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)


21
只是想清除这一点:“从远程分支中检出本地分支会自动创建所谓的跟踪分支。” 那是误导。没有--track选项,您创建的任何分支都将无法跟踪。
JohnO 2011年

@JohnO,可能想和Pro Git家伙接洽。整本书是IIRC大规模编辑合作的结果。
Assaf Lavie

2
@ JohnO,根据:sbf5.com/~cduan/technical/git/git-4.shtml --track默认是打开的,因此不是必需的。
Hank Lin

50

以下是我在GIT跟踪分支上的个人学习笔记,希望它将对将来的访问者有所帮助:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


跟踪分支和“ git fetch”:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


谢谢你的笔记!如果可以的话,您愿意分享吗?谢谢;
阿迪亚

@Aditya:这个问题是为了跟踪分支机构,我已经发布了有关该主题的所有注释。如果我发现其他相关问题可以在上面发布我的其他GIT注释,那么我将很乐意这样做。
hagrawal

谢谢!我的意思是将它们发布在您的博客或其他内容上:)。再次感谢您的精彩笔记!
Aditya

@Aditya:啊,我明白了。现在您已经明白了您的意思了。我在我的网站上落后,但尚未为自己创建一个。
hagrawal

43

Pro Git书中 提到

跟踪分支是与远程分支有直接关系的本地分支

不完全是。SO问题“ 难以理解git-fetch ”包括:

没有本地跟踪分支的这种概念,只有远程跟踪分支。
存储库origin/master中的远程跟踪分支master也是如此origin

但是实际上,一旦建立了以下之间的上游分支关系

  • master
  • 和一个远程跟踪分支 origin/master

然后,您可以考虑将其master视为本地跟踪分支:它跟踪远程跟踪分支 origin/master,而远程跟踪分支又跟踪上游回购 的主分支origin

替代文字


图片说明:“我的电脑”提前2次提交。那就是来自master的那两个提交的来源。图片:progit.org/book/ch3-5.html
idbrii'3

我的解释是否正确:如果我在本地为原点和上游设置了远程服务器,那么我的本地主分支将直接跟踪原点,并间接跟踪原始点?例如:何时我git status将收到有关原始和上游存储库的提交跟踪消息?(设置:我在本地克隆某人的存储库,将其克隆推送到我的GitHub帐户上的新存储库,并将本地和上游远程本地设置为我的github存储库和克隆的克隆存储库)。
SherylHohman'5

3
@SherylHohman否:本地分支机构不会“直接”或“间接”跟踪任何内容。它将跟踪您将分配给它的远程跟踪分支。如果是fork,最佳实践是跟踪常见分支(如master)的上游(原始仓库),并跟踪新分支(PR或feature分支)的原点(远程fork):请参见stackoverflow.com/ a / 21847690/6309
VonC

2
@VonC-语句“本地跟踪分支没有这样的概念,只有远程跟踪分支。” 有趣的是,分支机构之间的术语存在冲突。这个经常引用的链接web.archive.org/web/20130419172453/http://www.gitguys.com/…区分“跟踪分支”和“远程跟踪分支”。他们称源/主机为“远程跟踪分支”-我同意-但随后他们也将“主机”称为“跟踪分支”。什么是主跟踪?它们是错误的还是术语问题?
Howiecamp

2
@Howiecamp所谓的“称为主控的跟踪分支”只是具有相关的远程跟踪分支的原始/主控的本地分支主控,此处存储了有关其远程主控分支从源中获取的最后一个SHA1。因此,这是指定“具有上游分支的本地分支”的“捷径”
VonC

7

这就是我添加跟踪分支的方式,这样我就可以将其拉到新分支中:

git branch --set-upstream-to origin/Development new-branch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.