繁体   English   中英

git工作流:一次性合并和git-rerere - 重点是什么?

[英]git workflow: throwaway merges and git-rerere - what's the point?

像大多数刚接触Git的人一样,我有一些困惑,试图破译适用于git merge和git rebase的用例。 我想我终于决定,就最终的工作副本状态而言,它们会给你同样的东西。 而且,它们都会导致相同的冲突。 如果这不正确,请提供一个示例来启发我。

从我的角度来看,使用rebase而不是合并(如果你的更改没有被推或拉)的主要好处是保持历史的线性。 我真正不理解的是开发git-rerere背后的原因。

从联机帮助页面中,git-rerere可以帮助您解决之前已解决的冲突。 我将要参考的示例可以在http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html找到。

如果你的项目的策略是不经常将更改从主线合并到主题分支(如linux内核),上面的例子说创建“丢弃”合并提交。 本质上,将主服务器合并到您的主题中,运行测试以确保一切仍然有效,然后执行“git reset --hard HEAD ^”,基本上抛弃合并提交。 稍后,当您创建另一个“一次性”合并提交时,git-rerere会帮助您解决在第一次抛弃合并中已经解决的冲突。

有人可以解释为什么而不是经历创建临时合并提交的所有麻烦,开发人员不会只是将他的主题改为主人吗? 这不是git-rebase的重点 - 获取更改,但避免合并? 这不是完成同样的事情,并假设没有人拉动你的主题分支变化,这不是一个更简单的方法吗? 抛弃合并+ git-rerere工作流真的只是针对你的更改被推/拉的情况吗?

最后一个问题 - 引用Linus的话说:“但如果我在你的日志中看到很多'合并分支linus',我就不会从你那里拉出来,因为你的树显然有随机的废话,不应该在那里......“Linus也会有不断变化的问题吗?

你是正确的,变基和合并可以产生相同的最终树。 然而,他们产生的历史是非常不同的,版本控制当然都与历史有关。 你已经表达了对线性历史的偏好; 这在当地规模上确实是可取的,而合并有助于记录功能,错误修正等的更大规模的交互。

对你的核心问题(为什么不仅仅是rebase)的简单回答是,有时候分支开始是一个合适的地方,如果是这样的话,你应该合并,而不是变基。

例如,您可能有一个适用于维护版本以及当前版本的错误修复程序; 你想要从最新的提交中分支它,这是两个版本的祖先。 您不能沿着主分支或维护分支向前重新分支该分支,否则您将无法再将其合并到另一分支中。

同样,所有主题分支都从某处开始。 在某些时候,您希望保留该历史记录。 你提到了其中一个明确的案例(其他人已经完成了你的工作),但它可能不那么明显了。 也许有一些与其他功能的交互,也许这个功能有子功能,并且你试图保持整个层次结构。

所以,当然,如果分支是本地的并且没有理由保持其基础固定,那么就像你说的那样简单地重新定义它并完成它。 但有时这不是正确的事情。

你的最后一个问题实际上是关于一些非常不同的问题,与合并冲突无关。 Linus说, 合并的背景下不需要做 这是分支和合并哲学的一个问题。 Junio Hamano写了一篇关于这个问题的优秀博客文章 一个简短的引用,总结了手头的主题:

当你将一个主题分支'add-frotz'合并到你的'master'分支时,你显然正在使用新的'frotz'功能,但更重要的是,你声明你需要在''frotz'功能中加入'frotz'功能。主人'分支

Linus不希望看到你合并这个名为'linus'的奇怪分支,因为很明显你并没有合并一些特定的主题,这在你的分支中是可取的。 您反复将上游分支合并到主题分支中,这完全是错误的方向。 你不需要master(或linus)的所有东西来开发你的主题。 你应该完成你的主题,然后以另一种方式合并,上游到主人! 在主题分支中拥有master的所有内容是不可取的。 (就集成商而言,单个开发人员的主人真的是一个主题分支。)

因此,Linus没有频繁合并的问题; 他有无目的和适得其反的合并问题。 (一般来说,如果你确保你的合并是有充分理由的,那么它们就不会经常发生 - 而且它们几乎永远不会是下游合并。)如果你的改变是有充分理由的,那么他们就会创造历史更好,然后它们是一件好事,无论多么频繁。

这不是完成同样的事情,并假设没有人拉动你的主题分支变化,这不是一个更简单的方法吗? 抛弃合并+ git-rerere工作流真的只是针对你的更改被推/拉的情况吗?

你已经击中了头部。 重新绑定对于尚未发布的分支机构有利; rerere对于您已发布的分支(即,对于下游开发人员而言不适合/讨厌的分支)非常有用。

Linus也会遇到不断变换的问题吗?

不,因为重新定位不会导致合并提交,并且表面上看,您无法看到分支已经被重新定位,而您可以轻松地查看分支是否已多次合并到另一个分支中。

每个功能的分支工作流建议有临时集成分支。 在这种情况下,如果您进行rebase,则必须对临时分支进行rebase(或pull),这可能会在最终版本中设置不同的checkin。 使你的rebase实际上没用。 或者就此而言,如果你确实拉入了你的分支,那么这种拉动可能会变得毫无用处。

Rerere虽然有助于减轻反复出现的合并疼痛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM