如何在git中合并提交之前找到两个分支的共同祖先?

2023-12-22

背景

我正在尝试编写一个脚本来简化使用 git 的向后移植过程。

修复当前版本中的错误的一般过程如下:

  1. 分支来自master到错误修复分支,例如bugfix/abc
  2. 进行所有提交以修复错误bugfix/abc
  3. Merge bugfix/abc to master(没有快进合并)

现在,当我想将修复向后移植到版本 1 时(例如分支v1) I do:

  1. 从创建一个新分支bugfix/abc, e.g. bugfix/def
  2. 然后手动查找提交master那是在合并提交之前,例如f4d399238f
  3. 现在我使用变基:$ git rebase --onto v1 f4d399238f bugfix/def

这非常有效(在弄清楚我必须在上游合并之前使用提交之后)。

Question

如何找到两个分支的共同祖先before合并提交? (用于向后移植过程的步骤 2)。

Tried

  1. git merge-base bugfix/abc master
    • 由于合并已经完成,这只会返回头部的提交bugfix/abc
  2. Combining the result of #1 to get the child of this commit using git log
    • 我尝试以下如何在 git 中找到下一个提交? https://stackoverflow.com/questions/2263674/how-do-i-find-the-next-commit-in-git使用各种组合--reverse, --ancestry-path and --children但我从来没有得到我所期望的。

Update

这个问题和找到两个分支的共同祖先 https://stackoverflow.com/questions/1549146/find-common-ancestor-of-two-branches是两个分支已经合并了。正如我提到的最佳承诺作为合并的分支的头返回。我需要共同的祖先在合并提交之前.

假设 bug 被修复并合并到 master 后的分支如下所示:

A---B v1
     \
      C---D---F---H master
           \     /
            E---G bugfix/abc

Running $ git merge-base master bugfix/abc将返回G但我需要得到D(甚至F会做的目的是使用rebase --onto).

一旦我得到D然后我会运行:

$ git branch bugfix/def bugfix/abc
$ git rebase --onto v1 D bugfix/def
$ git checkout v1
$ git merge bugfix/def

最终得到期望的结果:

      E'---G' bugfix/def
     /      \
A---B--------I v1
     \
      C---D---F---H master
           \     /
            E---G bugfix/abc

如何在合并提交之前找到两个分支的共同祖先? (用于向后移植过程的步骤 2)。

有几个选项可供使用:

git 合并基础

git merge-base http://git-scm.com/docs/git-merge-base是您正在寻找的命令

git 合并基础找到两个提交之间的最佳共同祖先,以在三向合并中使用。一个共同的祖先是better如果后者是前者的祖先,则比另一个共同祖先更重要。没有更好的共同祖先的共同祖先是最好的共同祖先,即合并基地。请注意,一对提交可以有多个合并基础。

手动从日志中查找

git log --decorate --graph --oneline --all

这将在日志中显示分叉点,以便您可以跟踪分支的提交 ID。

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

