关于 git pull 的合并/变基步骤的困惑

2023-12-13

来自 Loeliger 2ed 的 Version Control with Git,关于 git pull 中的合并或变基步骤:

在拉取操作的第二步中,Git 执行 合并(默认),或变基操作。

关于 git pull 中的合并步骤:

在此示例中,Git 合并了 远程跟踪分支,origin/master,进入您的本地追踪 分支、主站, using 一种特殊类型的合并称为 快进.

但是 Git 如何知道合并那些特定的分支呢?答案 来自配置文件:

[branch "master"]
        remote = origin
        merge = refs/heads/master

换言之,这为 Git 提供了两条关键信息: 是当前已签出的分支,使用 origin 作为默认远程 在获取(或拉取)期间从中获取更新。 此外,在 git pull 的合并步骤中,使用 refs/heads/master 从远程作为默认分支合并到主分支 分支。

  • 一般来说,合并步骤是否将远程跟踪分支合并到master或当前分支?我的猜测是当前分支,即指向的分支HEAD,并且不一定是master.

    请注意我的猜测来自https://git-scm.com/docs/git-pull

    将远程存储库中的更改合并到当前的 分支。在默认模式下,git pull 是 git fetch 的简写 接下来是 git merge FETCH_HEAD。

    更准确地说, git pull 使用给定的参数运行 git fetch ,并且 调用 git merge 将检索到的分支头合并到当前的 分支.

  • Does git pull总是将远程跟踪分支合并到当前分支中? (我的猜测是肯定的)。 如果不是,是否有争议git pull指定合并步骤中的目标分支? 如果我是对的,refspec论证git pull不指定合并步骤的目标分支。

  • 为什么合并是“快进合并”?

关于 git pull 中的 rebase 步骤:

命令 git pull --rebase 将导致 Git 变基(而不是 合并)您的本地跟踪分支到远程跟踪分支 仅在这次拉动期间。

  • rebase 步骤是否正确git pull变基当前分支(即由HEAD)到远程跟踪分支? 如果是,为什么引用说“您的本地跟踪分支”而不是当前分支?

一般来说,合并步骤是将远程跟踪分支合并到master还是当前分支?

这两个是相同的:master是您当前的分支。远程跟踪分支是origin/master.

(Where origin只是用于远程的默认名称,而不是任何特殊的 Git“关键字”,并且master是默认分支。实际场景中的实际名称可能有所不同。)

的目标是rebase or merge操作(产生的更改将去往的位置)是当前分支。

如果你尝试做一些愚蠢的事情,比如checkout origin/master尝试使跟踪分支成为当前分支。

所以,合并的目标是master。问题是,合并什么?如果您提取一些新的上游材料,您可能最终会遇到(例如)这种情况:

     YOURS (master)             
             *
              \      UPSTREAM (origin/master)    
                *     *
                 \   /
                   *      <--- "git merge-base master origin/master"
                   |
                   *

master and origin/master已经分歧,并且分别有 2 个和 1 个新提交。

With git rebase,下面的两个本地提交YOURS在 UPSTREAM 之上重写:

      YOURS (master)             
              *       <-- rewritten: SHA changes
               \          
ghost of YOURS  *       <-- rewritten: SHA changes
      * ---- *    \
              \     * UPSTREAM (origin/master)
               \  /
                 *
                |

现在的情况是“当地分行master领先于origin/master2 次提交”。你准备好(尝试)git push.

您原来的未重写提交仍然存在(在 ASCII 图中用“ghost of YOURS”表示)。它们在git reflog。当它们从那里过期或被手动清除时,它们就变成垃圾,最终被垃圾收集。

With git merge你做了其他事情:你的更改将被合并origin/master并且创建了一个新的提交,它有两个父项:

                  * YOURS-merged (master)
                /  \
     YOURS    /      \          
             *        |
              \       |  UPSTREAM (origin/master)    
                *     *
                 \   /
                   *      <--- "git merge-base master origin/master"
                   |
                   *

现在你的master领先于origin/master通过 1 次提交。如果您现在推送成功,远程存储库的master也将呈现上述形状,双父提交沿着一条路径进行更改,而上一个上游提交则沿着另一条路径。不存在“你的幽灵”:你的更改从未被重写。

为什么合并是“快进合并”?

