合并提交第一和第二父母

2024-01-06

在涉及相对提交引用的 Udacity 课程中,它说:

^ 表示父提交,~ 表示第一个父提交

^ 和 ~ 之间的主要区别在于提交的时间 由合并创建。合并提交有两个父项。通过合并 commit 时,^ 引用用于指示该文件的第一个父级 提交,而 ^2 表示第二个父级。第一个父母是 当你运行 git merge 而第二个父分支时你所在的分支 被合并的分支。

基于以下运行输出git log --oneline --graph在命令行上:

使用 SHA 提交f69811c相对于(最顶层,带有头指针)提交,HEAD~4^29ec05ca。合并提交1a56a81的第二个父母是f69811c,课程解释了这一点:“HEAD~4 引用当前提交的第四个父提交,然后 ^2 告诉我们它是合并提交的第二个父提交(被合并的提交)。”

根据黄色引用的课程文本,似乎e014d91 is 1a56a81的第一个父级,因为它是与合并提交具有相同分支的父级。

根据这些信息,会发生什么e6c65a6与 的关系1a56a81 be?

我不认为它也是第二个父级(如果可以有多个第一和第二个父级......),即使它也是合并到主分支中的分支,因为该答案在课程测验中被拒绝。

另外,如果我是对的e014d91 is 1a56a81的第一个父母,什么关系2097521 and 3772ab1 to 1a56a81(如果合并提交实际上可以有多个父级,那么它们似乎也是第一个父级)?


我认为查看图表的一些替代演示可能会有所帮助。

考虑这个非常简单的菱形图,后来的提交绘制得更高,早期的提交绘制得更低:

  D
 / \
B   C
 \ /
  A

Here, D可能是合并提交的极其缩短的哈希 ID,其中B and C是它的两个输入(用 Git 的术语来说是两个父项)。A是两者的(一个,单亲)父母B and C。因此,B and C are 兄弟姐妹,或者如果 Git 直接使用这个概念的话:两者都有相同的父母,所以他们一定是兄弟姐妹(或者两个兄弟或两个姐妹或其他什么)。但 Git 通常不会以这种方式谈论提交——它通常只对直接的父/子关系感兴趣。

我们可以——并且git log --graph也可以将其绘制为:

*    d...... fourth message
|\
| *  c...... third message
* |  b...... another message
|/
*  a...... some commit message

就像人类的孩子一样,Git 的“孩子”可以有多个父母。然而,最典型的情况是one父级,在这种情况下,该父级是第一个、最后一个、也是唯一的父级。你can编号——C^1 is A,例如,但没有真正的需要。没有C^2并要求它只会给你一个错误。

在 StackOverflow 帖子中,我喜欢用较早的提交来绘制图表left以及后来的right, 像这样:

  B
 / \
A   D   <-- master (HEAD)
 \ /
  C   <-- develop

这给了我插入分支名称并附加单词的空间HEAD到其中之一,就像 Git 通常所做的那样。然而,这使得很难区分哪个父母是第一个,哪个是第二个。请注意,上面的第一个垂直图也存在同样的问题。

任何提交at least两个父母被称为合并提交。这使用了这个词merge作为形容词,修饰commit。我们也会经常看到它a merge,使用这个词merge作为名词。正如 ElpieKay 所指出的,合并提交可以有两个以上的父项,但是这些章鱼合并(正如 Git 所说的那样)不要做任何你用成对合并做不到的事情,所以它们大多只是为了炫耀。 :-) 当您确实与三个或更多父母合并时,您可以对所有父母进行编号。 Git 本身唯一的特殊区别是first不过,家长使用--first-parent标记各种 Git 命令,例如git log.

令人困惑的是,git merge命令不必进行合并提交。它有两个部分,我喜欢参考合并作为动词——合并工作的行为——然后做出承诺。它所做的提交是合并提交除非你告诉它不要这样做。而且,好像这还不够令人困惑,还有几个额外的 Git 命令可以执行以下操作:合并作为动词部分不产生合并提交。因此,记住两者之间的区别很重要verb form, to merge,以及名词或形容词形式。

还有几项值得注意:

  • 所有提交(实际上是所有 Git 对象)都是只读的。一旦提交,就永远无法更改,因为它的哈希 ID(可以说是它的真实名称)是通过哈希函数运行其所有基础数​​据来计算的。如果您要以某种方式更改提交中的任何一个位,您都会得到一个新的不同的哈希值,从而获得一个新的不同的提交。

  • 由于创建孩子时父母就已经存在,因此孩子可以记录父母。

  • 但由于创建父级时其子级还不存在,因此父级无法记录其子级。

  • It's these backwards parent <- child linkages that form the commit graph.1

