git merge做坏事-如何不自动合并 *anything*

omvjsjqw  于 2022-11-20  发布在  Git
关注(0)|答案(1)|浏览(328)

我 已经 搜索 并 尝试 了 各种 标志 来 执行 合并 , 但是 我 所 尝试 的 一切 都 导致 合并 代码 中 缺少 了 一 个 在 合并 代码 中 使用 的 类 。 具体 来说 , 我 在 我 的 特性 分支 中 的 一 个 文件 的 底部 有 一 个 python 异常 类 。 我 用 main 进行 了 合并 , 并且 有 5 个 文件 存在 冲突 。 当 我 进去 解决 冲突 时 ,异常 类 ( TypeUnitsMismatch ) 应该 在 文件 的 底部 ( 因为 它 在 特性 分支 中 ) 完全 丢失 了 。 甚至 没有 一 个 diff 提示 我 选择 是否 保留 传入 的/当前 的 更改 。 类 就 这样 消失 了 。
如何 执行 合并 并 让 它 显示 * 所有 * 差异 ( 即 自动 合并 * 无 * 并 要求 我 确认 所有 更改 ) ?
我 不 知道 是 什么 导致 了 这个 问题 , 但 我 想 有 可能 是 一 个 单独 的 分支 与 一 个 rebase 和 一 个 强制 推送 导致 了 这个 问题 ?
例如 , 下面 是 功能 分支 中 文件 的 底部 :

class UnknownComparison(Exception):
    pass

class TypeUnitsMismatch(Exception):
    def __init__(self, type):
        message = (
            f"Unsupported combination of field type {type} and units.  Only fields of type 'number' can have unit "
            "options."
        )
        super().__init__(message)
        self.type = type

中 的 每 一 个
这里 是 文件 的 底部 * 与 * 我 需要 解决 的 冲突 * 之前 * 我 解决 任何 事情 :

class UnknownComparison(Exception):
    pass

格式
当 我 尝试 将 main 合并 到 feature 分支 中 时 , 我 * 希望 * 看到 的 是 这样 的 内容 :

class UnknownComparison(Exception):
    pass

<<<<<<< HEAD
class TypeUnitsMismatch(Exception):
    def __init__(self, type):
        message = (
            f"Unsupported combination of field type {type} and units.  Only fields of type 'number' can have unit "
            "options."
        )
        super().__init__(message)
        self.type = type
=======
>>>>>>> main

格式
我 试 过 合并 两 个 方向 。 我 试 过 合并 --no-ff--no-commit 。 没有 任何 结果 。
我 还 尝试 了 一 个 rebase , 但 该 文件 中 的 第 二 个 或 第 三 个 冲突 是 无 意义 的/jibberish 与 什么 看 起来 像 嵌套 的 diff 注解 。
我 想 我 可以 把 分支 中 所有 被 修改 的 文件 复制 到 一 个 新 的 分支 中 , 这样 自动 合并 的 行为 就会 不同 , 但是 这样 我 会 丢失 所有 的 提交 注解 。
我 怎么 才能 确保 得到 正确 的 合并 。
注意 , 这个 分支 在 main 后面 有 58 个 提交 , 我们 有 一些 其他 的 工作 要 优先 处理 , 所以 我 把 这个 工作 放在 一边 一 段 时间 。

5cg8jx4n

5cg8jx4n1#

好吧,这个问题并不是很好,主要是因为我不记得发生了什么,我想这是导致这个问题的事件的大致梗概:
1.我在10月18日创建了一个名为units的分支
1.我在开发过程中的某个时候意外地提交并推送了对main的一些更改(因为我在分支之间来回切换,并且忘记了我在哪里)
1.我在units上的工作被其他更高优先级的工作打断了。几个星期过去了,我和其他人在其他分支上合并到main。(我们有多个并发分支合并到main,在一个点上有7个打开的PR,这促使一些分支在合并到main之前重新建立基础。)
1.我发现了意外的向main的推送,我没有扰乱历史,而是创建了一个向main的自定义提交,它“取消”了意外提交/推送的更改
1.我将那些意外提交/推送到main的操作合并到特性分支中,它们本来应该在这里进行,后来当我尝试合并units分支时,我意识到这将是一个混乱的过程,我只是认为我会在遇到它的时候跨过这座桥-然后继续我的其他更高优先级的工作
1.昨天,我把units分支上的工作捡回来并完成了。创建了一个PR,我注意到我与main有冲突需要解决。
1.今天我尝试了重定基/合并,就像我经常做的那样,已经忘记了是什么麻烦把我带到这里。
为了合并,我尝试了以下方法,但是没有一个解决了我的问题(我尝试了两个方向,但是这个例子来自units merging main):

git merge --no-ff main  -- The TypeUnitsMismatch class was still missing from the diff
git merge --no-commit main  -- The TypeUnitsMismatch class was still missing from the diff
git merge -s ours main  -- TypeUnitsMismatch was present, but other's novel code in main was removed

正如我老板建议的那样,我可以将units分支上的所有提交都压缩到一个“新”提交中。但是git merge-base HEAD main没有产生正确的共同祖先,git日志似乎有不同哈希值的重复条目-可能是由于重定基或其他工作的奇怪合并。幸运的是,我在提交消息中输入了很好的注解,然后我能够返回并发现最后12个提交包含了units分支上的所有新颖代码。(同主)由于路径复杂,但它并没有产生任何负面的副作用。
我把最后12个提交压缩成一个提交,并保存了提交消息:

git reset --soft HEAD~12
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

然后当我做了一个git merge main,我在一个CSS文件中只有一个小的/简单的冲突,涉及4行代码。然后我做了一个git diff main,所有以前丢失的代码都作为新代码出现,所有在main中的新代码都没有显示为已经被删除。所有的测试都在运行,所以我乐观地认为一切都很好。

TL;DR

最后,虽然我能够使用挤压策略解决我在这个案例中的问题(尽管丢失了与每个单独提交相关的代码更改),但我对最初的问题没有答案:

[如果我的历史记录混乱,]“我如何执行合并并让它[以简单的方式]显示所有差异(即,不自动合并任何内容并要求我确认所有更改)?"
也就是说,忽略共同的祖先,并在2个HEAD之间执行普通的diff,作为合并选项。

如果有一种方法可以做到这一点,并且您有2个工作分支(例如,我当前的mainunits分支),那么这种能力(以平面方式手动解决这2个分支头部之间的每个差异,以创建新的提交)将非常有用。

相关问题