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 合并如何处理同时提交? 的相关文章

  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • 如何解决 VSTS 中拉取请求中的合并冲突?

    我已经创建了拉取请求 我进入了这个 批准 按钮不执行任何操作 并且 完成 被禁用 如何解决拉取请求中的冲突 Update 微软刚刚添加了基于浏览器的合并 这可能会让你摆脱小冲突的困境 并提供自 Sprint 150 起改进了不同场景的可视化
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • 获取 GitHub 问题的管道价值?

    我使用 ZenHub 来管理 GitHub 上的问题 当我查看问题的详细信息时 我可以在 GitHub 中看到属性 pipeline 这正是保存问题的列 Now I want to get the pipeline information
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • `git ls-files -s` 输出中不同字段的含义是什么?

    在 Git 中 命令返回的典型结果行git ls files s好像 100755 be2c2e9b0966253096472d4b482c458bc892e493 0 gitignore 这些字段是什么意思 不用再犹豫了git ls fi
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • 致命:.git/info/refs 无效:这是一个 git 存储库吗?

    我有一个托管在 Assembla 上的 Git 存储库 我正在尝试执行以下操作 git push u origin master 我一遍又一遍地收到以下错误 fatal https url repo name git info refs n
  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • Jenkins 和 Github 不使用 SSH 密钥

    我已将 Jenkins 设置为从 Github 上的私有存储库中提取特定作业 尽管我已经生成了私钥 公钥并将其作为部署密钥添加到 github 但 Jenkins 似乎并未使用 SSH 密钥 当我从 Jenkins 用户进行 git clo
  • Jenkins 可以检测到任何 svn 用户每次提交代码吗?

    Jenkins 可以检测到任何 svn 用户每次提交代码吗 我想知道每次 Jenkins 提交 svn user 时 有什么方法或 jenkins 插件吗 现在我用svn updateJenkins 中的 cmd 来更新 svn 您可以按照
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • 如何在 macOS 上将 Git 升级到最新版本?

    我刚刚购买了一台装有 OS X Lion 的新 Mac 我在终端中检查了默认安装的 git 版本 我得到了答案 git version gt git version 1 7 5 4 我想将 git 升级到最新版本 1 7 8 3 因此我下载
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • GIT:以下未跟踪的工作树文件将被签出覆盖

    我有两个分支 一个称为 master 另一个称为 dev 我目前位于 master 分支 我想转到 dev 分支将文件移动到开发服务器 但是当我执行 git checkout dev 我收到消息 以下未跟踪的工作树文件将被覆盖 查看 pag
  • 当 .gitattributes 中的 EOL 设置为 CRLF 时,Git diff 认为行结尾为 LF

    当我恢复对带有 Windows 行结尾的文件的更改并且 gitattributes 将 EOL 定义为 CRLF 时 git 认为行结尾已更改为 LR 即使十六进制编辑器显示 CRLF 仅当 gitattributes 定义 EOL 字符时
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • github - 启用分支锁

    作为 GitHub 管理员 我想为所有用户锁定 GitHub 中的特定分支 例如如果我不希望任何人推送到主 生产或项目分支 我该怎么做 有没有办法直接锁定 GitHub 服务器上的分支 而不是使用任何客户端挂钩 是否有任何第三方工具 API

随机推荐