git 是一个很棒的工具;但是,它不能代替开发人员之间的良好沟通。
您必须询问master 中的更改是否也必须包含在feature 中。理想情况下,功能分支应该有尽可能少的代码。
如果更改绝对必须包含在feature 中,那么您基本上有两个选择:git rebase;还有,git cherry-pick。我想你可以从master 向后合并到feature;但是,这可能会导致糟糕的情况......
cherry-pick 允许您对当前的HEAD 应用一个特定的提交或多个提交,保留评论和作者信息。在成功cherry-picked 之后,git 足够聪明,知道将feature 合并回master 时两个提交是相同的。如果只是我们所说的几个提交,那么cherry-pick 应该就足够了。
rebase 允许您从历史的不同点开始应用当前分支(提交行)。正如您所指出的,这对于已经拥有feature 副本的 developer1 和 developer2 来说可能很麻烦。他们还需要将rebase 本地开发转移到新 feature 分支。
无论如何,developer3 直接对master 的提交应该已经在它自己的特性分支中,并且该特性分支应该已经被合并。然后可以根据需要将该功能分支合并到feature。假设在master 中只有一个(最近的)提交,您可以按如下方式纠正这种情况:
# Ensure clean working directory
$ git stash
# Create new branch at master
$ git branch some-descriptive-name master
# Move master back one commit
$ git checkout master
$ git reset --hard HEAD^
# Merge the new branch into master
$ git merge --no-ff some-descriptive-name
# Forcibly update master
# YOU SHOULD COMMUNICATE WITH OTHER DEVS BEFORE DOING THIS
$ git push -f origin master
# Merge the new branch into feature
$ git checkout feature
$ git merge --no-ff some-descriptive-name
我怎么强调良好沟通的价值都不为过,因为这类“糟糕”的事情可能而且确实会一直发生。
祝你好运!
编辑:
关于cherry-picking 的部分是在假设master 只有几个提交(或只有一个)并且它们都是cherry-picked 的情况下编写的。
x -- y (master)
\
a -- b -- c (feature)