邪恶合并在git?

kro*_*old 20 git merge

"man gitglossary "包含邪恶合并的这个定义:

邪恶合并是一种合并,它引入了未出现在任何父级中的更改.

我不确定我理解作者想要达到的观点.为什么这是邪恶的?

cha*_*aos 20

因为它把代码放在代码中,没有人要求在那里.好像你有这个代码:

$foo = bar;
$baz = qxx;
Run Code Online (Sandbox Code Playgroud)

而这个变化:

$foo = bar;
$foo++;
$baz = qxx;
Run Code Online (Sandbox Code Playgroud)

与此更改合并:

$foo = bar;
$foo--;
$baz = qxx;
Run Code Online (Sandbox Code Playgroud)

以某种方式产生的方式:

$foo = bar;
$foo++;
$foo--;
--$baz;
$baz = qxx;
Run Code Online (Sandbox Code Playgroud)

显然,这是邪恶的.

我猜想man gitglossary因为你的合并算法涉及的越多,他们就越有可能产生这样的东西.

  • 在哪里 - $ baz; 来自.我不认为GIT随机生成代码.对我来说,这是非常邪恶的,增量和减量合并,没有任何人澄清哪个是正确的代码.结果是两次更改破坏了代码.来自无处的线路必须由某人手动"纠正"合并.那时,这不是GIT的错吗?!?!? (9认同)
  • @Xaade:`git`本身不会产生那个结果.它将生成一个带冲突标记的版本(即:`<<<<<<< HEAD \n [代码来自头部] \n ====== \n [代码来自分支] \n >>>>>>分支`,并且它不会提交.然后由程序员手动解决冲突.如果他们这样做而不引入新代码,那么它不是邪恶的.所以混乱的最后一个例子不会是没有` - 的邪恶合并 - $ baz;`line.这将是一个**愚蠢的合并**,但错误将由程序员而不是git. (9认同)
  • @Jefromi 根据这个定义,任何与必须手动解决的冲突的合并都是邪恶的合并?与@chaos 所说的有很大的语义差异;你可能会得到他的结果,而不会在合并过程中发生任何冲突。这是真正的邪恶。 (3认同)
  • 要生成它,只需使用--no-commit选项调用git-merge,添加更多更改,检入并提交.将自动使用预生成的合并提交消息. (2认同)

Ada*_*icz 10

用Linus Torvalds自己的话来说(取自git邮件列表):

"邪恶的合并"是指从任何一方做出改变并且实际上并未解决冲突的事情

  • @JoaoTavora 这种合并将是邪恶的。 (2认同)

Jak*_*ski 8

我认为它可能被命名为'邪恶合并',因为当注释文件(生成行式历史注释)时,"git blame"难以解决.


当您在主分支上开发特征"A"时,需要进行邪恶合并,并且在侧分支上使用"B"特征,并且这些特征以语义(非文本)方式发生冲突.一个例子是对全局变量使用相同的名称,具有不同的含义 - 这需要为其中一个特征重命名变量.

对于邪恶的合并" git show --cc"具有非空紧凑组合差异(但我不确定它是否是等价关系;暗示可能只在一个方向,即"邪恶合并"然后非空" git diff-tree -p --cc").

  • 我认为你正确地强调了"通常".有时_minimal_手动分辨率会产生不存在的行.(例如''我们的'改变了函数的名称,'他们'改变了返回值,我们需要一个带有新名称和新返回值的方法).这是一个邪恶的吗?IOW:邪恶的合并有时是必要的吗?+1 (5认同)
  • 解决冲突*通常*涉及选择其中一个版本而不是另一个版本,有时在其他版本的行中选择一个版本行.Evil merge包含不在其父项中的行,因此即使通过最复杂的(通用)合并策略也无法自动重新创建. (2认同)

jbi*_*obr 5

值得一提的是,在对包含不与其他提交冲突的“邪恶更改”的“邪恶合并”进行变基时,来自“邪恶合并”的“邪恶更改”可能会默默丢失。在这种情况下使用--preserve-merges没有帮助。