3 回答
TA贡献2036条经验 获得超8个赞
这两个rebase
(及cherry-pick
),并merge
有自己的优点和缺点。我在merge
这里主张,但这两个都值得理解。(在这里找到一个替代的,争论激烈的答案,列举了rebase
首选的情况。)
merge
优于cherry-pick
和rebase
一对夫妇的原因。
坚固性。的的SHA1标识提交识别它不仅在其本身,而且相对于它前面的所有其他的提交。这样可以保证给定SHA1上所有克隆的存储库状态都相同。从理论上讲,几乎没有人进行过相同的更改,但实际上是在破坏或劫持您的存储库。您可以选择单个更改,并且它们可能是相同的,但您不能保证。(作为次要的次要问题,如果其他人再次在同一提交中进行新的挑选,则新的挑选出的承诺将占用额外的空间,因为即使您的工作副本最终相同,它们也会出现在历史记录中。)
易于使用。人们倾向于
merge
相当容易地理解工作流程。rebase
往往被认为更高级。最好两者都理解,但是不想成为版本控制专家的人(根据我的经验,其中包括许多非常擅长于他们的工作,但又不想花费额外时间的同事),他们会更轻松时间只是合并。
即使是繁重的工作流程rebase
,cherry-pick
在某些情况下仍然有用:
不利的一面
merge
是历史混乱。rebase
可以防止一连串的提交分散在您的历史记录中,就像您定期合并其他人的更改一样。实际上,这就是我使用它的主要目的。您要非常小心,永远不要rebase
编码与其他存储库共享的代码。一旦完成了提交,push
其他人可能已经在其上提交了,重新定基最多将导致上面讨论的那种重复。在最坏的情况下,您可能会得到一个非常混乱的存储库和细微的错误,这将使您花费很长的时间来寻找信息。cherry-pick
有助于从您基本上决定放弃的主题分支中抽取一小部分更改,但是意识到其中有一些有用的内容。
至于更喜欢将许多更改合并为一个:这只是简单得多。一旦您拥有大量变更集,那么合并各个变更集可能会变得非常乏味。git(以及Mercurial和Bazaar)中的合并分辨率非常好。大多数时候,即使合并很长的分支,也不会遇到重大问题。通常,我会一次合并所有内容,并且只有在遇到大量冲突时,我才备份并重新运行合并程序。即使那样,我也会大块地做。作为一个非常真实的例子,我有一位同事,他有3个月的更改要合并,并且在250000行代码库中遇到了9000个冲突。我们要解决的问题是一次合并一个月的价值:冲突不是线性累积的,而逐步进行合并会产生很大的结果少于9000个冲突。这仍然是一项艰巨的工作,但不如一次完成一次提交那么多。
TA贡献1777条经验 获得超3个赞
我认为应该在需要的情况下保留樱桃采摘,例如,如果您直接在“主”分支(树干,主开发分支)上进行了一些修复,然后意识到也应将其应用于“维护” '。您应该基于合并或重新设置工作流(或“ git pull --rebase”)。
请记住,从Git(具有不同的SHA-1标识符)的角度来看,精心挑选或基于基础的提交不同于原始提交,因此它不同于远程存储库中的提交。(Rebase通常可以处理此问题,因为它检查补丁程序ID,即更改,而不是提交ID)。
同样在git中,您可以一次合并许多分支:所谓的octopus merge。请注意,章鱼合并必须成功而没有冲突。但是,它可能有用。
HTH。
TA贡献1966条经验 获得超4个赞
Rebase和Cherry-pick是保持干净提交历史记录的唯一方法。避免使用合并,并避免产生合并冲突。如果使用的是gerrit,则如有必要,将一个项目设置为Merge,将一个项目设置为Cherry-pick模式,然后尝试一下。
- 3 回答
- 0 关注
- 1079 浏览
添加回答
举报