git - git中 'tracking'的概念有不同的含义吗?

标签 git branch tracking git-checkout

我运行'git branch -r'并得到

origin/branch1

origin/branch2

在手册页中,-r 选项将“列出或删除(如果与 -d 一起使用)远程跟踪分支”。所以 origin/branch1 和 origin/branch2 被称为远程跟踪分支。但是,您不能直接提交到远程跟踪分支(将创建一个匿名分支)。远程跟踪分支仅在运行“git fetch”时跟踪远程分支。

这里的语义对我来说有点模糊。如果我那么

git checkout -b branch1 origin/branch1

我得到以下输出: “分支 branch1 设置为从原点跟踪远程分支 branch1。切换到新分支‘branch1’”

这是我的问题,尽可能详细地说明是什么让我感到困惑...... 由于设置了 branch1 以从源头跟踪远程分支 branch1,因此“branch1”是否被视为远程跟踪分支?如果是这样,这是否与运行“git branch -r”时“origin/branch1”已被列为远程跟踪分支这一事实不冲突?据我了解,存在本地(主题)分支或远程跟踪分支。运行“git checkout -b branch1 origin/branch1”时,我是否正在创建一个本地(主题)分支(我可以在其上添加提交)通过获取跟踪远程分支?现在运行“git branch”给出:“* branch1”,运行“git branch -r”仍然给出“origin/branch1”和“origin/branch2”。我创建了 branch1 来添加提交并跟踪 origin/branch1。哪个被认为是远程跟踪分支,“git branch”输出的“branch1”,或“git branch -r”输出的“origin/branch1”?

最佳答案

这是一个很好的问题,关于一个特别烦人的 git 术语,尽管这个项目似乎正在慢慢修复。

基本上,“track”在表达式 (a) “remote-tracking branch” 和 (b) “branch1 set up to track remote branch branch1 来自来源”。这是一个快速总结:

  1. “远程跟踪分支”:远程跟踪分支是通常由 git fetch 更新的分支,因此 git pull.¹ 您可以将这些视为远程存储库中分支状态的缓存。您可以从它们 merge ,检查它们的历史等,但您不能直接对它们进行操作。此短语中的“跟踪”表示远程跟踪分支代表上次更新远程跟踪分支时远程存储库中分支的状态。
  2. 分支 foo 设置为从 origin 跟踪远程分支 bar:在这句话中,你是什么被告知 git 已设置配置变量,将您的本地分支 foo 与远程跟踪分支 origin/bar 相关联。这启用了很好的功能,例如当您在分支 foo 上时只需键入 git pull 即可从 origin/bar 获取然后 merge >。这也是您如何获得有关您的分支相对于远程跟踪分支的状态的消息,例如“您的分支 fooorigin/bar 可以提前 24 次提交可以快进”。您被告知您的本地分支正在跟踪 已与远程跟踪分支相关联。您还听到这被称为 origin/bar 相对于 foo上游

因此,这些跟踪/追踪的意义是完全不同的,遗憾的是这是一个常见的混淆来源。

第二种感觉似乎正在慢慢被弃用,但是 - 例如,push.default 的可能选项之一曾经是 tracking,但现在是已弃用,取而代之的是选项名称 upstream


因此,直接回答您的问题:

By virtue of having branch1 set up to track remote branch branch1 from origin, is 'branch1' thus considered a remote-tracking branch?

不,branch1 不是远程跟踪分支。

When running 'git checkout -b branch1 origin/branch1', am I creating a local (topic) branch (onto which I can add commits) that is tracking a remote branch by way of fetches?

好吧,有点 - 它正在跟踪(意义 2)一个远程跟踪分支,后者通过获取从远程存储库中的分支更新。 (就个人而言,我尽量避免使用“远程分支”一词,而使用“远程存储库中的分支”,以防万一人们认为您指的是远程跟踪分支。)

Running 'git branch' now gives: '* branch1', and running 'git branch -r' still gives 'origin/branch1' and 'origin/branch2'. I created branch1 to add commits to and to track origin/branch1. Which is considered the remote-tracking branch, 'branch1' from the output of 'git branch', or 'origin/branch1' from the output of 'git branch -r'?

远程跟踪分支是origin/branch1


¹ 当您成功 git push 到远程存储库中的相应分支时,它们也会更新。

关于git - git中 'tracking'的概念有不同的含义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631337/

相关文章:

tfs - 按功能划分 - 优点/缺点?

PHP 跟踪邮件和链接点击

c - 将 0 映射到任何非零值同时保留其他值的无分支方式?

c++ - 使用光流的 OpenCV 跟踪

google-analytics - GA的下载代码无效

git - 使用 bash 脚本获取当前分支中的提交数

git: 使用 vim 时以 # 开始注释

git : How to get name of the branch tracked by the current one?

git - npm WARN 注册表 https ://registry. npmjs.org/的意外警告:

git - TortoiseGit 本地分支与 GitHub 上的远程分支