Git 合并导致回归

Git merge causing regressions

你能帮我解开这个谜团吗?几个月来我们一直遇到一个问题,有时,我们的 git 回购中的更改似乎“消失”或倒退。我终于在表演中发现了它。

我们的工作流程是从 master 创建一个功能分支并开始工作。当我们准备合并我们的工作时,我们首先将 master 合并到功能分支,并修复任何冲突或集成问题。

在这个特定的合并过程中,git 决定选择一个块的功能分支版本,而它应该从 master 中选择块。没有合并冲突,git 只是认为这是正确的做法,错误的。为什么?而我们能做些什么来防止这种事情发生呢?

为什么要将 master 合并到 feature 中?您的功能分支应该是代表您的更改的一组独立的提交。一旦您将 master 合并到功能中,您就 'polluted' 您的提交。

如果您需要在功能分支后提交到 master 的更改,您应该使用 rebase。将变基(从这个意义上说)想象为再次创建您的分支,现在,您已经在该功能分支上进行了提交。

关于您的更改消失的推测原因是文件的主版本比功能分支提交更晚。当您将 master 合并到 feature 时,没有合并冲突,因此 git 自动合并分支以方便使用。

尝试重新创建您在上面提到的场景,而不是将功能合并到主场景中,看看会发生什么。

编辑:

how would we handle a hotfix that needs to happen in the middle of the integration of the feature with master?

在集成之前,可以从最新的远程主机创建一个修补程序作为新分支。请记住,您只是在本地存储库上进行集成,因此此处的任何更改还没有 public...。

git checkout -b hotfix origin/master
# do changes
git commit -am "Made hotfix"
git checkout master
git merge hotfix

# hotfix complete!
git push origin master 

how do we keep long running feature branches up to date?

这是 rebase 面包和黄油!如果您的功能是孤立的,您可能 没有 变基。那就是说你应该尽量保持你的功能尽可能简洁,所以重新设置这些功能分支是个好主意。这也意味着您 'integrating' 随心所欲!

git checkout master
git checkout -b long_feature master
# commit
# commit
# commit

# now to rebase!
# get latest changes from others
git fetch origin 
# update your local master branch to reference the latest from origin/master
git branch -f master origin/master
# do the rebase!
git rebase master

# repeat this cycle as often and as many times as necessary until your feature is complete

变基时,您可能必须解决冲突。无论如何,这是您在某个阶段必须要做的事情,如果您边做边做,您可能会解决不那么复杂的冲突,因为它们是渐进的而不是 'big bang'.