我在git中做的一件很常见的事情(特别是在项目中全部工作时)正在通过快进合并将当前主题分支合并到主分支中。令我困扰的是,我必须先检查主分支,它将工作树中所有已更改的文件更改回其原始状态,然后合并主题分支,再次将文件设置为新状态。
这导致我的IDE重新编译所有已更改的文件,因为它看到它们已被触摸,这实际上是不必要的,因为文件'内容与之前相同,因为像以前一样检出相同的提交。
如果没有git触及工作树,是否有一些git魔法可以达到相同的效果?
答案 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在临时位置执行合并,无论是否快进。