gpt4 book ai didi

Git Merge 添加新文件而不是冲突标记 - CONFLICT(重命名/添加)

转载 作者:太空狗 更新时间:2023-10-29 14:03:26 24 4
gpt4 key购买 nike

运行时git merge origin master在命令行上,我没有得到通常的冲突标记 <<<<<<但相反,冲突的文件被复制到我的本地环境中。

这可能与更改文件夹名称有关吗?

例子:

git fetch origin master && git merge origin master
CONFLICT (rename/add): Rename javascript/main.js->js/main.js in HEAD. js/main.js added in %commit-hash%
Adding as js/main.js~%commit-hash% instead

然后我在本地有 2 个文件: js/main.js & js/main.js~%commit-hash%
如何让 git 给我使用冲突标记而不是新文件?

& 谁能解释一下为什么会这样?
  • 注意:%commit-hash%例如,它只是实际提交哈希的占位符。
  • 最佳答案

    TL;博士

    尝试使用 -X find-renames=<value>获得不同的重命名检测。或者,如果这不起作用或您不喜欢该方法,则在必要时从存储在索引中的多个阶段中提取所有文件,然后使用 git merge-file “手动”制造冲突。



    这是一个高级冲突:由于多个不同的文件更改名称而发生的冲突,而不是单个文件中发生的冲突。

    Git 已经准确地告诉你问题出在哪里:

    Rename javascript/main.js->js/main.js in HEAD ...



    所以比较电流时还是 HEAD提交到你和他们开始的通用 merge 库,Git 发现你使用了 javascript/main.js并将该文件重命名为 js/main.js .

    ... js/main.js added in hash



    他们,不管他们是谁,留下文件 javascript/main.jsjavascript/main.js , 但随后创建了一个名为 js/main.js 的新文件.

    因为只能有一个文件名为 js/main.js , Git 必须做一些特别的事情。它不能把你的 js/main.js (您从 javascript/main.js 重命名)为 js/main.js并将他们新创建但不同的 js/main.js进入 js/main.js .所以它把他们的 js/main.js进入 js/main.js~hash .

    How can I make git give me conflict markers to work with instead of a new file?



    也许你可以简单地做到这一点,也许不能。

    首先,你要判断 Git 对情况的分析是否正确。你重命名了 javascript/main.jsjs/main.js ?而且,他们做了什么:他们是否保留了原来的 javascript/main.js并添加一个新的和不同的 js/main.js ,或者他们是否真的重命名了他们的 javascript/main.js只是 Git 没有意识到这一点,并认为他们创建了一个全新的 js/main.js与原始 javascript/main.js 无关?

    如果问题是 Git 错误检测到这两个重命名,您可以尝试调整 -X find-renames=<value>设置(在旧版本的 Git 中命名为 -X rename-threshold=<value>)。降低数字使 Git 更愿意将明显不同的文件视为“相同”文件。提高数字会使 Git 不太愿意将此类文件视为“相同”,以至于如果将其设置为 100%,则文件的内容必须完全匹配。

    如果所有这些都是这种情况并且此过程顺利进行,您可能会得到您想要的并且不需要任何其他棘手的部分。如果没有,那么:

    用手做

    如果 Git 是正确的,并且您的 js/main.js真的被改名了,而他们的 js/main.js真的是新的, merge 文件可能是不可取的。但是,您可以这样做,使用 git merge-file ,它适用于工作树中的普通文件。首先,您需要将所有三个文件都放入您的工作树中:
  • merge 基础版本,原名为 javascript/main.js在 merge 基础提交中(无论其哈希 ID 是什么)。
  • --oursHEAD版本,名为 js/main.js在当前提交中。
  • --theirs版本,也称为 js/main.js但在他们的 promise 中。

  • 这三个版本中的两个已经在您的工作树中可用,使用 Git 宣布的两个名称。

    您的索引中还应该有每个文件的副本: merge 基础作为阶段 1 条目存在, --oursHEAD版本作为第 2 阶段条目存在, --theirs版本作为第 3 阶段的条目存在。这意味着您可以使用 git showgit checkout-index到达每个。 (实际上,您可能可以使用 git checkout-idnex --stage=all 一次将所有这些文件作为临时文件,但我没有对此进行过实验。)由于您仍然需要的是基本版本,因此您可以使用:
    git show :1:js/main.js > main.js.base

    例如(假设是 Unix 风格的 shell)。

    在工作树中拥有所有三个文件后,您可以运行:
    git merge-file <head-version> <base-version> <their-version>

    生产,在 <head-version> ,文件的冲突标记版本。假设您到目前为止显示的名称,并将 stage-1 文件写入 js/main.js.base ,那将是:
    git merge-file js/main.js js/main.js.base js/main.js.~<hash>

    关于Git Merge 添加新文件而不是冲突标记 - CONFLICT(重命名/添加),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649882/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com