Published on

Git提交被撤销, 再次提交新变动无法应用 | git - merge - revert - merge | git format-patch

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

问题现象(What Happened)

  1. master 合并了一个分支(比如 feature),提交进来了
  2. 后来使用 git revert 把那次合并的内容“撤销”了
  3. 再后来想再次引入 feature 的代码,再次merge 或者 cherry-pick 重新挑选提交,结果 Git 显示 cherry-pick 成功,但 没有任何变动

问题原因(Why It Happened)

  • Git 会认为这个提交 已经应用过,即使后来被 revert
  • revert 并不会**“删除”**原始提交,而是追加一个反向操作

解决方案(How to Fix It)

  1. (推荐)如果feature没有添加新的提交, 使用revert可追踪所有变更, 原始提交信息完整

    git revert <revert-commit-sha>
    
  2. 如果有新的提交, 先撤销已撤销的提交, 再提交新的合并

  3. format-patch + apply 精准还原控制

    git format-patch -1 <commit-sha>
    git apply 0001-xxx.patch
    git commit -am "Re-apply feature with patch"
    
  4. (不推荐)git checkout feature -- . 临时用, 会创建新的commit, 没有保留历史

    1. checkout --会将feature分支的所有文件(也可修改.来指定特定文件)复制到当前分支
    2. 相当于在当前分支产生新的提交