git merge覆盖当前分支
有这么一种场景,我们需要merge某个feature分支到master分支,且希望合并后master分支与feature分支的内容完全一致。
当feature分支与master分支没有分叉时,直接merge即可,默认执行fast-forward后两个分支指向同一个commitid。而当feature分支与master分支存在分叉时,git没有对应的命令或参数来完成目标。
查看git merge可以通过-s 参数指定合并的策略,其中有个ours 策略,合并其他分支的同时可以保持合并后的内容与当前分支一致。这个策略与我们的目标完全相反。但是git merge并没有提供theirs 策略。
相似的是,在recursive 合并策略中,可以通过-X 参数指定遇到合并冲突时的解决方式,其选项可以为ours 或者theirs ,即冲突时使用当前分支的版本或者合并分支的版本。但是我们并不能通过recursive 策略配合-X theirs 来实现我们的目的,因为-X 仅在遇到冲突时起作用。如果master分支上的某个commit与feature分支没有冲突,那么合并后该commit会保留下来,而这是feature分支不需要的。
目前而言,我们只能使用一些迂回操作来实现类似theirs 策略。
- 先在master上创建一个正确的merge commit,commit的内容不重要,因为可以后续通过amend修改。
- 再为master构造一个与branchA一致的index,使得提交后的状态与branchA一致。
- 要得到branchA的index,首先要hard reset到branchA。但是hard reset会丢失master的commit,所以通过创建
临时分支以保存master的提交记录。 - master reset到branchA后,再soft rest到刚刚创建的临时分支。soft rest保留了branchA的index,而commit
回到了之前的master。 - amend commit 把branchA的index提交。
具体操作:
git merge -s ours branchA 使用ours 策略合并,产生一个merge记录,但是没有branchA的内容。git branch branchTemp 创建临时分支branchTemp,保存刚刚合并的结果。git reset --hard branchA 将master分支reset到branchA的状态。git reset --soft branchTemp 将master分支reset到临时分支branchTemp的状态,此时工作目录和index为branchA的状态。git commit --amend 提交工作目录的内容,此时步骤1的合并branchA记录就完成了ours 到theirs 的转变。git branch -D branchTemp 删除临时分支,git diff HEAD branchA 验证分支内容,。
|