我们公司目前正在使用简单的主干/发布/修补程序分支模型,并希望了解哪些分支模型最适合您的公司或开发过程.
工作流程/分支模型
以下是我所看到的三个主要描述,但它们彼此部分相互矛盾,或者不足以解决我们遇到的后续问题(如下所述).因此,我们的团队到目前为止默认不是那么好的解决方案.你做得更好吗?
合并与变基(纠结与连续历史)
是应该pull --rebase还是等待合并回到主线直到你的任务完成?我个人倾向于合并,因为这保留了一个任务开始和完成的基础的视觉图示,我甚至更喜欢merge --no-ff这个目的.然而,它有其他缺点.还有许多人没有意识到合并的有用属性 - 它不是可交换的(将主题分支合并到master中并不意味着将master合并到主题分支中).
我正在寻找一个自然的工作流程
有时会发生错误,因为我们的程序无法通过简单的规则捕获特定情况.例如,早期版本所需的修复当然应该足够下游,以便可以将上游合并到所有必要的分支中(这些术语的使用是否足够清楚?).然而,在开发人员意识到它应该被放置在更下游之前,并且如果已经推送(更糟糕的是,合并或基于它的某些东西)之后,修复使其成为主人,那么剩下的选项就是挑选,其相关的危险.您使用了哪些简单的规则?同样在这包括一个主题分支的尴尬必然排除其他主题分支(假设它们从共同基线分支).开发人员不希望完成一个功能来启动另一个功能,感觉就像他们刚写的代码不再存在
如何避免创建合并冲突(由于挑选)?
创建合并冲突的可靠方法似乎是在分支机构之间进行挑选,它们永远不会再次合并?在任一分支中应用相同的提交(如何执行此操作?)可能会解决这种情况?这是我不敢推动基于合并的工作流程的一个原因.
如何分解成外用分支?
我们意识到从主题分支组装完成的集成是很棒的,但是我们的开发人员经常工作没有明确定义(有时像"戳"一样简单),如果某些代码已经进入"misc"主题,根据上面的问题,它不能再被带出去了吗?您如何使用定义/批准/毕业/发布您的主题分支?
代码审查和毕业等适当的程序当然是可爱的.
但是我们根本无法保持足够的东西来管理这个 - 任何建议?整合分支,插图?
以下是相关问题列表:
还要看看Plastic SCM在任务驱动开发上写的内容,如果不是Plastic的选择,请研究nvie的分支模型及其支持脚本.
我有BranchA113个提交BranchB.
但我只希望将最后10个左右的提交BranchA合并到BranchB.
有没有办法做到这一点?
我们有以下情况:
A --- B --- C --- ... --- iphone
/
... --- last-working --- ... --- master
Run Code Online (Sandbox Code Playgroud)
在上次工作和iPhone之间,进行了32次提交.在last-working和master之间,做了很多提交.
我现在想要的是一个新的分支,我将iphone和当前的主人合并在一起.在以后的某个时间,这应该合并到主人.
首先,我计划做:
git checkout iphone -b iphone31
git merge master
Run Code Online (Sandbox Code Playgroud)
但后来我想,如果做得更好:
git checkout master -b iphone31
git merge iphone
Run Code Online (Sandbox Code Playgroud)
现在我想知道.结果会有什么不同?合并会有不同的表现吗?
我已经尝试了两种,正如我所料,我遇到了很多冲突,因为与主人相比,iphone真的很老了.现在我想知道合并它们的最简单方法.
也许甚至从大师开始并将每一次提交的iphone合并到它会更容易?喜欢这样做:
git checkout master -b iphone31
git merge A
git merge B
git merge C
...
git merge iphone
Run Code Online (Sandbox Code Playgroud)
最后,当这个合并完成时(即所有冲突都已解决且工作正常),我想这样做:
git checkout master
git merge iphone31
Run Code Online (Sandbox Code Playgroud) 有什么区别git merge --no-commit和git cherry-pick --no-commit?
如果我遵循这两个命令后,历史上有什么不同吗?
在本文中,作者使用此图解释了变基:
alt text http://eagain.net/articles/git-for-computer-scientists/git-history.7.png
Rebase:如果您还没有发布您的分支机构,或者已经清楚地告知其他人不应该以此为基础,那么您可以选择其他方式.您可以重新分支您的分支,而不是合并,您的提交将被另一个具有不同父级的提交所取代,并且您的分支将被移动到那里.
而正常的合并将如下所示:
alt text http://eagain.net/articles/git-for-computer-scientists/git-history.5.png
所以,如果你重订,你只是失去了一个历史状态(这将是垃圾回收在将来某个时候).那么,为什么有人想要做一次变革呢?我在这里错过了什么?
鉴于两个分支已经分歧,并且需要将一个分支(而不是所有内容)的特定提交引入另一个分支,git cherry pick就是这样.
一段时间后,需要完全合并两个分支.git将如何知道它已经过去曾经提交过的提交,以便它不会重新引入它?
我发现在Gerrit Web界面中单击"提交补丁集"时,它只是简单地向该分支添加提交,或者如果之前提交了另一个提交,则创建合并提交.
创建2提交的示例:实际提交和合并提交:
有一个"Rebase Change"按钮很棒,但这意味着要提交补丁集,每个人都应该这样做:
我看到合并提交有用的唯一原因是保留提交的日期(但我确实理解为什么在没有rebase的情况下需要它).
是不是有自动rebase或至少检查以避免产生不需要的合并提交?
我发现cherry-pick在某些情况下特别有用,例如,当我有一个feature1分支和一个test-feature1分支时,我想应用测试中发现的更正;或者换句话说,我想测试新功能,为此我需要在测试分支中使用这些新功能。
cherry-pick这里的好处是我可以选择我想在其他分支中应用的具体更改;也许合并整个分支并不有趣。
我在过去的项目中一直在使用它,但我认为这种做法会导致工作流程不一致。是cherry-pick-ing一个不推荐和可避免的做法?
我有一棵树:
/--b1---b2 <-- topic b
/
a1---a2 <-- topic a
Run Code Online (Sandbox Code Playgroud)
其中'b'取决于'a'.然后我意识到我需要做一些与主题'a'相关的更改以继续'b',但我想在'b'上做它们作为'b'的正常开发过程:
/--b1---b2---a3---a4---b3---b4---a5---b5 <-- topic b
/
a1---a2 <-- topic a
Run Code Online (Sandbox Code Playgroud)
然后,当我想在'b'上完成的事情完成时,我希望我的树看起来像这样:
/--b1---b2--------m---b3'---b4'---b5' <-- topic b
/ /
a1---a2---a3'---a4'---a5' <-- topic a
Run Code Online (Sandbox Code Playgroud)
好像我实际上对'a'进行了所有更改,然后将它们合并在'b'上,然后继续'b'.
我知道我可以手动执行此操作:
1- rebase/cherry-pick'a'从分支'b'提交到'a'2-在'b'上
创建一个时间分支'b-tmp'.
3-将分支'b'重置为'b2'.
4-将'a'合并到'b'上.
5- rebase/cherry-pick'b'从'b-tmp'提交到'b'.
6-删除分支'b-tmp'.
我可以创建一些脚本来执行此操作,我只想知道是否有更好的方法/想法来执行此操作,除了这6个步骤.