这意味着 Git 的内部链接始终是向后. Git must开始于last,最孩子气,承诺并逆向工作。这就是为什么分支names like master总是指向提示提交的分支机构。由于 Git 向后工作,一次一次提交、合并(有两个或多个父级)会出现一个问题:Git 只能从子级移回到one父母的。 Git 通常解决这个问题的方法是放置all将父级放入队列中,然后处理队列中的第一个提交。

The --first-parent标志告诉 Git 仅放置first将父级放入队列中,忽略第二个父级(如果这是章鱼合并,则忽略任何其他父级)。这使得 Git 可以遍历提交图,而无需一次处理多个提交。


1Mathematically, any graph G is defined by a collection of vertices V and edges E, which we write as G = (V, E). A graph can be directed, and Git's is: the links from vertex to vertex go only one way. Such edges are called arcs. In our case I prefer to call the vertices nodes; these are the actual commits themselves, and each node contains a list of all its outgoing arcs, i.e., the hash IDs of the parent commits.

Git 提交图不仅directed但是也acyclic,这意味着如果我们从任何一个提交开始并遍历图表,我们将永远不会返回到同一提交。换句话说,没有父母可以成为自己的孩子。对于 Git 所做的各种图形转换来说,这是一个有用且重要的属性,因此我们有时将 Git 提交图称为DAG,这是缩写有向无环图。提交图或提交 DAG 代表您曾经创建的所有快照。

请注意,每个源快照仅附加到一次提交。图操作不必关心相应快照中的内容:他们只查看图表本身!

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

合并提交第一和第二父母 的相关文章

  • 是否可以获取具有偏移限制的总行数

    嘿盖兹这有可能获得带有偏移限制的总行数吗 Scenario SELECT FROM users limit 0 5 此查询包含 300 条记录 但问题是如果我使用偏移量调用此查询 结果将仅显示 5 条记录 并且我不想两次编写查询 一个用于分
  • 如何提交 git 标签?

    我已成功对中央 git 存储库进行 提交和推送更改 我现在意识到我想标记所有文件的当前版本 所以我这样做 git tag a 0 5 这样就成功了 但现在我尝试git push我被告知没有什么可承诺的 如何将新标签推送到中央存储库 注意gi
  • 如何让 Git diff 忽略版本号更改?

    有没有办法从 Git diff 中消除版本号变化噪音像这个 https github com keith Xcode app strings commit 9502c601cad31ef452c4cd6e8ece3982345fba1d 具
  • 如何配置“git diff”以使用 emacs diff [重复]

    这个问题在这里已经有答案了 是否可以配置 git diff 以使用 emacs diff 如果是的话 你能告诉我怎么做吗 谢谢 看这个问题 如何使用视觉差异程序查看 git diff 输出 https stackoverflow com q
  • 如何将 HEAD 移回之前的位置? (分离头)和撤消提交

    在 Git 中 我试图做一个squash commit通过合并到另一个分支然后重置HEAD通过以下方式前往上一个地点 git reset origin master 但我需要走出这一步 如何将 HEAD 移回之前的位置 我有 SHA 1 片
  • Git 将新的本地分支推送到远程,无需指定名称

    当针对特定的跟踪问题进行补丁修复时 我们的工作流程如下所示 1 git checkout patch git pull upstream patch make sure we re up to date 2 git checkout b i
  • 为什么 iTerm2 中不显示 git 颜色

    所以我有我的 gitconfig 设置来处理颜色 在终端中它工作得很好 看起来也不错 然而 在 iTerm2 中 除非我为 git 设置反向属性 否则我的 gitconfig 根本不会显示颜色 然后它们就出现了 但是谁喜欢相反的颜色呢 为什
  • 如何恢复已删除的文件[重复]

    这个问题在这里已经有答案了 可能的重复 在 Git 存储库中恢复已删除的文件 https stackoverflow com questions 953481 restore a deleted file in a git repo 如何恢
  • Visual Studio 代码中的“Git:gpg 未能签署数据”

    全新安装 Linux 后 我尝试设置我的环境 并且不断收到Git gpg failed to sign the data在本地提交更改时出错 我使用的是 Visual Studio Code 专有版本 而不是开源版本 gitconfig u
  • 致命错误:找不到“Fabric/Fabric.h”文件

    我正在使用 xcode 6 3 1 OSX 10 10 3 并且我已经在本地系统上成功配置了 crashlytics 它工作正常 并通过 Fabric 应用程序发布构建 但是当我将相同的代码库转移到 teamcity 时 它向我显示以下错误
  • Git 和外部备份。子目录是空的,我宁愿它不是空的。

    我想使用 Git 创建外部备份系统 这部分是受到答案的启发在外部磁盘上备份整个 git 存储库的最佳方法是什么 https stackoverflow com a 4372855 2533127 其中建议如下 您还可以通过启动一个新的存储库
  • go语言读取并合并两个Yaml文件

    假设我们有两个 yaml 文件 master yaml someProperty someVaue anotherProperty anotherValue 覆盖 yaml someProperty overriddenVaue 是否可以解
  • 在 $git push -u origin main 命令之后,Git bash 不请求任何身份验证,实际上什么也不做

    当我尝试将代码上传到 github 时 以下是我在 Git Bash 终端中执行的步骤 当我尝试使用将代码推送到 github 时 git push u origin main光标移动到下一行并持续闪烁 但不执行任何操作 git remot
  • 从 svn 到 git,移动了主干

    我正在尝试将 svn 存储库切换到 git 这是一个旧的存储库 以前的维护者之一为每个新版本移动了主干 例如 以前的存储库位于 svn ssh svn mycompany com project release 1 trunk 现在 我们当
  • Git core.safecrlf 对具有相同行结尾的文件有不同的行为

    我有带有 VS 项目的 Windows 计算机 并且使用 Visual Studio 和 Cygwin 环境中的工具 包括 Git 有时 编辑后我会在文件中得到不同的行结尾 我想要简单的解决方案来检查文件的行尾一致性 然后再将其发送到存储库
  • git 列出所有可用命令

    有没有命令可以显示 GIT 中所有可用命令的列表 有git help但它显示 usage git version exec path
  • AngularJs:显示来自 git 或 Bower 的版本号

    我创建了一个 Angular 应用程序 我想在屏幕上显示应用程序的当前版本号 目前我已将其实现为常量 application constant constants VERSION 1 1 2 但这需要我在每个新版本上更新常量 我使用 Bow
  • 如何在cygwin下更改git中文件的大小写?

    我们在区分大小写 不敏感的混合环境 cywgin linux 中工作 今天有人通过重命名文件 将 S 更改为 s 对我们的工作流程造成了小破坏 这导致了各种有趣的跨分支合并问题 而且说实话 没有人完全确定发生了什么 在 cygwin 的 g
  • 获得干净的 git 沙箱的最有效方法是什么?

    对于我的持续集成构建 我想确保我的 git 沙箱中没有存放任何杂散文件 并且没有任何文件被无意中更改 我知道关于git reset hard HEAD 这解决了部分问题 但我想我想做的是删除所有未跟踪和忽略的文件 我可以用蛮力的方式做到这一
  • 如何快速查看哪个 Git 分支是最新的?

    例如 如果 git 上有 4 个分支 如下所示 branch1 branch2 current branch branch3 newest commits here master oldest 我的问题是 如何从 git 命令行检查我当前的