快进合并或变基发生在两种情况下。其一是origin/master没有任何并行更改:

     YOURS (master)             
             *
              \          
                *
                 \  
                   *    UPSTREAM (origin/master)
                   |
                   *

在上述情况下,无需执行任何操作:一切都是最新的,并且您领先于origin/master通过两次提交。因此,这不是“快进任何事情”;而是“快进”。 Agit merge or git rebase只会什么也不做。你可以尝试git push如果您对这些承诺感到满意。

当您没有任何本地更改时,就会发生真正的快进场景:

                     * UPSTREAM (origin/master) 
                    /
    YOURS (master) *
                   |
                   *

在这种情况下,如果您执行git rebase or git merge,那么默认情况下,您的master HEAD指针只是“向前滑动”以指向相同的提交origin/master,这张幻灯片是“快进”:

        YOURS (master) *  UPSTREAM (origin/master)  
                     /
                    *  <- master slid forward from here
                    |
                    *

“快进”术语可能指的是这样的想法:只有HEAD指针移动(同时重写本地文件系统树以匹配)。无需编写或重写新的提交。

在不同的场景中快进是不可能的(除非您放弃本地更改)。必须生成新的合并提交,或者变基必须重写一些更改。在这些操作之前,不存在任何提交master可以直接向前滑动。

有些人以某种方式使用 Git,他们希望合并所有本地工作的提交。当上游没有新的工作可供合并时,您可以强制 Git 无论如何进行合并提交git merge --no-ff(无快进)。从这个开始:

     YOURS (master)             
             *
              \          
                *
                 \  
                   *    UPSTREAM (origin/master)
                   |
                   *

你会得到这样的东西:

               ----* YOURS-merge   (master)
     YOURS    /    |  
             *     |
              \    |     
                *  |
                 \ | 
                   *    UPSTREAM (origin/master)
                   |
                   *

这个想法是,在历史的主线路径上,这两种变化似乎浓缩为一步。可以跟随另一个父级来查看多次提交的详细血统。

为什么引用说“您的本地跟踪分支”而不是当前分支?

这是个错误。涉及的所有分支都是本地的(在您的存储库中)。有工作分支(比如master),及其远程跟踪分支(如origin/master)。两者都是本地人。

您工作的分支不称为跟踪分支;而是称为跟踪分支。它不跟踪任何东西。

一些本地分支未与远程跟踪分支配对。存储库中没有远程的所有分支(例如由git init)纯粹是本地的。任何本地创建的分支都是纯本地的,除非推送到远程存储库。

远程跟踪分支是一个与本地分支配对的类似分支的对象。它跟踪上游正在做什么。每次你做一个git fetch,它可能会被重写以指向一些不同的提交。当地分行不受影响。两者可能会出现分歧,这可以通过变基或合并来解决。当你做一个git push,本地分支更新实际远程上游仓库中的一个。当此操作成功(未被远程端拒绝)时,本地跟踪分支也会更新为指向同一提交,因此它们保持同步。

一般情况下,纯本地操作不会改变origin/master:它跟踪远程存储库中相应分支的状态。

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