如何在git中合并提交之前找到两个分支的共同祖先? 的相关文章

  • 从 git 中提取特定的提交/文件

    我在 git 存储库中进行了两次提交 并将它们推送到我的 git 服务器 两个提交是 在第一次提交中文件 A 被提交 在第二次提交中 文件 B 被提交 现在在另一台开发服务器上 我只想从 git 服务器中提取第一个提交或文件 A 这个怎么做
  • 如何使用git查看指定版本的Webkit?

    谢谢 从链接http trac webkit org wiki UsingGitWithWebKit http trac webkit org wiki UsingGitWithWebKit 使用 git 检查 Webkit 有以下 3 个
  • git receive-pack 以 0000 停止

    我对 git 很陌生 目前正在尝试在 opensuse 上使用 gitolite 和 trac 设置环境 我设法使用来自的脚本迁移旧的 svn 存储库http john albin net git git svn migrate http
  • git:键不包含节

    我使用的是 Git 版本 1 8 4 2 When I press tab to auto complete any command it prints the error below and it also completes the c
  • Git 子模块导入语句失败

    我将一个存储库作为子模块添加到我的项目中 但是当我编译项目时 该存储库中的导入语句无法解析 为了添加子模块 我使用了命令 git submodule add
  • 如何将Github中的develop分支设置为默认分支而不是master?

    我知道这可以在存储库的管理页面上完成 可以在那里设置另一个默认分支 这就是这个问题的答案 但我发现 也许是一个错误 以下内容 如果你的master分支和develop分支完全相同 那么git克隆将不会克隆默认的 develop 分支 但仍然
  • 如何在 git 中使用我的更改进行合并?

    在 git 中合并时如何强制 我的更改 有人将所有 bin 目录放入 git 中 现在我遇到了可怕的合并冲突 现在它说 当你解决了这个问题后 运行 git rebase 继续 如果你 宁愿跳过这个补丁 而是运行 git rebase ski
  • git:复制一个版本来玩一下

    在开发应用程序时 我希望在某个时候拥有一份单独的工作副本 以便尝试进行一些更改 这些更改并不意味着要进行 只是玩玩 尝试各种可能性 是什么 best 如何做到这一点 我发现了以下可能性 但想得到比我更有 git 经验的人的建议 我可以用gi
  • 如何在 GitHub 中创建嵌套存储库?

    我可以通过创建一个存储库https github com https github com say repo 并有 https github com username repo git 如何创建另一个存储库 例如sub repo 置于rep
  • git Push heroku master 因“HTTP 400curl 22 请求的 URL 返回错误”而失败

    我正在尝试推送仅显示 你好 世界 的 Rails 应用程序 然后我遇到了如下错误 我想知道如何解决这个问题 git推送heroku大师枚举对象 88 完成 计数对象 100 88 88 完成 增量压缩最多使用 4 个线程 压缩对象 100
  • 如何在不下载文件对象的情况下进行 git 克隆

    是否可以下载所有提交但不能下载文件本身 我想运行 bisect 但从构建服务器下载版本而不是自己编译 当你跑步时git bisect你可以提供 no checkout如果您不想为每次迭代签出新的工作树 请作为参数 同样适用于git clon
  • Visual Studio 2022 Git 推送标签

    有谁知道如何在 Visual Studio 2022 中推送标签 自从我切换到多存储库模式后 我在任何地方都找不到它 解决方法是通过命令行推送标签 事实上 标签有点隐藏 你应该去团队资源管理器 gt Git 存储库 gt 在你的分支下 gt
  • git 显示更改了 0 次插入(+)、0 次删除(-)的文件

    很多时候 当我运行 git diff shortstat 命令时 它会输出以下内容 17 files changed 0 insertions 0 deletions 即使没有插入或删除 文件怎么可能发生变化 如果项目中某些文件的文件权限已
  • 如何从不同分支上的本地提交复制文件?

    我提交了一个文件master分支但未推送remote 现在我正在努力feature分支 我希望将该文件复制到feature分支来自master分支 我怎样才能做到这一点 您可以从另一个分支检出特定文件 git checkout master
  • 如果使用 Maven,是否应该忽略 VCS 中 Eclipse 特定的文件?

    我知道为什么不将 Eclipse IDE 特定的文件提交到像 Git 我实际上正在使用的 这样的 VCS 中 这就是我使用 Maven 并让它为您生成这些文件的原因之一not将它们置于版本控制之下 但我想知道 是否应该在 gitignore
  • .gitignore:如何忽略嵌套目录?

    我有以下目录结构 test a test b c test a b Ouput test c d e Output test f Output 我想忽略 test 下的所有 Output 目录 我试过test Output 但没有成功 我究
  • .gitattributes 没有什么区别,在使用 git difftool 时尝试跳过文件

    我已经阅读了 Git Pro 网站 并且在 StackOverflow 上阅读了多个答案 但遗憾的是我根本无法让 gitattributes 为我工作 每当我使用git difftool 它将尝试显示二进制文件之间的差异 例如图像文件 PN
  • GitHub 的 Subversion 版本? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • git push 被拒绝,合并冲突,git pull --rebase

    我正在尝试推动我的提交 但不能 因为还有另一个提交 HEAD 竞赛中的同一级别 我知道我需要将这两个提交合并在一起 但不确定如何去做 我已经尝试过了git pull rebase My GIT CLI https i stack imgur
  • 如何摆脱指向origin/master的远程origin/HEAD?

    最近 我在两个不同的复制服务器上更改了我的原始遥控器 现在我在服务器上遇到这种情况 一切正常 git branch a master remotes origin master 在另一台服务器上我有这个 git branch a maste

随机推荐