我可以从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 apply应用补丁程序
  • 注意:它也与当前暂存的文件不同

    $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