随机推荐

  • 如何删除 django 中的数据库表?

    我改变了模型并进行了迁移 然后我又更改了一次模型 当尝试 python manage py migrate 时出现错误 Operations to perform Apply all migrations admin auth conten
  • 404 - 请求的资源不可用。 (Spring-MVC)

    我对 Spring MVC 视图解析器不太熟悉 我试图从我的控制器返回一个 JSP 我的控制器方法正在正确执行 但是当返回视图时 我得到404 The requested resource is not available error 这是
  • Javascript / Nodejs 在 Nodejs 模块的顶层使用等待

    我尝试找到问题的解决方案 但找不到它 并且正在寻找一些 最佳实践示例 我有一个 Nodejs Express 应用程序 我的函数被分割在文件中 例如我有这个控制器 oktacontroller js var okta api key
  • IE 和 Firefox 中的按钮大小不相等

    我的 jsp 页面上有几个按钮 我使用的样式为 buttonblue background color 003366 border color 99CCFF color FFFFFF font family Verdana Arial He
  • 对如何处理 CORS OPTIONS 预检请求感到困惑

    我是跨源资源共享的新手 并试图让我的网络应用程序响应 CORS 请求 我的 web 应用程序是在 Tomcat 7 0 42 上运行的 Spring 3 2 应用程序 在我的 web 应用程序的 web xml 中 我启用了 Tomcat
  • IISExpress 8 无法读取配置文件redirection.config

    我正在使用 IISExpress8 运行 Windows Server 2008 R2 x64 当导航到 c Program Files x86 IIS Express gt iisexpress exe it says 文件名 重定向 c
  • Rails Chartkick:只需要轴上的整数值。使用离散的还是其他的?

    假设我有以下代码 使用 Chartkick 这会产生以下图表 我希望使用整数来标记垂直轴 不是小数 我认为discrete选项应该这样做 但对于这个例子 它所做的只是将水平轴上元素的格式从时间更改为数字 即以下代码 产生这个 所以我的问题是
  • 使用 TOR 运行 python 脚本

    大家好 首先我想确保有类似的主题 但没有公认的答案或明确的回应 所以我想把它们结合起来再问一遍 我有以下脚本 import urllib2 proxy urllib2 ProxyHandler http 127 0 0 1 9050 ope
  • 我想使用PHP的PDO将数据插入mysql数据库。但数据没有插入

    我想使用PHP的PDO将数据插入mysql数据库 但数据没有插入 我以前使用过PDO 但没有遇到任何问题 但在下面的例子中 我不明白我哪里做错了 谁能帮帮我吗 输出显示良好 有回声
  • 如何在 R 中为 Quantstrat 编写自定义规则函数 - 将追踪止损订单替换为 stoplimit 和ruleOrderProc

    我的目标是使用下面概述的规则来生成信号来放置新的 stoplimit 订单来取代我的追踪止损 我不希望我的止损无限期地跟踪 直到它达到我的盈亏平衡价格 如果已经可以以某种方式实现这一点 请告诉我 我希望在 quantstrat 中编写一个自
  • 如何通过短信或彩信将超链接发送到手机

    我一直在寻找一种方法 通过短信或彩信将具有不同外观的 URL 的超链接发送到手机 我能想到的唯一例子如下 url http www google co uk Click Here url 所以上面的代码会显示 点击这里 当您单击 单击此处
  • 如何使用 JSON-simple (Java) 判断返回是 JSONObject 还是 JSONArray?

    我正在访问一项服务 有时会得到这样的结果 param1 value1 param2 value2 有时会得到这样的回报 param1 value1 param2 value2 param1 value1 param2 value2 我如何知
  • 无法在 Gerrit 中合并

    每当我向 Gerrit 发送评论并且该评论等待一段时间时 我都会收到cannot mergeGerrit 中的消息 我理解它的到来 因为其他人会更改相同的文件并在我之前交付 我正在尝试以下解决方法来解决我的问题 放弃当前的审查 创建一个新的
  • GEKKO RTO 与 MPC 模式

    这是一个由此衍生的问题one https stackoverflow com questions 60761440 variable bounds in mpc with gekko 在发布我的问题后 我找到了一个解决方案 更像是强制优化器
  • 将 Admob 添加到 libgdx

    RelativeLayout layout new RelativeLayout this AndroidApplicationConfiguration config new AndroidApplicationConfiguration
  • 在 Chrome 扩展内容脚本中使用 Dart 无法运行?

    我正在尝试使用 Dart 编写 Chrome 扩展 到目前为止 除了内容脚本之外 一切都很顺利 内容脚本 dart 文件中的 main 函数似乎没有运行 更具体地说 首先 Dartium 无法使用 因为在清单中的 js 规则中给出 dart
  • 学习编程语言的工作原理

    我已经编程多年 主要是Python 但我不明白当我编译或执行代码时幕后发生了什么 本着question https stackoverflow com questions 1514812 gentle introduction to ope
  • Eclipse 调试器跳转到错误的返回语句

    我遇到了一个非常奇怪的情况 我正在 Android 2 1 平台上用 Java 通过 Eclipse Galileo 执行以下操作 Get gravity geomagnetic data to return to the caller f
  • Python:csvwriter 的问题

    我正在尝试将数据 主要是日期 布尔值和浮点数据类型 写入 CSV 文件格式 这是我的代码片段 Write data to file with open OUTPUT DIR output filename w as outputfile w
  • 合并提交第一和第二父母

    在涉及相对提交引用的 Udacity 课程中 它说 表示父提交 表示第一个父提交 和 之间的主要区别在于提交的时间 由合并创建 合并提交有两个父项 通过合并 commit 时 引用用于指示该文件的第一个父级 提交 而 2 表示第二个父级 第