如何合并两个没有共同祖先的分支?

2024-01-23

我已经开始在项目中使用 Git,其中前两次提交只是一些初始设置(.gitignore 和 .gitattributes),第三次提交M2添加SVN trunk的内容:

I1 -- I2 -- M2 -- N -- .. -- Z

我已将 SVN 历史记录导入名为svn, where M1是SVN主干(内容与M2,.gitignore 和 .gitattributes 除外):

A -- B -- ... -- K -- L -- M1

Q:合并两个分支的最佳方法是什么?

我可以合并M1 and M2 into M3,然后rebase,但我不知道如何删除I1 and I2提交,如果我可以安全地删除M3提交(我发现了一些保留合并提交的建议,但在这种情况下M3不再需要了)。

A -- B -- ... -- K -- L -- M1
                             \
                              M3 -- N' -- .. -- Z'
                             /
               I1 -- I2 -- M2 -- N -- .. -- Z

另一种方法是挑选N .. Z致力于svn手动分支,但我想避免这种方法。

最优雅的解决方案是对由N .. Z提交于之上svn分支,但我还没有找到没有共同祖先的两个分支所需的语法。


免责声明: 我自己只在玩具库中使用过一次“移植点”。但这是一个您可能没有听说过的晦涩功能,但它_可能_对您的情况有帮助。

您可以使用“移植点”来伪造祖先信息。参见,例如,.git/info/grafts 是做什么用的? https://stackoverflow.com/questions/161928/what-are-git-info-grafts-for或立即继续有关移植点的 git wiki 条目 http://git.or.cz/gitwiki/GraftPoint.

本质上,您将创建一个文件.git/info/grafts这会欺骗 git 认为提交M1是 commit 的祖先M2:

$ cat .git/info/grafts
<your M2 commit hash> <your M1 commit hash>

随后,它看起来像M2是一个刚刚合并的空提交I2 and M1变成一棵普通的树。

主要缺点:嫁接点未犯;因此,它不会被检出,而是需要手动添加到存储库的每个本地工作副本中。



Update: use git replace --graft https://git-scm.com/docs/git-replace反而。

如上所述,移植点已被取代。跑步

git replace --graft <your M2 commit hash> <your M1 commit hash>

创建移植物。这存储在.git/refs/replace/。尽管 git 默认情况下不会获取或推送这些引用,但可以使用以下方法在存储库之间同步它们:

git push origin 'refs/replace/*'
git fetch origin 'refs/replace/*:refs/replace/*'

(StackOverflow:如何在 git 中推送“引用/替换”而不推送任何其他引用? https://stackoverflow.com/a/20072413/1172714)

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

如何合并两个没有共同祖先的分支? 的相关文章

  • 有关多个远程存储库的 Git 状态

    我有一个脚本 如果我忘记在 40 多个存储库中提交或推送一些代码 它会通过电子邮件向我发送提醒 在我的两个项目中 我遵循了这些帖子中的答案 其中我设置了 git push 来推送到多个存储库 从多个远程位置拉 推 https stackov
  • Git守护进程克隆错误

    All 我正在按照以下指示进行操作this SO https stackoverflow com a 377293 724357答案 快速提供回购 当我跑步时git clone git ipAddr git project我得到这个输出 r
  • 使用 TortoiseGit 创建 git 克隆时出现 SSL 证书问题

    我想在 TortoiseGit 的帮助下克隆 git 存储库 但出现错误 错误 SSL 证书有问题 请验证 CA 证书是否正常 细节 错误 14090086 SSL 例程 SSL3 GET SERVER CERTIFICATE 访问时证书验
  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • 在 GitHub 上执行拉取请求时避免不需要的合并提交和其他提交

    我在 Github 上分叉了一个项目 令远程上游为upstream我的远程存储库是origin 我当地的master分支设置为跟踪远程master分支 然后我在本地添加了一些东西master 时不时与上游汇合 直到今天我想发出pull re
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • 如何查看 github 的 SSH 密钥?

    我最近收到一封来自 Github 的电子邮件 要求我检查我的 SSH 密钥 请检查您的钥匙并确保您 认出他们 如果您有任何疑问 请拒绝钥匙并 上传新密钥 如何在 ubuntu 11 10 上使用 git 检查我的密钥 您可以按照 GitHu
  • gitlab 上的权限被拒绝(公钥)

    我的问题是我无法从 GitLab 推送或获取 不过 我可以克隆 通过 HTTP 或通过 SSH 当我尝试推送时出现此错误 权限被拒绝 公钥 致命 无法从远程存储库读取 从我看过的所有线程中 这是我所做的 在我的计算机上设置 SSH 密钥并将
  • git stash 删除最旧的存储(比如最旧的 5 个存储)

    如何在一个语句中删除最旧的存储 例如最旧的 5 个存储 而不是执行以下操作 git stash drop stash 3 git stash drop stash 4 git stash drop stash 5 git stash dro
  • 如何解决 VS Code 中变基拉取的合并冲突?

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

    我正在寻找一个可以合并 2 个大型 CSS 文件的工具 到目前为止我尝试过的所有方法 例如CSSMerge 都没有成功 其中一些只是随机删除属性 其他人则因 webkit 和 moz 等非标准属性而窒息 并给我错误 我还需要保留每条规则大小
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 清理远程 Git 分支

    我已经将 SVN 存储库移至 Git 可能由于多次克隆 我现在只剩下一堆看起来像这样的分支 BranchA origin BranchA remotes BranchA remotes origin BranchA remotes orig
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s

随机推荐