【发布时间】:2015-10-13 22:55:12
【问题描述】:
Git rebase 似乎没有按我预期的方式工作,基于我的 对变基的理解,以及基于我如何看到变基在 水银。我已经生成了一个示例来说明奇怪的行为,并且我 希望有人能解释为什么 Git 会这样。考虑这个 DAG 的状态:
在这种情况下,我在 master 上提交了 f7 和 f8,但我想移动 而是将这些新提交放到功能分支上。即我做了提交 错误的分支,并希望纠正错误。我可以从 源树:
SourceTree 证实了我的意图:
但结果完全不是我所期望的:
虽然节点在 DAG 中的位置正确,但分支头在 不正确!通过将 f7 和 f8 重新设置为 f6,我希望看到 master 重置为 原点上的位置,并期望 feature/AAA-1 前进到 f8。像这样:
这是我所期望的行为,基于 Mercurial 中的变基,并且只是 通常基于变基正在做什么。为什么 Git 这样做,我该怎么做 让它正常运行?
【问题讨论】:
-
“我怎样才能让它正常运行?”假设 you 是错误的,而不是工具,通常是一个好主意。与 Git 世界中 rebase 的(同样有效的)想法相比,您对 rebase 所做的事情(这在 Mercurial 世界中很可能是正确的)有不同的心理模型。
-
感谢互联网巨魔先生为这个问题添加了无效评论:)
-
相反,我相信我的评论是富有成效的。如果你反对你的工具,坚持认为它做错了事,你将继续遇到问题。在 Git 和 Mercurial 中,分支是完全不同的东西。 Git 没有错;它只是不同。 Mercurial 与 Subversion 的工作方式不同,Subversion 与 Perforce 的工作方式不同……它们中的任何一个比其他的更客观“正确”吗?这种思维方式的改变很重要。
-
相反,我曾使用过 CVS、SVN、SourceSafe、TFS、Perforce、Mercurial、Git 和 Bazaar。我精通这些传统概念和 DVCS 概念,并且为其中不止一个提供了源代码。我几乎在所有这些问题中都遇到了错误、缺陷和设计缺陷(毕竟没有 VCS 是完美的),并且曾多次提供补丁来解决这些问题。你坚持认为 Git 的当前行为是绝对正确的行为,或者认为 Git 没有错误,没有改进的余地,都是幼稚的。这是 Git 变基的一个缺陷。
-
“你坚持认为 Git 的当前行为是绝对正确的行为,或者认为 Git 没有错误,没有改进的余地,都是幼稚的。”我同意这太天真了,这就是为什么我没有说任何接近这个的原因。我的观点是 Git 模型和 Mercurial 模型是不同的,要问你如何“使 [Git] 行为正确”,意思是“Mercurial 的方式”,是一个糟糕的选择。没有什么能使 Mercurial 模型客观地“正确”。不幸的是,这个评论线程变得有点傻,所以我会在这里停下来。
标签: git mercurial rebase atlassian-sourcetree