我可以从git diff获得补丁兼容的输出吗?
我做错了一件很简单的事。我正在准备一个普通的补丁文件,以便重新应用一些更改:我可以从git diff获得补丁兼容的输出吗?,git,Git,我做错了一件很简单的事。我正在准备一个普通的补丁文件,以便重新应用一些更改: $ git diff > before $ git diff something_here > save.patch $ git checkout . $ patch < save.patch $ git diff > after $ diff before after $ 如果你想使用补丁,你需要删除git默认使用的a/b/前缀。您可以使用--no prefix选项执行此操作(也可以使用修
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
如果你想使用补丁,你需要删除git默认使用的
a/
b/
前缀。您可以使用--no prefix
选项执行此操作(也可以使用修补程序的-p
选项执行此操作):
git diff在文件路径前面有一个额外的路径段。您可以通过指定-p1和patch来剥离路径中的该条目,如下所示:
patch -p1 < save.patch
patch-p1
只需使用-p1
:在--无前缀
的情况下,您需要使用-p0
,因此您可以省去--无前缀
而使用-p1
:
$ git diff > save.patch
$ patch -p1 < save.patch
$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch
$git diff>save.patch
$patch-p1save.patch
$patch-p0
避免创建临时修补程序文件的有用技巧:
git diff | patch -p1 -d [dst-dir]
save.patch
文件传输到任何位置(包括二进制文件)$git diff--binary--staged HEAD>save.patch
$git重置--硬
$
$git apply save.patch
你有什么理由特别想使用patch
而不是git-apply
?即使如此,你真的需要补丁而不是像git-stash
或其他git工具吗?编辑后,我认为git-stash
是最简单的解决方案,但是有很多方法是有效的。@Malvolio:的确是的,你甚至不需要想一个临时文件名来存储你的补丁。@Charlse,有时候你需要向没有整个git存储库的人发送补丁。例如,如果使用git svn
。哈哈哈。真有趣。我差不多四年前问过这个问题,我一直在做这个问题的方式也在演变,但如果你昨天问我怎么做,我会给出你的答案,并说我是从这个问题的答案中得到的。(实际上,我可能会使用一个裸的git diff>save.patch
和git checkout.
而不是重置,但是是的……哦,我没有注意到它已经有4年了:P.顺便说一句,重置只是为了证明它是有效的。我也没有看到任何人使用git apply
或使diff与您的状态和指向上次提交的指针相关。)可用。只做git diff
根本没有做任何事情是的,现在我想知道我是如何发现git apply
的。关于git diff
的事情是(我想)使用git reset
——回购、索引和工作区之间的关系是问题所在。git diff--no prefix master>diff.patch
,然后使用git checkout master
patch-p0
@Natim,为了最终的安全性,我建议使用patch--dry run
发出最后一个命令@ᴠɪɴᴄᴇɴᴛ 这样做的好处是什么?因为我们使用git,所以我们不太可能丢失任何东西,不是吗?@Natim,正如我所说的,为了终极安全,在发生错误时不需要撤销任何东西。我还想到了一些人,他们读了这篇文章,想在git之外使用补丁
(可能使用由diff
生成的补丁文件)为了在补丁中包含新文件,还需要包含“git diff--no prefix--cached”在补丁中。也许有更好的方法吗?如果你想知道为什么,可以很好地总结一下-。这对重命名不起作用;git diff
输出一行patch
忽略的代码。git apply
是一种方法。这正是我想要的。也可以完美地处理隐藏内容!git stash show-p stash@{3}patch-p1-d[dst dir]
patch -p1 < save.patch
$ git diff > save.patch
$ patch -p1 < save.patch
$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch
git diff | patch -p1 -d [dst-dir]
$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch