使用 git 合并两个截然不同的分支?

2024-05-23

我有我的master分支和我的verydifferentbranch它们有相同的祖先......大约 300 次提交前。现在verydifferentbranch功能完整我想把它放在master下面branch。进行变基会导致每个补丁都有很多合并冲突,以至于要解决所有冲突本身就是一个大项目。

我不知道该怎么办,除了用力推他的头verydifferentbranch into master分支。这样做我会失去我所有的历史,而这不是我真正想做的事情。

我还有哪些其他选择?


听起来你的历史是这样的:

...---o---A---o---...---o---o---B   master
           \
            o---o---...---o---C     verydifferentbranch

你说你担心强推会丢失历史verydifferentbranch to master。这样的操作实际上会丢弃之后的所有内容A直至B.

您可以通过合并历史记录来保留历史记录,或者只是在废弃的分支尖端放置一个标签并使其不合并。

使用合并

合并将允许您保留历史记录的双方:

...---o---A---o---...---o---o---B
           \                     \
            o---o---...---o---C---M  master

您执行的合并类型将决定为提交 M 创建的内容。正常合并(使用recursive合并策略)听起来会在您的情况下产生大量冲突。如果您确实需要合并来自A..B提交后,除了解决合并或变基带来的冲突之外,别无他法。(如果您可以更频繁地合并或变基以处理出现的冲突,将来您可能会遇到更少的问题。)但是,如果您只是想M具有相同的内容C(即您想忽略由A..B提交),那么你可以使用ours合并策略。

git 合并(1) http://www.kernel.org/pub/software/scm/git/docs/git-merge.html描述了ours合并策略:

这可以解析任意数量的头,但合并的结果树始终是当前分支头的树,从而有效地忽略来自所有其他分支的所有更改。它旨在用于取代侧分支的旧开发历史。请注意,这与递归合并策略的 -Xours 选项不同。

您可以使用以下消息生成 MMerge commit 'abandoned/foo-features'像这样:

git tag -m 'describe reason for abandonment here...' \
    abandoned/foo-features master                   # tag abandoned branch tip
git checkout verydifferentbranch                    # checkout dominant branch
git branch -M verydifferentbranch master            # replace master
git merge -s ours abandoned/foo-features            # merge only other's history
git tag -d abandoned/foo-features                   # optional: delete the tag
git push wherever master tag abandoned/foo-features # publish them

这些命令的变化将为您提供略有不同的自动提交消息M(你可以随时提供自己的git merge -m或修改为git commit --amend然后)。

要点是由此产生的master将有两条历史记录,但与原始版本相比没有任何变化master侧面(这些更改仍然在历史记录中,它们只是没有在提交引用的树中表示M).

让它悬挂起来

