如何重新执行已回退的git merge,解决合并提示已为最新的问题
你此前已经执行过git merge dev,git默认判定dev的全部提交已经合入feature-1,即使你后续在feature-1上修改了合并结果、误操作了文件,git也不会重复合入dev上的相同提交,才会提示Already up to date。如果你此时直接把错误状态的feature-1合并到dev,确实会把误删新文件、恢复旧文件的错误改动同步到dev。
你之前执行的git revert -m 1只是生成了一个反向提交抹除合并的内容改动,并没有移除两个分支的合并关联,所以还是无法重新合并dev。后续pull丢失改动是因为远端已经存了你之前推送的错误合并记录,git pull默认会把远端的错误内容再合入你本地修复后的分支,和rebase操作无关。
按照你的需求,完全忽略旧的合并关联,把dev的最新提交重放到feature-1上手动解决冲突,操作如下:
- 先备份当前feature-1的状态,避免操作失误丢失内容:
git checkout feature-1 git branch feature-1-backup
- 找到你最开始从dev切出feature-1时的基准提交哈希(可以通过
git log查找),记为<base-commit>,执行强制rebase操作:
git rebase --onto dev <base-commit> feature-1
这个操作会把你从切出分支后,所有在feature-1上做的提交,逐个重放到最新的dev分支顶端,过程中遇到冲突会暂停,你可以手动解决所有冲突后执行git rebase --continue继续推进,直到重放完成。操作完成后feature-1就是最新dev代码加你的功能开发内容的正确状态,没有冗余的错误合并、revert提交,历史记录也会是清晰的线性结构。
你看到的分支分叉提示是因为本地分支经过调整后和远端存储的旧错误分支记录不一致,不需要执行git pull合并远端的错误内容,确认本地分支状态正确后,执行以下命令强制覆盖远端的feature-1分支即可:
git push --force-with-lease origin feature-1
注意:这个操作会覆盖远端的feature-1分支,操作前确认没有其他同事正在同时向这个分支提交内容。
内容的提问来源于stack exchange,提问作者Wassadamo

