让git为分支之间的差异引发合并冲突

让git为分支之间的差异引发合并冲突,git,github,merge,Git,Github,Merge,我有一个github分支,它有大量不在主分支上的更改。当我尝试将变更分支合并到主分支中时,git会自动合并大量内容,并在添加内容直接集成到现有html或javascript的实例中引发冲突 我希望git为两个分支之间存在差异的所有实例引发合并冲突,这样我就可以检查并批准每个添加 我尝试了“我们的”策略,但这只是一个强制合并,将所有传入的更改与我所知道的保持一致 在合并两个分支时,是否有一种方法可以触发两个分支之间所有差异的合并冲突?或者一个类似的函数,它将以一种谨慎的方式促进这些分支的组合?我知

我有一个github分支,它有大量不在主分支上的更改。当我尝试将变更分支合并到主分支中时,git会自动合并大量内容,并在添加内容直接集成到现有html或javascript的实例中引发冲突

我希望git为两个分支之间存在差异的所有实例引发合并冲突,这样我就可以检查并批准每个添加

我尝试了“我们的”策略,但这只是一个强制合并,将所有传入的更改与我所知道的保持一致

在合并两个分支时,是否有一种方法可以触发两个分支之间所有差异的合并冲突?或者一个类似的函数,它将以一种谨慎的方式促进这些分支的组合?我知道使用git diff,但我希望存在一些更像解决合并冲突时发生的事情

在合并两个分支时,是否有一种方法可以触发两个分支之间所有差异的合并冲突

不是。问题实际上在于
git读取树
(以及
git merge
使用的实现它的C代码)。阅读树只是说:

  • 索引槽1(合并基)中的提交具有哈希Hbase
  • 索引槽2中的提交(
    --ours
    )具有哈希小时数
  • 索引槽3
    (-theres
    )中的提交具有散列htheir

    • 如果三个散列都匹配,使用任意一个副本,我们就完成了
    • 如果Hbase=hthers,使用我们的复制时间,我们就完成了
    • 如果Hbase=Hours,使用他们的副本hthers,我们就完成了
    • 这三种方法都不同:进行低级合并
  • “完成”是指:丢弃暂存插槽1-3;将所选哈希ID写入插槽0

只有在低级合并声明了合并冲突时,才会发生合并冲突。您可以控制调用哪个程序(如果有)来执行低级合并,但无法控制前三个“if”测试

或者一个类似的函数,它将以一种谨慎的方式促进这些分支的组合

最接近的方法是运行
git merge--no commit
,然后对每个索引项使用
git ls files--stage
,将staging slot zero中的哈希ID与合并基树中的哈希ID进行比较。即:

  • 使用
    git merge base--all
    查找合并基提交散列ID。如果有两个或更多,停下来寻求帮助,因为现在问题很难解决。否则,将此散列ID保存为合并基散列ID。在任何情况下,您现在也可以获取其他两个散列ID(
    git rev parse HEAD
    获取我们的散列ID,而
    git rev parse merge argument
    获取它们的散列ID)

  • 创建一个临时索引,并使用
    git-read-tree
    填充合并基中的文件。(如果这使编码器更简单,您可以推迟这一步,这可能会实现。)

  • 像往常一样使用(不带临时索引)
    git merge
    ,但添加
    ——no commit
    。考虑检查退出状态,因为0意味着“GIT认为一切顺利”,非零意味着“出错”——包括合并冲突,但即使GIT认为事情出错,您也可能要继续进行。

  • 读取结果索引(使用git ls文件--stage)。
    git merge
    认为已成功合并的每个文件都位于暂存槽0中。
    git merge
    认为无法成功合并的每个文件在插槽1、2和/或3中都有一个或多个条目

  • 读取临时索引(使用
    gitls文件--stage
    并适当设置
    git\u index\u文件
    环境变量)。对于此索引中的所有文件,如果更新后的主索引中的对应文件位于插槽0处,但具有不同的哈希ID,则意味着Git从
    --ours
    --theres
    提交中获取该文件

  • 对于Git认为已成功合并但与合并基础不匹配的文件,请使用
    Git update index--index info
    将合并基础、我们的文件和他们的文件放入插槽1、2和3中,而Git认为合并失败的文件是单独的(或者更新它们,但更新将不起作用)。注意仅在部分(而不是全部)3次提交中的文件:它们的暂存槽应为零,以指示该文件在该版本中不存在

  • 这里重命名的文件也存在一些问题。如果Git认为它已成功地与所考虑的重命名合并,则该文件将以新名称位于插槽0中。合并基名称将消失,并且此新名称将不在合并基提交中。您可以注意到这一点,但请注意,如果在
    --ours
    --theres
    中添加了一个新文件,而不是在另一个提交中添加,则该文件也将位于插槽0中,而不在数据库中

    不过,以上六个步骤通常会产生您想要的结果:成功合并的文件将被视为“冲突”,合并工具将看到所有三个输入。您不会在文件的工作树副本中看到任何冲突标记,但您会知道哪些文件是哪些,因为
    git status
    会将它们称为未合并

    我想要的是[…通过并批准每一项添加

    Git的automerge是为了省去这一点而构建的,但是如果您不想使用它,您可以关闭它并通过另一种方法应用个别差异

    git merge --no-commit -s ours thatbranch
    git checkout -p thatbranch -- .
    

    这将提示您当前分支机构与
    该分支机构
    上的内容之间的任何差异,并获得您想要的“批准每项添加”<代码>git提交当合并结果符合您的要求时。

    您可以执行类似于
    git checkout mainbranch&&git reset new branch的操作<