如何删除应用的git补丁?

时间:2015-12-21 17:05:00

标签: git github

我有一个git repo,我们在测试环境中应用了很多补丁。

git apply --stat --check --ignore-whitespace /home/kent/Desktop/patches/test.patch --exclude .gitignore

git am -s --ignore-whitespace /home/kent/Desktop/patches/test.patch --exclude .gitignore --exclude .gitignore

如果我必须删除补丁并应用新补丁,目前我克隆实时内容并重新应用所有测试补丁并再次推送。 这个过程有点麻烦,有时也会导致错误我也会错过一两个补丁。

我想知道是否有办法删除补丁并应用新补丁

另外,如果我们每次都提交补丁然后我可以使用:

,那么添加一种方法就是这样
git revert <<commit id>>

上述内容对我来说无效。

2 个答案:

答案 0 :(得分:55)

TL; DR

您可以使用以下内容恢复修补程序:

$ git apply -R <patch>

您可以通过以下方式之一生成补丁:

这将从diff

生成补丁
$ git diff --patch > 0001-some-modifications.patch

如果您想仅为HEAD提交生成补丁:

$ git show --patch HEAD^ > 0001-some-modifications.patch

您可以从HEAD:

为之前的 3 提交生成补丁
$ git show --patch HEAD~3 > 0001-some-modifications.patch

您可以通过以下方式应用补丁:

$ git apply -- 0001-some-modifications.patch

您可以使用以下内容恢复修补程序:

$ git apply -R <patch>

生成补丁时,它只是一个带元数据的差异;文件,行号添加/删除;以下内容:

commit 9dad147cbf16befecdef2e812c1249499bdef5ac
Author: My Name <email@example.org>
Date:   Mon Dec 21 20:46:01 2015 +0000

    Example commit message.

diff --git a/src/example.md b/src/example.md
new file mode 100644
index 0000000..ab73512
--- /dev/null
+++ b/src/example.md
@@ -0,0 +1,3 @@
+# Example document
+
+ Hello World

因此,当您使用git apply时,您基本上会对树进行编辑。

然后当你运行git apply -R git时,只需执行与补丁相反的操作。

答案 1 :(得分:1)

在Windows上

我在Windows上使用git,它的工作方式与Linux上有所不同。具体来说,我发现当我跑步时:

git apply -R C:\downloads\mypatch.patch

这可能在错误的目录中运行。我必须将其复制到应用补丁的本地目录中。我也有类似的错误:

error: product/build.gradle: No such file or directory
error: main/generator/generator.js: No such file or directory

这太奇怪了,因为这些文件位于我的补丁程序内部指定的目录中。我可以找到的唯一解决方法是手动修改补丁。我必须更改文件名以将./放在目录和文件名的前面。所以我转了这个:

Index: build_scripts/product/build.gradle
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- build_scripts/product/build.gradle  (revision 537fbcc1ebdf65652896eaaf2a315cc44a24ba6c)
+++ build_scripts/product/build.gradle  (date 1594123740523)
@@ -304,7 +304,7 @@
       from("$repoRootDir/src/main/nodejs/utils/") {
         include "common_*.js"
       }

对此:

Index: ./build_scripts/product/build.gradle
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- ./build_scripts/product/build.gradle    (revision 537fbcc1ebdf65652896eaaf2a315cc44a24ba6c)
+++ ./build_scripts/product/build.gradle    (date 1594123740523)
@@ -304,7 +304,7 @@
       from("$repoRootDir/src/main/nodejs/utils/") {
         include "common_*.js"
       }

唯一的变化是在三个不同的./字符串之前的build_scripts/product/build.gradle

另外,另一个不错的提示是git apply带有一个-v参数,该参数给出了更多的详细信息,因此您可以看到,它是在应用补丁程序之前先检查补丁程序是否安全。