关于 git pull 的合并/变基步骤的困惑 的相关文章

  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 在 Web 应用程序中显示最新的提交值?

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

    我正进入 状态fatal Failed to resolve HEAD as a valid ref 每当我尝试承诺时 我努力了 echo ref refs heads master gt git HEAD 但它不起作用 也尝试过 git
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 我可以忽略全局 .gitignore 吗?

    我的全局 gitignore 一般都很棒 但对于这个一次性项目 我不希望应用全局规则 如何删除这个怪异存储库的全局 gitignore 规则 在您的存储库中运行此命令 git config local core excludesfile f
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • 在 Windows 上使用 Git - 意外丢失了大量工作。我可以拿回来吗?

    我很困惑 我想我已经失去了几个小时的工作时间 我之前在 Git 中编辑了一个文件 我保存了它 但没有提交 我确实做了一些其他文件更改 并提交并推送了它们 然而 有一个文件被搞乱了 所以我单击了最后一次成功的提交 然后按了 回滚到此提交 令我
  • Spring Cloud Config - 不允许使用 git-upload-pack

    我有一个在 docker 环境中运行的 spring boot 应用程序 它连接到 Git 存储库以获取应用程序的配置 我的问题是 当尝试获取 properties 文件时 应用程序有时会出错 这很奇怪 因为如果我更改用户和密码 同一个应用
  • 为别名命令添加“git help”?

    我已经实现了一个 Git 命令并使用 git 别名将其连接到 Git 但是有没有办法连接 Git 帮助 我在 Windows 上运行 如果我发出git help mycmd我收到一个弹出窗口 告诉我 Git 找不到 git mycmnd h
  • 合并 BPM 图表的最佳实践

    我们在 Java 环境中使用 Alfresco 活动图 这些图是有版本的 我们确实使用 GIT 我们经常会遇到合并分支的合并冲突 解决这个问题确实很痛苦 因为我们必须比较文件的文本内容来检查差异 有时 重新应用更改比合并更轻松 是否有合并此
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 如何在源代码管理中存储 Visual Studio 的调试配置

    Visual Studio 的调试配置存储在 user文件是用户特定的并且传统上被源代码管理忽略 我对工作目录参数感兴趣 我需要它在程序员的机器上保持一致 并且它具有以下价值 outDir而不是默认的 ProjectDir 我怎样才能解决这
  • 在 python 中找不到 git 可执行文件

    我试图使用访问密钥克隆 git 存储库 但是当我尝试运行它时 它抛出一个异常 说找不到 git 可执行文件 但我已经安装了 git 并且 in it py 显示了正确的路径 C Program Files Git bin 我还安装了 git
  • 如何在现有裸存储库中创建引用日志信息

    您可能已经知道 默认情况下 git 不会为新的裸存储库启用引用日志更新 问题是 我有一个很长的历史存储库 但它是在我设置 logAllRefUpdates 标志之前创建的 现在我希望其他应用程序可以使用该信息 如何通过对现有存储库进行最少的
  • Git - 使用过滤器分支删除带有空变更集的提交

    如何使用 git filter branch 删除没有变更集的提交 我使用以下方法重写了我的 git 历史记录 git filter branch tree filter rm r f my folder f HEAD 效果很好 但现在我有
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1
  • 使用nodegit切换分支/标签

    我整个早上都在尝试打开现有的存储库并使用 nodegit 更改分支或标签 文档内容很丰富 但似乎已经过时了 关于我做错了什么有什么想法吗 var NodeGit require nodegit var open NodeGit Reposi
  • 设置 git 别名,但调用它会给出“找不到命令”

    我想在 git 中设置一个别名来计算存储库中的总行数 因此我进入 Git Bash 并输入以下内容 git config global alias linecount ls files z xargs 0 wc l 我输入命令后 没有出现错
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • TSQL 生成 5 个字符长度的字符串,所有数字 [0-9] 数据库中尚不存在

    最好的方法是什么 我需要生成一个 5 位长度的字符串 其中所有字符都是数字 但是 我需要能够执行此 x 次 用户变量 并将此随机字符串存储在数据库中 此外 我无法两次生成相同的字符串 旧琴弦将在 6 个月后被移除 伪代码 DECLARE i
  • django - 启动 dbshel​​l sqlite3 时选项太多

    我有 django 1 2 3 0 Final 我正在使用 Python 2 7 在我的设置中 我为 DATABASE ENGINE 填充了 sqlite3 我能够使用 sqlite3 在 djano manage py shell 级别
  • 为什么 Powershell 的 Tee-Object 会搞乱我的文件编码?

    周末我使用 Tee Object 生成我跟踪的日志文件的一些输出 我尝试 grep 输出文件 但无法返回任何结果 但我能够 grep 原始日志文件 Tee Object 似乎更改了文件的编码 https adamtheautomator c
  • weblogic中的类强制转换异常

    我有一个使用球衣罐子的Web应用程序 WAR文件 现在 当我尝试部署这个时 我收到类转换异常 某些引导servlet使用球衣 在分析中 我发现weblogic本身有共同的球衣罐子 模块 和我的网络应用程序有不同版本的球衣罐 现在 如果我删除
  • iPhone 4 有没有绝对确定的方法可以让 NSTimer 长期火起来

    我的 NSTimers 和后台选择器一直遇到问题 这让我抓狂 并且需要很长时间来尝试每一个调整 为了保持我的理智以及未来几代可可程序员的理智 我问这个问题 是否有绝对 100 确定的方法可以在稍后的时间点触发预定的长期计时器 无论它是否是从
  • CMake:为 #cmakedefine 变量设置不同的名称

    我知道你可以使用 CMakeconfigure file使 CMake 变量可用于您的程序 例如 我可以使用 define CMAKE BUILD TYPE 导致 define Release 但是 为了使我的代码更具可读性 我更愿意定义
  • 重定向到 https 但没有 .php

    现在我有一个https 我需要在 htaccess 中进行重定向 我可以找到这个 RewriteCond HTTPS off RewriteRule https HTTP HOST REQUEST URI L R 301 但我发现如果用户写
  • Google Script CacheService 在 sendMail 中为 inlineImages 缓存图像

    我想将图像存储在 Google Script 的缓存服务中 然后将此图像作为内联图像插入 HTML 邮件中 我已经尝试让它发挥作用 但到目前为止还没有成功 记录器中以下代码的错误是 无效参数 附件 如果我检查它显示 sendMail 中的
  • 如何动态新的匿名类?

    在 C 3 0 中 您可以使用以下语法创建匿名类 var o1 new Id 1 Name Foo 有没有办法动态创建这些匿名类到变量 Example var o1 new Id 1 Name Foo var o2 new SQ 2 Bir
  • 在一个查询 MYSQL 中插入和更新

    我有一个简单的 INSERT 查询 在单击按钮的事件上运行 这会获取变量并将它们插入到order table 我也想更新我的bands表将库存减少 1 直到达到 0 然后显示空或已售完 而不是变为负数 例如 6 要知道选择了什么频段 我可以
  • Android逐字符显示文字动画

    任何人都知道执行动画的任何有效方法 所要做的就是逐个字符地显示文本 喜欢 T Th Thi This This i This is 等等 Thanks 这可能不是最优雅的解决方案 但最简单的可能是一个快速子类TextView with a
  • XSL 在 CDATA 中取消转义 HTML

    我正在尝试转换 XML
  • WebDriver 模拟桌面浏览器中的触摸事件

    我正在尝试使用 Chrome 和 Firefox 浏览器在基于 Web 的应用程序中模拟一些触摸事件 例如交换 点击 我尝试用以下方法模拟触摸事件Actions Hammer js Yahoo lib YUI 但它们都不适合我 在桌面浏览器
  • Django:CSV模型导入[重复]

    这个问题在这里已经有答案了 我需要一种将数据简历导入数据库的方法 csv 在字段方面与我的模型之一匹配 在 Django 中 有没有推荐的方法 包来做这样的事情 我查看了此处的 django csvimport http pypi pyth
  • 使用 jQuery select2 设置多个值[重复]

    这个问题在这里已经有答案了 我使用 jQuery select2 选择多个列表项 但不幸的是 下面的代码必须将所有 3 个值加载到选择字段中 但是它只加载第一个项目 如何将所有 3 个项目加载到 select2 列表中
  • 防止一段代码在协程中同时执行

    我需要保护一段代码免于在协程 中同时执行 防止多线程环境中的并发执行很简单 只需使用std lock guard类模板 然而 我的协程是从单个线程调用的 因此该解决方案不适用 以下是我想要完成的 伪 代码 future
  • Phoenix 夹具 json 文件

    如何在我的 phoenix 项目中加载 JSON 夹具文件 当我尝试像 Application app dir my app priv 这样的东西时 它给了我一个编译路径 我不能在我的测试中使用它 还有其他方法可以从 test suppor
  • 当我关闭 Pygame 时屏幕冻结

    该代码加载了一个 pygame 屏幕窗口 但是当我单击 X 关闭它时 它变得没有响应 我在 64 位系统上运行 使用 32 位 python 和 32 位 pygame from livewires import games color g
  • 不带 GROUP BY 子句的 MySQL 聚合函数

    在 MySQL 中 我观察到尽管没有 GROUP BY 子句 但在 SELECT 列表中使用 AGGREGATE FUNCTION 的语句仍会被执行 如果我们这样做 其他 RDBMS 产品 例如 SQL Server 会抛出错误 例如 SE
  • 关于 git pull 的合并/变基步骤的困惑

    来自 Loeliger 2ed 的 Version Control with Git 关于 git pull 中的合并或变基步骤 在拉取操作的第二步中 Git 执行 合并 默认 或变基操作 关于 git pull 中的合并步骤 在此示例中