在命令行运行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然后我有两个文件在我的本地:js/main.js & js/main.js~%commit-hash%
如何让git为我提供冲突标记,而不是一个新文件?
有人能解释一下为什么会发生这种情况吗?
%commit-hash%只是实际提交散列的占位符。发布于 2018-06-02 04:32:47
TL;DR
尝试使用-X find-renames=<value>进行不同的重命名检测。或者,如果该方法不起作用或您不喜欢该方法,则在必要时从存储在索引中的多个阶段中提取所有文件,然后使用git merge-file“手动”创建冲突。
长
这是一个高级冲突:由于多个不同的文件具有不同的名称而发生的冲突,而不是单个文件内部发生的冲突。
Git已经确切地告诉了你问题所在:
在
HEAD中重命名javascript/main.js->js/main.js...
因此,当比较当前或HEAD提交到您和它们开始时所用的公共合并库时,Git会发现您获取了javascript/main.js并将该文件重命名为js/main.js。
...在
hash中添加了js/main.js
无论他们是谁,都将javascript/main.js文件保留在javascript/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。
怎样才能让git给我提供冲突标记,而不是一个新文件?
也许你可以做这件微不足道的事,也许不是。
首先,您必须确定Git对情况的分析是否正确。您是否将javascript/main.js重命名为js/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确实是新的,那么合并这些文件可能是不可取的。但是,您可以使用git merge-file来实现这一点,它可以处理工作树中的普通文件。首先,您需要将所有三个文件放入工作树中:
javascript/main.js (无论其哈希ID是什么)。--ours或HEAD版本,在当前提交中命名为js/main.js。<代码>H148<代码>D49版本,也称为<代码>D50,但在其提交中。<代码>H251<代码>F252
这三个版本中的两个已经在您的工作树中可用,使用的是Git宣布的两个名称。
索引中的每个文件也应该有一个副本:合并库作为阶段1条目存在,--ours或HEAD版本作为阶段2条目存在,--theirs版本作为阶段3条目存在。这意味着您可以使用git show或git 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>https://stackoverflow.com/questions/50649882
复制相似问题