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

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(使用前将#替换为@)

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

  • 有没有一个简单的命令可以将分支转换为标签?

    我即将完成将 哑快照 转换为 git 的繁琐过程 这个过程进展得非常顺利 感谢这个重命名过程 https stackoverflow com questions 6628539 how to tell git that its the sa
  • 如何使用git-svn切换svn分支?

    复制 如何让 git svn 使用特定的 svn 分支作为远程存储库 https stackoverflow com questions 192736 how do i make git svn use a particular svn b
  • Gerrit 和 Active Directory

    我正在尝试设置 Gerrit 以使用我们的公司 Active Directory 进行身份验证 我知道很多人都设法让它发挥作用 但它对我来说不起作用 如果我运行一个ldapsearch命令如下我得到了正确的结果 所以我知道我的搜索字符串是正
  • Git 工作流程:分叉项目并维护本地修改副本,但保持最新

    我正在尝试找出最佳工作流程 用于维护具有自定义功能的 github 托管项目 moodle 的本地副本 同时保持保持副本最新的能力 告诉我我正在考虑做的事情是否完全疯狂 分叉项目 github com moodle moodle gt gi
  • 从 C# 中的子上下文菜单项访问时,源代码控制为空

    当他们从上下文菜单条中单击子菜单项 颜色 gt 红色 时 我试图更改按钮的颜色 该代码附加到用户定义的按钮数量 为了弄清楚他们试图更改哪个按钮 我尝试从子项目转到源代码管理 如下所示 发送者 gt 所有者工具条 gt 所有者菜单 gt 源代
  • 是否可以检测 http git 远程是智能还是愚蠢?

    我正在我的应用程序中实现一个选项来使用 depth 1制作 git repo 的最小功能克隆 我刚刚意识到愚蠢的 http 传输不支持 depth 我想自动检测 http 远程是愚蠢的还是聪明的 这样我就可以省略 depth与哑 http
  • 具有单个子模块的多个存储库

    我已经找了一段时间但没有找到答案 也许我不知道该看什么 我们有一个主库 它本身就是一个存储库 我们称之为 Lib 它包含我们的大部分模块和子模块 我们还假设它的大小为 2GB 现在我们有很多项目 例如 ProjA ProjB ProjC 每
  • 如何使用 git 比较不​​在存储库中的两个文件

    我想比较两个不在任何 git 存储库中的 css 文件 git中有这样的功能吗 git的 diff 比标准 Unix 更实用diff 我经常想这样做 并且由于这个问题在谷歌上排名很高 所以我希望这个答案出现 这个问题 如何使用git dif
  • GIT:提交时“致命:无法写入 new_index 文件”

    当我尝试将更改提交到本地存储库时 我收到以下消息 致命 无法写入 new index 文件 As this 线程说明 http luhman org blog 2010 04 05 git fatal unable write newind
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7
  • 使用Git记录文件复制操作

    当我使用 git mv 在 git 中移动文件时 状态显示该文件已被重命名 即使我更改了某些部分 它仍然被认为几乎是相同的东西 这很好 因为它让我可以跟踪它的历史记录 当我复制文件时 原始文件有一些历史记录 我想将其与新副本关联起来 我尝试
  • 哪些 git hooks 适用于“git rebase --continue”?

    我正在尝试为我的组织构建一组 git hook 脚本 我想使用的一个脚本 仅用于我自己的多个项目 将是检查git rebase continue我的代码中没有留下任何冲突标记 lt lt lt lt lt or gt gt gt gt gt
  • 如何更改 GitHub 上的文件模式?

    git add test file git commit m first commit create mode 100644 test file git push git update index add chmod x test file
  • git-lfs 中的多个文件版本

    我正在尝试估计 GitHub 上我的项目的存储要求 并对 git lfs 如何存储多个版本的文件有一些疑问 git lfs 是否存储多个版本的文件 如果是这样 对文件的每次更改都会导致复制整个文件 还是仅存储差异 所有版本都会计入 gith
  • Jmeter 和 Bitbucket 服务器负载测试

    我是 Jmeter 的新手 我有一个本地托管的 Bitbucket 服务器 有时 当 Bamboo plan 触发并发 git 克隆操作时 会发现 Bitbucket 服务器变得缓慢 无响应 我必须重新启动服务 我想通过对另一个本地创建的
  • 如何修改 git add 来处理已删除的文件?

    我从 git 存储库中删除了一些文件 现在 根据状态查看 Changes not staged for commit deleted project war favicon ico deleted project war index htm
  • “解决方案的源代码控制之间似乎存在差异......”

    我们在 Visual Studio 2005 和 TFS 中经常遇到此错误 任何人都可以帮助我们查明此消息的原因吗 完整的消息是 解决方案的来源之间似乎存在差异 控制有关某些项目的信息以及 项目文件 为了解决这个差异 有必要检查 项目文件并
  • “警告:'github.com' 的 ECDSA 主机密钥与 IP 地址的密钥不同”问题

    我不知道发生了什么 但有一天 当我起床时git push我的改变是 Warning the ECDSA host key for github com differs from the key for the IP address 140
  • 如何应用 .diff 文件

    我有一个 diff 类型文件 看起来像爆炸了 diff git a res User lua b res User lua index db8c2cc 4d2af0f 100644 a res User lua b res User lua
  • GIT 或 SVN 或...适用于前端开发人员

    我最近开始将一些项目导入到工作中的 Subversion 存储库中 在接下来的几周内 我希望团队中的每个人都能负责自己的源代码控制管理 我选择 SVN 而不是 GIT 的原因是我想要everyone团队中的人员 包括设计师 前端人员 集成商

随机推荐

  • 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