本地分支、本地跟踪分支、远程分支和远程跟踪分支有什么区别?

2023-11-24

我刚刚开始使用 Git,我对不同的分支感到非常困惑。谁能帮我弄清楚以下分支类型是什么?

  • 当地分支机构
  • 本地跟踪分支
  • 远程分支机构
  • 远程跟踪分支机构

它们之间有什么区别?他们如何相互合作?

我想快速的演示代码会非常有帮助。


这是长答案。

Remotes:

如果您以协作方式使用 Git,您可能需要将您的提交与其他计算机或位置同步。每台机器或位置称为remote,用 Git 的术语来说,每个分支可能有一个或多个分支。大多数情况下,您只会有一个名为origin。要列出所有遥控器,请运行git remote:

$ git remote
bitbucket
origin

您可以通过运行来查看这些远程名称是哪些位置的快捷方式git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

每个远程都有一个目录.git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

您机器上的分支:

TLDR:在本地计算机上,您拥有三种类型的分支:本地非跟踪分支、本地跟踪分支和远程跟踪分支。在远程计算机上,您只有一种类型的分支。

1. 当地分支机构

您可以通过运行来查看计算机上所有本地分支的列表git branch:

$ git branch
master
new-feature

每个本地分支都有一个文件.git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

您的计算机上有两种类型的本地分支:非跟踪本地分支和跟踪本地分支。

1.1 非追踪本地分支机构

非跟踪本地分支不与任何其他分支关联。您可以通过运行来创建一个git branch <branchname>.

1.2.追踪本地分支机构

跟踪本地分支与另一个分支(通常是远程跟踪分支)相关联。您可以通过运行来创建一个git branch --track <branchname> [<start-point>].

您可以使用以下命令查看哪一个本地分支机构正在跟踪分支机构git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

从该命令的输出中,您可以看到本地分支master正在跟踪远程跟踪分支origin/master,以及当地分行new-feature没有跟踪任何东西。

查看哪些分支正在跟踪分支的另一种方法是查看.git/config.

跟踪本地分支机构很有用。它们让你可以奔跑git pull and git push,而不指定使用哪个上游分支。如果该分支未设置为跟踪另一个分支,您将收到如下错误:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. 远程跟踪分支(仍在您的机器上)

您可以通过运行来查看计算机上所有远程跟踪分支的列表git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

每个远程跟踪分支下都有一个文件.git/refs/remotes/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

将远程跟踪分支视为远程计算机所包含内容的本地缓存。您可以使用以下命令更新远程跟踪分支git fetch, which git pull在幕后使用。

尽管远程跟踪分支的所有数据都存储在本地计算机上(如缓存),但它仍然不会被称为本地分支。 (至少,我不会这样称呼它!)它只是被称为远程跟踪分支。

远程机器上的分支:

您可以通过运行来查看所有远程分支(即远程机器上的分支)git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: [email protected]:Flimm/example.git
  Push  URL: [email protected]:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

This git remote命令通过网络查询远程计算机有关其分支的信息。它不会更新本地计算机上的远程跟踪分支,请使用git fetch or git pull为了那个原因。

从输出中,您可以通过查看“远程分支”标题(忽略标记为“过时”的行)来查看远程计算机上存在的所有分支。

如果您可以登录到远程计算机并在文件系统中找到存储库,则可以查看其下的所有分支refs/heads/.

备忘单:

  • 要安全地删除本地分支,无论是跟踪分支还是非跟踪分支:

      git branch -d <branchname>
    
  • 要强制删除本地分支,无论是跟踪分支还是非跟踪分支:

      git branch -D <branchname>
    
  • 要删除远程跟踪分支:

      git branch -rd <remote>/<branchname>
    
  • 要创建新的本地非跟踪分支:

      git branch <branchname> [<start-point>]
    
  • 要创建新的本地跟踪分支:(请注意,如果<start-point>被指定并且是一个远程跟踪分支,例如origin/foobar,那么--track标志自动包含在内)

      git branch --track <branchname> [<start-point]
    

    Example:

      git branch --track hello-kitty origin/hello-kitty
    
  • 要删除远程计算机上的分支:

      git push --delete <remote> <branchname>
    
  • 要删除所有过时的远程跟踪分支,即远程计算机上不再存在的相应分支:

      git remote prune <remote>
    

您可能已经注意到,在某些命令中,您使用<remote>/<branch>和其他命令,<remote> <branch>。例子:git branch origin/hello-kitty and git push --delete origin hello-kitty.

这看起来可能是任意的,但有一个简单的方法可以记住何时使用斜杠以及何时使用空格。当您使用斜杠时,您指的是自己计算机上的远程跟踪分支,而当您使用空格时,您实际上是在通过网络处理远程计算机上的分支。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

