Git 分支从哪里开始以及它的长度是多少?

2024-04-20

我时不时地被问到,git 上的某个分支在什么提交上启动,或者是否在特定分支上创建了某个提交。分支的终点非常清楚:那就是分支标签所在的位置。但是——从哪里开始呢?简单的答案是:在我们的提交中created那个分支。但据我现在所知,这些信息在第一次提交后就丢失了,这就是我问这个问题的原因。

只要我们知道我们分支的提交,我们就可以画图来明确:

A - B - C - - - - J     [master]
     \
      D - E - F - G     [branch-A]
           \
            H - - I     [branch-B]

我在提交时创建了分支 BE这就是“开始”。我知道这一点,因为我做到了。但其他人能以同样的方式认识它吗?我们可以像这样绘制相同的图表:

A - B - C - - - - J     [master]
     \
      \       F - G     [branch-A]
       \     /
        D - E
             \
              H - I     [branch-B]

所以,现在看一下图表,哪个分支开始于E,哪一个在B?是否提交D是两个分支的成员还是我们可以清楚地确定它属于 A 分支还是 B 分支?

这听起来有点哲学,但事实并非如此。主管有时想知道,一个分支何时启动(它通常标志着任务的开始)以及某些更改属于哪个分支(以了解某些更改的目的 - 工作是否需要),我会想知道 git 是否提供信息(工具、命令)或定义来正确回答这些问题。


在 Git 中,您可以说每个分支都从根提交开始,这确实是事实。但我想这对你来说没有多大帮助。您可以做的是定义与其他分支相关的“分支的开始”。执行此操作的一种方法是使用

git show-branch branch1 branch2 ... branchN

这将在输出底部显示所有指定分支之间的公共提交(如果实际上存在公共提交)。

这是一个例子Linux 内核 Git 文档show-branch https://www.kernel.org/pub/software/scm/git/docs/git-show-branch.html

$ git show-branch master fixes mhf
* [master] Add 'git show-branch'.
 ! [fixes] Introduce "reset type" flag to "git reset"
  ! [mhf] Allow "+remote:local" refspec to cause --force when fetching.
---
  + [mhf] Allow "+remote:local" refspec to cause --force when fetching.
  + [mhf~1] Use git-octopus when pulling more than one heads.
 +  [fixes] Introduce "reset type" flag to "git reset"
  + [mhf~2] "git fetch --force".
  + [mhf~3] Use .git/remote/origin, not .git/branches/origin.
  + [mhf~4] Make "git pull" and "git fetch" default to origin
  + [mhf~5] Infamous 'octopus merge'
  + [mhf~6] Retire git-parse-remote.
  + [mhf~7] Multi-head fetch.
  + [mhf~8] Start adding the $GIT_DIR/remotes/ support.
*++ [master] Add 'git show-branch'.

在那个例子中,master正在与fixes and mhf分支机构。将此输出视为一个表,每个分支由其自己的列表示,每个提交都有自己的行。包含提交的分支将有一个+ or -显示在该提交所在行的列中。

在输出的最底部,您将看到所有 3 个分支共享一个共同的祖先提交,并且它实际上是head提交master:

*++ [master] Add 'git show-branch'.

这意味着两者fixes and mhf从该提交中分支出来master.

替代解决方案

当然,这只是确定 Git 中公共基础提交的一种可能方法。其他方式包括git merge-base寻找共同的祖先,以及git log --all --decorate --graph --oneline or gitk --all可视化分支并查看它们分歧的地方(尽管如果有大量提交,很快就会变得困难)。

原贴者的其他问题

对于这些问题,你有:

是否提交D是两个分支的成员还是我们可以明确决定它是否属于branch-A or branch-B?

D是两个分支的成员,它是两个分支的祖先提交。

主管有时想知道,当分支启动时(通常标志着任务的开始)...

在 Git 中,您可以重写整个提交树及其分支的历史记录,因此when分支“开始”并不像 TFS 或 SVN 那样一成不变。你可以rebase分支到 Git 树中的任何时间点,甚至将其放在根提交之前!因此,您可以使用它在树中您想要的任何时间点“启动”任务。

这是一个常见的用例git rebase,将分支与上游分支的最新更改同步,将它们沿着提交图及时“向前”推送,就好像您“刚刚开始”在该分支上工作一样,即使您实际上一直在处理它一阵子。如果您愿意,您甚至可以沿着提交图及时推回分支(尽管您可能必须解决很多冲突,具体取决于分支内容......或者也许您不会)。您甚至可以在开发历史记录的中间插入或删除分支(尽管这样做可能会更改许多提交的提交shas)。重写历史记录是 Git 的主要功能之一,这使得它如此强大和灵活。