如果“重写”可以接受master(即没有基于任何提交的其他工作A..B,或者所涉及的用户不介意这样做所需要的工作从重写中恢复 http://git-scm.com/docs/git-rebase#_recovering_from_upstream_rebase),那么你可以在当前的提示处留下一个标签master并替换master with verydifferentbranch.

...---o---A---o---...---o---o---B   (tag: abandoned/foo-features)
           \
            o---o---...---o---C      master

像这样安排:

git tag -m 'describe reason for abandonment here...' \
    abandoned/foo-features master                    # tag abandoned branch tip
git branch -M verydifferentbranch master             # replace master
git push wherever +master tag abandoned/foo-features # publish them
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 git 合并两个截然不同的分支? 的相关文章

  • 执行“挤压和合并”后可能出现问题?

    I used Squash and Merge用于合并dev分支到main因为我不想要来自的一些提交消息dev出现在的分支main但现在我发现main比 dev 提前 1 次提交 并且该图显示 两者之间没有联系dev and main 这是
  • 无法将本地更改推送到远程位桶

    我在本地存储库中添加了一个新的自述文件 当我推送到开发分支时 出现此错误 分支 refs heads develop 只能通过拉取请求进行修改 与项目管理员检查您的分支权限配置 到 ssh bitbucket companyname com
  • 如何让别名在 .gitconfig 中工作?

    Github http github com guides git cheat sheet对于全局 git 配置有以下建议 gitconfig alias Is this only a comment in gitconfig gb git
  • SmartGIT 不要求 ssh 密钥

    切换到新计算机后 我必须再次安装 Windows 版 SmartGIT 现在尝试克隆我的 fedorahosted org repository 密钥存储在 C User myusername ssh SmartGIT 附带了全新安装 并且
  • 如何从 TFS 获取类似 git 的统计信息

    我已经与 TFS 合作几个月了 希望获得一些基本统计数据并将其提供给我们的团队 在 git 中 我可以检索有关 按作者提交 和 按日期提交 等的统计信息 我想显示来自 TFS 或来自 TeamCity 的类似统计数据 这可能吗 我发现研究
  • 使用两个帐户推送到 Git

    我跟着这个tuotrial http code tutsplus com tutorials how to work with github and multiple accounts net 22574关于如何在同一台计算机上拥有两个单独
  • `git add --patch` 和 `--word-diff`

    git add patch提供了一个很好的界面 用于检查未暂存的更改 然后仅暂存下一次提交中需要的更改 很好 除了一件事 没有明显的方法来选择哪个diff视图来使用 特别是 我希望能够配置git add patch以同样的方式向我呈现差异g
  • Github 版本如何生成存档文件名?

    我刚刚在 github 上为我的 NFQL 软件创建了版本 这是发布页面 https github com vbajpai nfql releases https github com vbajpai nfql releases 对于最新版
  • 无法将 android“gen”文件夹提交到 Git

    我在 eclipse 中使用 EGit 为我正在开发的 Android 项目提供 Git 支持 问题是 将我的项目提交到本地存储库后 我意识到 gen 文件夹没有被提交 因此 当我从 Git 存储库获取最新源代码后尝试在另一台计算机上打开该
  • “git rm --cached”、“git Restore --staged”和“git reset”之间有什么区别

    我遇到了以下三种方法来取消暂存由命令 git add 暂存的文件 git rm cached
  • git 克隆错误:致命:git upload-pack:由于远程端可能的存储库损坏而中止

    我对 git 存储库具有读 写访问权限 但是当我尝试 git clone 时 出现以下错误 x ubuntu temp git clone email protected cdn cgi l email protection Corp ap
  • git for-each-ref - 按年龄过滤结果

    我正在使用以下命令here https stackoverflow com a 39251131 5812876 git for each ref format color cyan authordate format m d Y I M
  • Git守护进程克隆错误

    All 我正在按照以下指示进行操作this SO https stackoverflow com a 377293 724357答案 快速提供回购 当我跑步时git clone git ipAddr git project我得到这个输出 r
  • 为什么在 Eclipse 中对 Egit 管理的项目禁用合并工具?

    根据Egit 用户指南 http wiki eclipse org EGit User Guide Using Merge Tool 要使用合并工具 应右键单击存在合并冲突的资源 然后选择Team gt 合并工具 但是 当我执行此操作时 合
  • 如何在本地快速拉取拉取请求

    在合并拉取请求之前 我想在本地快速拉取请求并运行测试并测试一些内容 我还不想点击 gihub 合并拉取请求 我以为滑轮会有帮助http ejohn org blog pulley http ejohn org blog pulley 但我收
  • Git 在推送代码时返回错误 403 [重复]

    这个问题在这里已经有答案了 一切都工作正常 直到我创建了一个新的 GitHub 帐户 当我尝试使用新帐户第一次将代码推送到 github 服务器时 出现以下错误 remote Permission to NEW USER NEW REPO
  • Git 中的合并冲突是由什么构成的?

    git 如何确定特定合并存在冲突以及冲突是什么 我的猜测是这样的 如果正在合并的两个提交有一个共同的父提交 并且如果它们都更改了父提交的 X 行 那就是冲突 让我的理解变得复杂的是 更改 X 行 可能意味着用几行新行替换它 但这仍然显示为一
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 当出现错误时如何删除远程分支?

    我尝试过以下命令 但失败了 git push origin next remote error denying ref deletion for refs heads next To blah git remote rejected nex

随机推荐