假设我是回购的维护者,并且我想从贡献者那里获取更改,那么有一些可能的工作流程:
cherry-pick
每次从远程提交(按顺序)。在这种情况下,git将提交记录为与远程分支无关。merge
分支,提取所有更改,并添加新的“冲突”提交(如果需要)。merge
每次从远程分支单独提交(再次按顺序),允许为每次提交记录冲突,而不是将所有冲突组合为一个。 rebase
(与cherry-pick
选项相同?),但我的理解是这可能会导致贡献者混淆。也许这会消除选项1。在案例2和3中,git记录了提交的分支历史记录,与1不同。
使用所描述的cherry-pick
或merge
方法之间的专家和关系是什么?我的理解是方法2是常态,但我觉得解决大问题提交单个“冲突”合并,并不是最干净的解决方案。
答案 0 :(得分:277)
rebase
(和cherry-pick
)和merge
都有其优点和缺点。我在这里争论merge
,但值得理解。 (在这里查看备选的,有争议的answer枚举案例,其中rebase
是首选。)
merge
优先于cherry-pick
和rebase
,原因有两个。
merge
工作流程。 rebase
往往被认为更先进。最好同时理解这两者,但是那些不想成为版本控制专家的人(根据我的经验,他们包括许多同事,他们非常擅长他们的工作,但又不想花费额外的时间)更容易时间只是合并。即使合并繁重的工作流rebase
和cherry-pick
仍然适用于特定情况:
merge
的一个缺点是历史混乱。 rebase
阻止了一系列的提交在您的历史记录中分散,就像您定期合并其他人的更改一样。事实上,这是我使用它的主要目的。您希望非常小心,永远不会与您与其他存储库共享的rebase
代码。一旦提交push
,其他人可能已在其上承诺,并且重新定位最多会导致上面讨论的重复类型。在最坏的情况下,你最终可能会遇到一个非常混乱的存储库和细微的错误,这将花费你很长时间才能找到它。cherry-pick
可用于从您基本上决定放弃的主题分支中抽取一小部分更改,但意识到有几个有用的部分。至于将多个变化合并为一个:它只是简单得多。一旦你开始拥有很多变更集,就可以非常繁琐地完成各个变更集的合并。 git(以及Mercurial和Bazaar中)的合并解析非常好。在大多数情况下,即使长分支合并也不会遇到重大问题。我通常会同时合并所有内容,只有如果我收到大量冲突,我会备份并重新运行合并零碎。即便如此,我还是以大块的方式做到这一点。作为一个非常真实的例子,我有一位同事进行了3个月的合并更改,并在250000行代码库中获得了9000个冲突。我们要做的是修复一次合并一个月的价值:冲突不会线性构建,并且分段执行会导致远少于9000个冲突。它仍然需要做很多工作,但并不像尝试一次提交一样多。
答案 1 :(得分:92)
在我看来,应该为需要的罕见情况保留挑选,例如,如果你直接在'master'分支(主干,主开发分支)上做了一些修复,然后意识到应该也应用它'maint'。您应该在合并或rebase(或“git pull --rebase”)上建立工作流。
请记住,从Git(具有不同的SHA-1标识符)的角度来看,挑选或重新提交的提交不同,因此它与远程存储库中的提交不同。 (Rebase通常可以处理这个,因为它检查补丁ID,即更改,而不是提交ID)。
同样在git中,您可以同时合并多个分支:所谓的章鱼合并。请注意,章鱼合并必须成功而不会发生冲突。不过它可能有用。
HTH。
答案 2 :(得分:-8)
Rebase和Cherry-pick是您保持干净提交历史记录的唯一方法。 避免使用合并并避免创建合并冲突。如果你正在使用gerrit,必要时将一个项目设置为Merge,将一个项目设置为cherry-pick模式并尝试自己。