Git:在不触碰工作树的情况下快进合并

3

我在使用git时(尤其是在独自开发项目时),常见的操作是将当前主题分支与主分支进行快进式合并。但让我感到有些困扰的是,我必须首先检出master分支,这会将工作树中所有已更改的文件更改回它们的原始状态,然后再合并主题分支,这将使文件再次处于新状态。

这会导致我的IDE重新编译所有已更改的文件,因为它看到这些文件已被触及,而实际上不必要,因为文件内容与之前相同,与之前的提交相同。

有没有一些git的技巧可以实现同样的结果,而不需要触及工作树?


虽然不能快进,但请参考此相关问题:https://dev59.com/7mgv5IYBdhLWcg3wY_02 - doak
3个回答

6

使用 git push 可以巧妙地解决这个问题。

请注意,当您执行 git push origin foo:foo 时,它会调用远程的第二个 Git,将必要的提交和其他 Git 对象传递给该 Git,然后询问另一个 Git:请将您的分支或标签 foo 设置为与我的相同的提交。 另一个 Git 要么说 是的,没问题,我已经完成了,要么说不行,这不是一个快进操作,如果这样做就会丢失提交。1

这意味着 git push 包含了检测是否为快进操作所需的逻辑。如果只能将您的分支 xyz 推送到 您自己的 Git 的分支 master,实际上,您可以这样做!

git push . xyz:master

告诉你的Git调用自己——远程 . 表示“我,我自己”。接下来,你将发送给其他Git你拥有但他们没有的任何提交。由于他们就是你,所以这根本不需要什么时间,非常快速。 :-) 最后,它要求他们(即你)将他们(即你)的主分支设置为与你的xyz匹配,但仅当这是在他们(即你)的主分支上快进操作时

所有这些都发生在不改变你自己的Git存储库的情况下。这基本上是一种简单(尽管狡猾)的测试方式:“将某个分支名称移动到快进操作吗?如果是,请执行;如果不是,请勿执行。”


1这假定没有被预先接收和更新钩子禁止的更新。这样的钩子也可能因为某些原因而拒绝推送,而不是因为非快进。


+1 是因为它可以在一行代码中检查快进并更新主分支。虽然另一个选项也不错,但对我来说使用 push 进行本地操作有点“狡猾”。我甚至不敢在我的生产代码上测试它。 - jederik

1

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

git branch -f master feature

这对于快速合并来说很有效。但是如果master分支有不同的更改(feature没有),它会弄乱master。 您可以输入以下命令:
git log ..master --oneline

feature分支上,确认没有这样的提交。


非常糟糕的想法,因为这不是本质上安全的。在我看来,有更好的答案。 - doak

1
您可以使用git worktree在临时位置执行快进或非快进合并。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接