最佳答案
下面是我在工作中经常处理的一个工作流程。
git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch
此时,特性分支正在等待我的同事的审查,但是我想继续开发依赖于 feature_branch
的其他特性。因此,当 feature_branch
在审查中时..。
git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit
现在我做一些更改以响应 Feature _ Branch 上的代码审查
git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch
这就是我们有问题的地方。我们在 master 上有一个 squash 策略,这意味着合并到 master 中的特性分支必须被压缩到一个单独的提交中。
git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i first_hash_of_branch # Squash feature_branch into a single commit
git merge master
一切都很酷,除了 dependent_branch
。当我尝试将依赖分支重新基于 master 或尝试将 master 合并到其中时,git 会被重写/压缩的历史记录弄糊涂,并且基本上将 depedendent_branch
中的每一个更改都标记为冲突。这是一个 PITA,通过和基本上重做或非冲突化的 dependent_branch
的所有变化。有什么解决办法吗?有时候,我会手动创建一个补丁,然后在一个新的 master 分支上应用它,但是如果与之有任何真正的冲突,那么修复起来就更糟糕了。
git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.
有什么想法吗?我知道这是因为壁球比赛期间重写了历史,但这是我不能改变的要求。最好的解决办法是什么?我能施魔法吗?还是有更快的方法来完成手动创建 diff 所涉及的所有步骤?