这就是为什么提交同时带有创作日期(最初创作提交的时间)和提交日期(最后一次提交到提交树的时间)的原因。您可以将它们视为类似于创建时间日期和上次修改时间日期。

主管有时想知道...某些更改属于哪个分支(为了达到某些改变的目的——工作是否需要)。

同样,由于 Git 允许您重写历史记录,因此您可以(重新)将一组更改基于您想要的提交图中的几乎任何分支/提交。git rebase从字面上看,您可以自由地移动整个分支(尽管您可能需要在移动时解决冲突,具体取决于您将分支移动到的位置及其包含的内容)。

话虽如此,您可以在 Git 中用来确定哪些分支或标签包含一组更改的工具是--contains:

# Which branches contains commit X?
git branch --all --contains X

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

Git 分支从哪里开始以及它的长度是多少? 的相关文章

  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • GitHub API:标记提交所属(与 git describe --tag 并行)

    我正在使用 GitHub API 进行实验octokit https github com octokit octokit rb红宝石 我的目标是能够提取提交 SHA 所属的 标签 现在我可以使用命令行轻松地执行此操作 gt git des
  • 为什么cherry-pick总是会导致合并冲突?

    我正在从发布分支中挑选特定的提交到我的本地工作副本中 每次我从发布分支中挑选一个提交时 我都会遇到必须解决的合并冲突 即使更改看起来微不足道 例如 const char kApplicationVersion Develop const c
  • 有没有办法缓存 https 凭据以推送提交?

    我最近转而将我的存储库同步到 GitHub 上的 https 由于防火墙问题 并且每次都要求输入密码 有没有办法缓存凭据 而不是每次都进行身份验证git push 自 Git 1 7 9 2012 年发布 以来 Git 中有一个巧妙的机制可
  • 如何在 Windows 上向 git 存储库添加符号链接?

    我使用 GitHub 的电子环境编译 OS X 的二进制文件 并希望将输出添加到 git 存储库 我试过 git add error readlink sulu app Contents Frameworks Electron Framew
  • 在 git repo 中查找超过 x MB 且 HEAD 中不存在的文件

    我有一个 Git 存储库 用于存储随机的内容 主要是随机脚本 文本文件 我设计的网站等 随着时间的推移 我删除了一些大型二进制文件 通常为 1 5MB 这些文件会增加存储库的大小 而我在修订历史记录中不需要这些文件 基本上我希望能够做到 m
  • Git 无效的修订范围 Symfony2 Composer 外部包

    RuntimeException Failed to execute git log 18efcf67d236d5bbf46ac67820250dffd0474b6e 94e2146f525fa1367e15646fa273e5b34f92
  • 无法使用 git 配置文件进行 ssh

    我知道它被问了很多次 但我无法得到我的问题的答案 我正在尝试使用配置文件 ssh 到系统 配置文件是 Host qa HostName 10 218 70 345 User user IdentityFile C Users bean ss
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • refname 不明确且拉取失败

    我运行了以下命令 因为我想将生产分支移回而不必先签出 git branch f production HEAD 1 现在 当我检查生产时 我收到以下警告 warning refname production is ambiguous 然后我
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • git Push over sshfs 失败,并显示“关闭 sha1 文件时出错:错误的文件描述符”

    我们使用 sshfs 通过 SSH 安装文件系统 并将其用作 git 存储库协作的远程存储 Mac OSX 10 6 6 到 RHEL 3 服务器 SSHFS 版本 2 2 MacFUSE SSHFS 2 2 0 MacFUSE 库版本 F
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • git 匹配多个单词的标签

    我们可以得到最后一个 git 标签 它以一个单词 例如 TEST 开头 如下所示 git describe tag dirty match TEST 我想知道如何获得最后一个以 word1 开头的标签orword2 例如测试OR跑步 我尝试
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin

随机推荐

  • 获取 Ruby 中第一个 = 符号之后的子字符串

    纯粹出于好奇 是否有一种更优雅的方法来简单地获取第一个之后的子字符串 字符串中的符号 以下作品回馈name bob string option name bob string string index 1 1 只是感觉不太像Ruby 这也有
  • 用于 Java 的 JWT(JSON Web Token)库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开发一个使用 Java 和 AngularJS 开发的 Web 应用程序 并选择实现令牌身份验证
  • Fabric 上的事件中心已关闭 编写您的第一个应用程序

    我目前正在尝试在此处运行 Hyperledger Fabric 的第一个应用程序示例 gt http hyperledger fabric readthedocs io en release 1 1 write first app html
  • 您推荐哪种工作流引擎? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑在这个即将到来的项目中使用工作流引擎的想法 我们知道使用工作流引擎有很多注意事项 并且我们在许多平台上拥有丰富的开发经验 因此我
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 对 Promise 中的错误和拒绝感到困惑

    All 我对 JS Promise 还很陌生 当谈到 Promise 链接时 有一个令人困惑的地方 假设我有一个如下的 Promise 链接 var p new Promise function res rej then function
  • 绑定不适用于动态加载的 xaml

    我在用着XamlReader成功加载 xaml 文件并创建FrameworkElement跟 共事 我正在加载的 xaml 中包含绑定表达式 例如
  • 在Windows cmd中以颜色显示用户输入的文本

    我还有一个关于 Windows cmd 的小控制台程序的问题 我使用 colorama 为终端中的文本着色 使其看起来像这样 然后我发现如何为文本着色input 使用一点 hack 的方法 打印没有换行符 如下所示 from coloram
  • CouchDB Java 客户端

    这个维基页面 http wiki apache org couchdb Getting started with Java http wiki apache org couchdb Getting started with Java 列出了
  • AppEnginePlugin:不支持的主要.次要版本 51.0 - appengine 1.9.17

    更新到 Android Studio 1 0 RC 后 我收到此错误 AppEnginePlugin Unsupported major minor version 51 0 既然appengine是用java 1 7编译的 为什么它说不支
  • Chrome 开发工具设置:允许自定义 UI 主题的“实验”选项卡在哪里?

    我使用的是 chrome 36 版本 根据this https chrome google com webstore detail devtools theme zero dark bomhdjeadceaggdgfoefmpeafkjhe
  • 是否有 x64 版本的 MsStkPrp.dll

    我正在将 ATL 控件移植到 64 位 该控件在其属性对话框中使用 Stock 属性页 CLSID StockFontPage CLSID StockColorPage 针对 x64 重新编译后 颜色 和 字体 选项卡丢失 因为 MsStk
  • Java Swing:“优先考虑组合而不是继承”这句话适用吗?

    优先考虑组合而不是继承 这句话适用于 Swing 组件吗 在继续设计 UI 之前 我想收集一些有关该主题的专业意见以及哪些代码更容易维护 优先考虑组合而不是继承 这句话适用于 Swing 组件吗 Yes 我扩展 Swing 组件的唯一一次是
  • R:tuneRF 函数的行为不明确(randomForest 包)

    我对这句话的含义感到不舒服stepFactor的参数tuneRF http www inside r org packages cran randomForest docs tuneRF函数用于调整mtry进一步使用的参数randomFor
  • Android - 解压缩文件夹?

    我的 SD 卡上有一个 zip 文件夹 如何解压缩该文件夹 在我的应用程序代码中 我正在使用 Beginner 方法的修改版本 该方法扩展了 AsyncTask 并可以更新主线程上的观察者 逐字节压缩非常慢 应该避免 相反 更有效的方法是将
  • 将静态宽度垂直子菜单置于动态水平菜单下方

    我已经在这个问题上呆了好几个小时了 我可以找到我想要的各个组成部分 但我似乎无法将它们组合在一起 我遇到的问题是我无法让静态宽度子菜单以它们派生的 li 项目为中心 如果这些父 li 项目具有静态宽度 这应该很容易 但我想根据页面的宽度动态
  • compileSdkVersion 'Google Inc.:Google APIs:23' 和compileSdkVersion 23 之间有什么区别

    在 Gradle build 文件中 我看到一些项目使用 compileSdkVersion Google Inc Google APIs 23 有些只是使用号码 compileSdkVersion 23 两者有什么区别 后一种对于绝大多数
  • Java有using语句吗?

    Java有没有可以在hibernate中打开会话时使用的using语句 在 C 中 它类似于 using var session new Session 因此该对象超出范围并自动关闭 Java 7 推出自动资源块管理 http www in
  • 如何在 fs2 中“拆分”流?

    我想做这样的事情 def splitStream F A stream fs2 Stream F A split A gt B Stream F A Stream F B stream stream map split 但这不起作用 因为它
  • Git 分支从哪里开始以及它的长度是多少?

    我时不时地被问到 git 上的某个分支在什么提交上启动 或者是否在特定分支上创建了某个提交 分支的终点非常清楚 那就是分支标签所在的位置 但是 从哪里开始呢 简单的答案是 在我们的提交中created那个分支 但据我现在所知 这些信息在第一