本地分支、本地跟踪分支、远程分支和远程跟踪分支有什么区别? 的相关文章

  • .gitignore 文件夹内容[重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 上忽略 Git 存储库中的目录 https stackoverflow com questions 343646 ignoring directories in git repos
  • 恢复 git reset --soft

    我修改了我的分支中的一些文件并做了一个 git add all 但这添加了一些我不打算为提交添加的文件 所以我做了一个 git reset soft HEAD 2 instead of doing git reset HEAD 但之前的提交
  • 我可以从命令行向 github 添加问题吗?

    我是 git 新手 我希望能够通过 github 绘制我的项目的计划和进度 问题是 这需要在 github com 上使用浏览器进行大量点击 并且我希望能够通过使用命令行程序来自动执行该任务 github 有命令行界面吗 有一个ghi ge
  • 来自 eclipse 的部分 git 提交 (egit)

    假设我有一个有 2 个更改的文件 如何使用 egit 只提交其中之一 命令行版本可以在以下位置找到this https stackoverflow com questions 1085162 commit only part of a fi
  • 删除生成的 Javadoc 中的注释“Generate by Javadoc on

    javadoc 命令会自动插入一条注释 如下所示 在每个生成的 HTML 文件中 这完全阻止了版本化 javadoc 的更改跟踪 因为在重新生成文档时每个文件都会被修改 我问的上一个问题说服我不要对任何 javadoc 进行版本控制 但它也
  • 有关多个远程存储库的 Git 状态

    我有一个脚本 如果我忘记在 40 多个存储库中提交或推送一些代码 它会通过电子邮件向我发送提醒 在我的两个项目中 我遵循了这些帖子中的答案 其中我设置了 git push 来推送到多个存储库 从多个远程位置拉 推 https stackov
  • 由于不存在大文件而导致 git Push 错误

    当尝试推送到 git 时 我不断得到相同的结果 Counting objects 78 done Delta compression using up to 4 threads Compressing objects 100 67 67 d
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • 使用 TortoiseGit 创建 git 克隆时出现 SSL 证书问题

    我想在 TortoiseGit 的帮助下克隆 git 存储库 但出现错误 错误 SSL 证书有问题 请验证 CA 证书是否正常 细节 错误 14090086 SSL 例程 SSL3 GET SERVER CERTIFICATE 访问时证书验
  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 如何在本地快速拉取拉取请求

    在合并拉取请求之前 我想在本地快速拉取请求并运行测试并测试一些内容 我还不想点击 gihub 合并拉取请求 我以为滑轮会有帮助http ejohn org blog pulley http ejohn org blog pulley 但我收
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • 如何从 SVN 获取所有未版本化文件的列表?

    有时 您正在开发并决定提交 却忘记了您在项目中创建了一些文件 然后几天后 你的朋友从 Subversion 中得到了你的版本 并抱怨有些文件似乎丢失了 你意识到了 啊糟糕 我忘记添加那些文件了 如何从 Subversion 获取不受版本控制
  • Eclipse 与外部 src 和 Web 内容文件夹链接或映射

    首先这不是问题但是我遇到的问题的解决方案浪费了4 5个小时来找到解决方案 请让我知道是否有更好的替代方法来使用 eclipse 项目管理外部 src 文件夹 我正在使用版本控制系统 GIT 来管理我的项目 还使用外部 Git 客户端 Sou
  • git checkout 到分支需要很长时间

    我使用的是 Ubuntu 17 10 并且使用 git 版本 2 14 1 每当我从 master 创建一个分支并尝试签出它 或从它签出到 master 时 都会花费大量时间 大约几分钟 有时接近 10 分钟 确实 我有几 GB 的数据 但
  • git stash 删除最旧的存储(比如最旧的 5 个存储)

    如何在一个语句中删除最旧的存储 例如最旧的 5 个存储 而不是执行以下操作 git stash drop stash 3 git stash drop stash 4 git stash drop stash 5 git stash dro
  • Git 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样

随机推荐

  • eval和setTimeout执行字符串代码的区别

    我知道eval and setTimeout都可以接受字符串作为 第一个 参数 而且我知道最好不要使用它 我只是好奇为什么会有差异 function var foo 123 eval alert foo function var foo 1
  • Angular jasmine 测试无法触发使用 fromEvent rxjs 运算符创建的 Observable

    我有一个简单的案例 标准AppComponentAngular 应用程序包含ChildComponent这是在它自己的模块中定义的ChildModule 模板为ChildComponent很简单 div class child div Ch
  • Android中的人脸识别认证[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 与应用程序的指纹身份验证类似 我正在尝试在我的 Android 应用程序之一中实现人脸识别身份验证 任何人都可以指导我如何使用任何库或任何东西来实现
  • 使用Python和ftplib检查FTP服务器上的对象是文件还是目录

    我正在使用 Python 和 ftplib 编写一个通用函数来检查 FTP 目录中的项目是文件还是目录 由于使用 MLSD 函数可能不一定适用于所有服务器 我的一个用例没有提供它 因此我采用了这种有效但粗略的方式来确定它 方法是尝试更改对象
  • 使 html 选择选项下拉菜单默认打开

    单击选择框时 将显示选项的下拉列表 下拉列表保持打开状态 直到用户单击外部或选择下拉列表中的选项之一 有没有一种简单的方法可以让用户进入页面时显示下拉列表 类似于自动对焦 但更好 类似于亚马逊自动显示菜单的方式 我知道我可能可以制作一个 u
  • sqlite 返回:错误代码 = 1,消息 = 没有这样的列:kitchen1

    我已经收到这个错误两天了 但我找不到我的代码的问题 这是数据库代码 SQLHandler java import android content ContentValues import android content Context im
  • 找出 GCC 包含路径是什么[重复]

    这个问题在这里已经有答案了 我正在尝试以编程方式找到 includeLinux 上的路径 据我了解 实际上意味着找到 GCC 认为它是什么 这是真的吗 Clang 是如何做到的 根据http gcc gnu org onlinedocs c
  • 定位第 n 列(由列数组成)

    假设我有这个 ul li test li li test li li test li li test li li test li li test li ul ul column count 2 我想将第一列向右对齐 第二列向左对齐 有没有办
  • 在 bash 中以半交互方式从用户处读取多个项目

    我试图在 shell 脚本中读取用户的多个项目 但没有成功 目的是首先读取文件列表 从标准输入管道读取 然后再读取两次以交互方式获取两个字符串 我想做的是读取要附加在电子邮件中的文件列表 然后是主题 最后是电子邮件正文 到目前为止我有这个
  • 使用 X86 和任何 CPU 的 C# 项目

    假设我有 2 个 Winform 项目 A B 项目 A 目标 NET 2 0 必须在 x86 它是外部库 上运行 并且由于遗留原因 项目 B 目标 NET 4 0 必须在任何 CPU 上运行 现在我需要从项目 B 调用 A 的方法 但它抛
  • 访问 *ngIf 中的模板变量

    我试图在元素上定义一个模板变量 并使用其隐藏属性来识别该元素是否实际存在于 DOM 中 然后根据该元素显示另一个元素 但如果有结构指令 模板变量似乎不会返回值 hr class divider div a Resend Welcome Em
  • 弹出窗口在 ajax 成功处理程序中被阻止

    我正在尝试打开一个弹出窗口 以允许用户通过 Twitter 进行身份验证 而无需离开他们正在查看的页面 我在网络上看到过这种技术的使用 特别是在 Disqus 评论应用程序中 但是 我只能得到两个结果 要么是 弹出窗口被阻止 消息 要么什么
  • python:是否有作为生成器实现的 XML 解析器?

    我想 即时 解析一个大的 XML 文件 我想使用 python 生成器来执行此操作 我已经尝试过 xml etree cElementTree 的 iterparse 这非常好 但仍然不是生成器 其他建议 xml etree cElemen
  • 如何在 Python 中生成 Azure Blob 存储 SAS 令牌的签名?

    我正在尝试按照 Python 中的说明构建 blob 下载 URL 所需的 SAS 令牌MSDN 我的签名字符串如下所示 r n 2016 12 22T14 3A00 3A00Z n 2016 12 22T15 3A00 3A00Z n 2
  • 将 PLINQ 与异步方法相结合

    我正在尝试将我的 PLINQ 语句组合起来 如下所示 Enumerable Range 0 sortedList Count AsParallel WithDegreeOfParallelism 10 Select i gt GetTran
  • 如何在 AngularJS 中加载内容时添加旋转器?

    我在加载内容时使用按钮微调器 当用户单击 搜索 按钮时 内容将加载 此时buttonLabel将更改为 搜索 并显示微调器 此处按钮将被禁用 加载内容后 Promise已解决 buttonLabel将恢复为 搜索 按钮将在此处启用 我已经尝
  • 如何根据活动配置文件访问 application-{profile}.properties 文件

    我需要访问项目位置之外的 application properties 文件 我可以使用以下方法实现相同的目的 Component PropertySources PropertySource value file user home fi
  • Angular4 - 将表单数据发送到rest api

    如何将表单数据发布到外部 REST API 目前我有一个 html 表单
  • 使用 C# 检测文本文件的编码

    我有一组 Markdown 文件要传递给 jekyll 项目 需要使用程序或 API 找到它们的编码格式 即带 BOM 的 UTF 8 或不带 BOM 的 UTF 8 或 ANSI 如果我传递文件的位置 则必须列出 读取文件 并应生成编码作
  • 本地分支、本地跟踪分支、远程分支和远程跟踪分支有什么区别?

    我刚刚开始使用 Git 我对不同的分支感到非常困惑 谁能帮我弄清楚以下分支类型是什么 当地分支机构 本地跟踪分支 远程分支机构 远程跟踪分支机构 它们之间有什么区别 他们如何相互合作 我想快速的演示代码会非常有帮助 这是长答案 Remote