我在使用git时(尤其是在独自开发项目时),常见的操作是将当前主题分支与主分支进行快进式合并。但让我感到有些困扰的是,我必须首先检出master分支,这会将工作树中所有已更改的文件更改回它们的原始状态,然后再合并主题分支,这将使文件再次处于新状态。
这会导致我的IDE重新编译所有已更改的文件,因为它看到这些文件已被触及,而实际上不必要,因为文件内容与之前相同,与之前的提交相同。
有没有一些git的技巧可以实现同样的结果,而不需要触及工作树?
我在使用git时(尤其是在独自开发项目时),常见的操作是将当前主题分支与主分支进行快进式合并。但让我感到有些困扰的是,我必须首先检出master分支,这会将工作树中所有已更改的文件更改回它们的原始状态,然后再合并主题分支,这将使文件再次处于新状态。
这会导致我的IDE重新编译所有已更改的文件,因为它看到这些文件已被触及,而实际上不必要,因为文件内容与之前相同,与之前的提交相同。
有没有一些git的技巧可以实现同样的结果,而不需要触及工作树?
使用 git push
可以巧妙地解决这个问题。
请注意,当您执行 git push origin foo:foo
时,它会调用远程的第二个 Git,将必要的提交和其他 Git 对象传递给该 Git,然后询问另一个 Git:请将您的分支或标签 foo
设置为与我的相同的提交。 另一个 Git 要么说 是的,没问题,我已经完成了,要么说不行,这不是一个快进操作,如果这样做就会丢失提交。1
这意味着 git push
包含了检测是否为快进操作所需的逻辑。如果只能将您的分支 xyz
推送到 您自己的 Git 的分支 master
,实际上,您可以这样做!
git push . xyz:master
.
表示“我,我自己”。接下来,你将发送给其他Git你拥有但他们没有的任何提交。由于他们就是你,所以这根本不需要什么时间,非常快速。 :-) 最后,它要求他们(即你)将他们(即你)的主分支
设置为与你的xyz
匹配,但仅当这是在他们(即你)的主分支
上快进操作时。
所有这些都发生在不改变你自己的Git存储库的情况下。这基本上是一种简单(尽管狡猾)的测试方式:“将某个分支名称移动到快进操作吗?如果是,请执行;如果不是,请勿执行。”
1这假定没有被预先接收和更新钩子禁止的更新。这样的钩子也可能因为某些原因而拒绝推送,而不是因为非快进。
一种方法是强制更新master
分支:
git branch -f master feature
master
分支有不同的更改(feature
没有),它会弄乱master
。
您可以输入以下命令:git log ..master --oneline
在feature
分支上,确认没有这样的提交。