git - 如何实现简化的合并提交
问题描述
理由:外部环境审查发生在此处表示为的分支上master>
。我想将(更好:组合)提交压缩在一起,以便对某个开发步骤进行所有更改。因此:
我如何从左到右?
master> * C <feature
|\
* H <feature - just local | * H (merged)
| | |
* G - pushed to remote =??=> | * G (merged)
master> B * | - pushed to remote B * |
| * F - pushed to remote | * F (merged)
|/ |/
* A *
实际上,功能路径上的提交数量很大(10+),我想将它们全部压缩。其中一部分已发布到远程存储库(不应更改或更改)。但是我只想在主分支上创建一个提交。
git merge --squash
显然执行此操作,但它不会将提交标记为合并。因此,如果我继续在<feature
-Branch 上工作,下一次调用git merge
将导致很多冲突。我在 stackoverflow 上找到了一个解释:git merge --squash
导致一个与源提交无关的补丁。
所以,我想要实现的是从右到左的情况,并且 featurebranch ( 和 ) 上的所有提交都F
将G
被H
标记为合并*) - 如果我继续在 Featurebranch 上工作,下一次合并不会导致与我的冲突自己的变化。如果 Featurebranch 上的所有更改都未发布到远程存储库,则此问题已解决(请参阅git merge --squash
-Question)。
PS:当然,将提交单独标记为已合并就足够了,但我既不知道该怎么做,也不知道 git 如何管理它的合并信息。
PSS:正常合并可以,但如果 master 上没有提交,它会失败。
*):“标记为合并”的意思是,在 gitk - 如果您选择提交,分支列表包括功能、遥控器/原点/功能、主控、遥控器/原点/主控。结果,这些提交将不会在随后的调用中被考虑git merge
。
解决方案
没有办法做你想做的事。
当 Git 进行合并时,它会计算合并基数,这大致是两个分支的共同祖先提交。在典型合并中考虑的三个(也是唯一的)三个点是合并基础和两个头部。如果您进行正常的合并,那么您将在主分支上产生一个新的提交,并且该提交或其后代之一通常将在未来用作合并基础,这意味着 Git 不会将您的更改视为第二次。
如果您进行 squash 合并,则合并基础是原始分叉点,因此后续合并会将您视为进行了具有相同更改的多次提交,从而导致您所看到的冲突。
除非您使用自定义合并驱动程序,否则您无法自定义合并基础检测,因此您需要采用另一种解决方案或学习处理冲突。
您可以做的是删除现有分支并在分支上重新创建它master
(或将其重置为最新的提交 on master
),这意味着未来的工作基于包含所有先前工作的提交。这将避免你的冲突。
您还可以使用标准合并而不是壁球合并,这将使合并基础检测做正确的事情。
最后,您可以编写一个自定义合并驱动程序,以某种方式直观地了解有关您的分支的信息。我不推荐这种方法,因为它涉及大量工作,而且很容易出错并弄乱所有数据。
但最终,鉴于您的工作流程限制,您可用的选项并不多。我个人建议采用一种不同的、更标准的、约束更少的工作流程;逻辑的、独立的提交;和标准的合并政策。
推荐阅读
- javascript - 自动完成关闭在边缘浏览器上不起作用
- python - 在初始化时为模型提供枚举以进行属性转换
- .net - 使用 Xamarin.forms 中的 Entry 属性检查以确保第一个输入数字为 0
- c# - 我无法在 C# 中以我想要的方式输出数字
- java - 底部导航栏在打开另一个片段时停止运行
- mysql - R Docker:无法通过套接字连接到本地 MySQL 服务器
- java - Intellij 错误:(3、4)java:-source 8 不支持模块(使用 -source 9 或更高版本来启用模块)[已解决]
- python - 对于单词,枚举中的标记(句子):TypeError:'int'对象不可迭代
- python - 矩阵:有效地将第 n 行移动 n 个位置
- xamarin.forms - 将页面推送到最顶部的 NavigationPage