如何在多次提交中撤消与模式匹配的更改?

时间:2017-01-13 23:12:53

标签: git

我正在开发一个项目,其中大量代码从C转换为C ++。在转换过程中,多个提交中删除了export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" export CUDA_HOME="/usr/local/cuda" 关键字的多个实例。

现在,我想撤消restrict关键字的所有删除,但问题是负责删除的提交也引入了一些有用的更改。有没有办法创建一个补丁,只会删除restrict关键字的删除(在整个历史记录中),但没有别的?

1 个答案:

答案 0 :(得分:1)

  1. 查找尚未删除<id>的最新提交restrict

  2. 从最新的提交,到C ++的端口完成,运行

    $ git checkout -p <id>
    

    将以交互方式提示您反向应用各个更改。

  3. 输入restrict拒绝与n无关的所有帅哥,输入restrict接受与y相关的所有帅哥。如果您很勇敢且有必要,请输入e进入大块编辑模式。您应该可以使用restrict直接跳转到包含/的黑客。

  4. 如有必要,请在事后进行手动清理。

  5. 根据分阶段更改创建新提交,希望根据需要恢复restrict的所有出现。

  6. 如果这变得过于繁琐,您可以使用q中止交互式部分,并创建一个包含目前为止完成的工作的提交。您可以随时将它们压缩为单个,干净的提交。

    替代方法

    假装永远不会删除restrict个关键字:

    1. 与上述相同

    2. 从最新的提交中,创建一个新分支(为了不丢失原始分支),并将端口重新绑定到C ++:

      $ git checkout -b restore-restrict
      $ git rebase -i <id>
      
    3. 使用restrict标记删除了edit个关键字的所有提交。

    4. 对于要编辑的每个提交,请通过手动编辑文件或restrict恢复git checkout -p HEAD^(类似于第一种方法,仅适用于单独提交)。然后,

      $ git commit --amend
      $ git rebase --continue