git:快速合并而不触及工作树

时间:2017-06-15 13:29:56

标签: git merge

我在git中做的一件很常见的事情(特别是在项目中全部工作时)正在通过快进合并将当前主题分支合并到主分支中。令我困扰的是,我必须先检查主分支,它将工作树中所有已更改的文件更改回其原始状态,然后合并主题分支,再次将文件设置为新状态。

这导致我的IDE重新编译所有已更改的文件,因为它看到它们已被触摸,这实际上是不必要的,因为文件'内容与之前相同,因为像以前一样检出相同的提交。

如果没有git触及工作树,是否有一些git魔法可以达到相同的效果?

3 个答案:

答案 0 :(得分:5)

使用git push有一个偷偷摸摸的伎俩。

请注意,当你git push origin foo:foo时,这会在名为origin的远程调用第二个Git,向该Git传递任何必要的提交和其他Git对象,然后询问另一个Git:请将您的分支或标记foo设置为与我相同的提交。其他Git要么是,那很好,我做了不,那不是一个快进的操作,我不能在不丢失提交的情况下做到这一点。 1

这意味着git push内部有检测某些东西是否是快进操作所需的逻辑。如果只有你可以将你的分支xyz推送到你自己的 Git的分支master ......事实上,你可以!

git push . xyz:master

告诉你的Git打电话给本身 - 远程.意味着“我,我自己”。接下来,您向其他Git发送您没有的任何提交。因为他们 你,这根本不算什么,而且非常快。 :-)最后,它要求他们(即你)设置他们(即你的)master以匹配你的xyz,但只有在他们的快进操作时才设置(即,你的master

所有这些都不会改变您自己的Git存储库的任何其他内容。它本质上是一种简单的(虽然是偷偷摸摸的)测试方式:“正在将一些分支名称移动到快进操作中?如果是这样,那么,如果没有,则不要这样做。”

1 这假设通过预接收和更新挂钩没有禁止更新。这种钩子也可以拒绝推动,出于某种原因,除了非快进之外。

答案 1 :(得分:1)

一种方法是强制更新master分支:

git branch -f master feature

这适用于快进合并。 但是,如果master分支发生了不同的变化(feature没有),则会导致master陷入困境。

您可以发出命令:

git log ..master --oneline

feature分支上确认没有此类提交。

答案 2 :(得分:1)

您可以使用git worktree在临时位置执行合并,无论是否快进。