注意:本例中使用Gerrit进行演示。

  1. 暂存目前修改的代码
    git stash
    git stash list # 可以验证暂存是否成功
  2. 查找到需要指定的commit的编号;
    git log
    rebase
  3. 找到git rebase编号,即要修改的commit之前那个commit
    git rebase --interactive a6f372877d26xxx0690aedf6dc6b6e7c
    rebase
  4. 找到要更改的commit, 将行首的pick更改为edit, 保存退出;
    pick2edit
  5. 本地修改需要修改的代码

  6. 恢复暂存的修改

    git stash pop 

    注意:如果此时有冲突,需要自己手动解决冲突

  7. 解决冲突后,添加修改文件
    git add xxx    # 文件名称
    git commit --amend
  8. 回退到当前状态;
    git rebase --continue
    pick2edit
    注意:如果rebase版本较多,可能需要多次重复上述步骤,且每rebase一步,可能都要解决与其他组员commit的冲突;
  9. rebase 到 master 之后,push 当前版本到远程
    git push origin 0d163929c240xxx745b520d07b854c207 ① :refs/changes/8xxx4 ②
    ①:此处为你自己需要amendcommit版本号;
    ②:此处为远端你的change的编号,如果远端版本已经closed则无法进行amend,只能 git reset
    如果上游提交已经合并并关闭,则参考此处gerrit - Git push remote rejected {change ### closed} - Stack Overflow
    需要将之前 rebase 的 commit 信息中的 change-Id 删除,让 Gerrit 重新生成 change-Id ,之后可以继续提交。

到这里以后,git status 后会看到,提示让你git pull一下,千万不要这样做!否则你会发现这三条白合并了,还平白多了两条 commit

这时候,需要强制 push 上去git push -f,当然要确保强制 push 不会覆盖了别人的代码,如果这个分支只有你维护那就可以为所欲为了

到此,合并多个远程分支成功~

总结

git非常智能化,每一次操作应该根据提示进行问题分析、逐步操作则可顺利达到预期效果。