如何删除应用的 git 补丁?

我有一个 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>>

以上并不适合我所有的时间。

90267 次浏览

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 将只是做相反的补丁。

在视窗上

我在 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"
}

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

此外,另一个很好的提示是,git apply采用了一个 -v参数,这个参数提供了一些详细信息,因此您可以看到它首先检查应用补丁之前是否安全。