Git 合并如何处理同时提交?

2024-05-04

给定一个具有两个分支的存储库,每个分支都有独立的提交:

Branch  Commits
------  -----------

final:        e-g-i
             /     \
master: a-b-c-d-f-h-?

上图中的字母很重要:即“master”和“final”同时正在开发中,并且必须保留两个分支中的提交。

将“master”合并到“final”然后再合并是否更好(更安全)that回到“大师”?或者从“final”直接合并到“master”会保留之前的提交吗?

我知道可能会出现合并冲突。我更担心的是,在将“final”合并到“master”中后,我们不会丢失任何提交给“master”的代码。


将“master”合并到“final”,然后将其合并回“master”是否更好(更安全)?或者从“final”直接合并到“master”会保留之前的提交吗?

后者:从“final”直接合并到“master”,保留之前的提交。

git 与 SVN 等其他版本控制系统不同。对于不熟悉的人来说,SVN 将分支视为“存储桶” - 分支/存储桶是固定的(稳定的),并且您必须小心在存储桶之间移动提交。在 SVN 中,在将“最终”分支“重新集成”(伪合并)回“主”之前,您必须将所有最近的“主”提交合并(复制)到“最终”中。 “重新整合”有效地将“final”的尖端复制到“master”的尖端,从而有效地用“final”尖端的精确副本替换“master”。您可能会丢失“master”中未首先合并(复制)到“final”的任何提交。

就像我说的,git 是不同的。在 git 中,我喜欢将存储库树(提交)视为稳定的,而不是移动的“分支”——将分支视为悬挂在提交上的小标签/装饰。

我将以稍微不同的方式绘制你的树 - 事实上,我将在创建提交“i”之前绘制它:

              final
                |
            e - g
          /
a - b - c 
          \
            d - f - h
                    |
                  master

现在让我们提交“i”:

                  final
                    |
            e - g - i
          /
a - b - c 
          \
            d - f - h
                    |
                  master

只有两件事发生了变化。 (1)暂时忽略分支“decorations”,我们看到新的提交“i”是从其父提交“g”创建的,并且(2)最终的“装饰”从提交“g”移动到“i”。

让我们将 Final 合并到 master - 也就是说,让我们更新 master,使其包含来自 Final 的更改:

                  final
                    |
            e - g - i
          /           \
a - b - c              j
          \           /|
            d - f - h  |
                       |
                     master

现在‘主’分店装修动了。 “最终”的分支装饰保持原样。 “j”提交是由 2 个父级创建的合并提交:“h”和“i”。

但是,如果我们将 master 合并到 Final 中,也就是说,更新 Final 以使其包含 master 中的更改:

                     final
                       |
            e - g - i  |
          /           \|
a - b - c              j
          \           /
            d - f - h
                    |
                  master

现在“最终”移动了,“主人”留在原地。请注意,合并是真正的合并 - 两个分支的更改都在提交“j”中。无论哪个分支合并到哪个分支,“j”都是相同的 - 唯一的区别是哪个分支“装饰”被移动。 (那些分支“装饰品”很容易移动。)

为了完整起见,让我们将另一个分支合并回第一个分支(谁先合并到谁并不重要 - 只要我们这次在另一个方向合并)。请注意,只有装饰移动 - 不需要新的提交(用 git 术语来说,它是“快进”),因为“j”已经包含来自两个分支的两组更改:

                     final
                       |
            e - g - i  |
          /           \|
a - b - c              j
          \           /|
            d - f - h  |
                       |
                     master

事实上,让我们看看几天后的树(我删除了“最终”分支 - 我已经完成了):

            e - g - i
          /           \
a - b - c              j - k - l - m
          \           /            |
            d - f - h              |
                                   |
                                 master

好吧,你能从树上看出哪个分支最初是“主分支”,哪个分支最初是“最终分支”:e-g-i 或 d-f-h?有关系吗?

在 git 中,合并是真正的合并。没有“存储桶”,您不必像 SVN 那样在“存储桶”/分支之间移动提交。只有您正在进化的“树”,树枝(“装饰品”)正在为您在其中的位置添加书签。

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

Git 合并如何处理同时提交? 的相关文章

  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • RuntimeError:模型类 django_messages.models.Message 未声明显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中

    我正在尝试使用https github com arneb django messages https github com arneb django messages打包我的消息传递内容并尝试了以下操作 pip install git h
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 强制 Composer 下载 git repo 而不是 zip

    我对作曲家有一些问题 require php gt 5 3 2 kriswallsmith buzz 0 7 Repo https github com kriswallsmith Buzz tree v0 7 https github c
  • gitlab 请求将分支 A 合并到开发中(落后 3 次提交)我应该担心吗?

    在 gitlab 中创建合并请求时 我经常收到一条消息 请求将分支 A 合并到开发中 x 提交落后 gitlab想告诉我什么 我应该担心还是需要修复某些东西 什么 一段时间后合并请求在项目中打开时 由于其他人合并了自己的更改 您尝试合并到的
  • 如何解决 VS Code 中变基拉取的合并冲突?

    当我做一个git pull rebase 并且我的提交中存在合并冲突 我得到冲突差异视图 解决所有冲突并暂存文件 然后呢 我可以打开终端并运行git rebase continue但是 VS Code 中不应该有一个按钮来完成变基吗 只需使
  • 合并 2 个大型 CSS 文件的有效方法

    我正在寻找一个可以合并 2 个大型 CSS 文件的工具 到目前为止我尝试过的所有方法 例如CSSMerge 都没有成功 其中一些只是随机删除属性 其他人则因 webkit 和 moz 等非标准属性而窒息 并给我错误 我还需要保留每条规则大小
  • Git:压缩 master 上提交的最简单方法[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 git 将最后 X 次提交压缩在一起 https stackoverflow com questions 5189560 how can i squash my last x commits
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • git Blame:合并后正确的作者

    GIT 合并引入了新的提交 这会导致 git Blame 问题 合并的行似乎是由进行合并的开发人员提交的 我可以理解这种情况冲突的变化 因为他解决了冲突 但是有没有办法让非冲突线路不发生这种情况呢 一些 git Blame 的选择 如果没有
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • Git post-receive - 如何检查推送的分支是否与主分支合并

    在我们的团队中 我们通常将所有任务推送到单独的分支中 然后发布经理审查这些分支并将它们合并到 主 分支中 有时团队成员忘记将他们的分支与主分支合并 在推送之前 所以我想做的是 在用户推送后输出一条消息 请与主分支合并 我想我需要检查一些内容
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 将“复制到剪贴板”添加到 GitHub markdown 的简单方法?

    具体来说 我有一些用于安装的代码块 我希望用户能够快速将其复制并粘贴到终端中 我想要一个用于代码块 复制到剪贴板 的按钮 由于 git 克隆 URL 有一个 复制到剪贴板 按钮 我想知道我是否可以利用该按钮 或者如果不能 是否可以将一些相对
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 如何撤消删除 github wiki 页面的操作?

    我删除了 github 存储库 wiki 上的一个页面 单击该文件的链接现在会将我带到一个新的编辑屏幕 我认为这可能是在我的存储库分支中 但是在 chrome 上以隐身模式点击链接会出现错误 表明我无权编辑此文件 大概是因为我正在尝试创建它
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何让 Gitlab 运行程序在成功构建时将代码合并到分支中

    嗯 标题几乎是不言自明的 总之 如果构建成功 我希望将一个分支 即开发 合并到另一个分支 即生产 我尝试了 jakub kania 解决方案 但我总是得到id rsa invalid format 我认为 gitlab 秘密变量以某种方式被
  • Jenkins GIT 包含从未构建过的区域

    我正在尝试使用包含区域在 Jenkins 中构建我的工作 但每当选中此选项时 民意调查结果总是说未检测到任何更改 我尝试了许多不同的路径 以及使用工作区进行 不进行强制轮询 结果是轮询从未检测到任何更改 但一旦我删除这些选项 它们就会在下一

随机推荐