我可以从 git-diff 获得补丁兼容的输出吗?

问题描述 投票:0回答:5

我正在做一些非常简单的错误。 我正在尝试准备一个普通的补丁文件,这样我就可以重新应用一些更改:

$ git diff > before
$ git diff something_here > save.patch
$ git checkout . 
$ patch < save.patch
$ git diff > after
$ diff before after
$

使用

something_here
blank 几乎可以工作,但文件名不正确。 我想我只是缺少一些选择。

在现实生活中,我将在结账后进行合并,因此补丁可能会失败,但你明白我的意思了。

编辑 我的错是问了错误的问题。 实际的问题是,我想保存更改,进行合并,然后重新应用更改(如果可能的话)? 我问错了,因为我习惯使用补丁来解决这类问题,

git diff
看起来这就是它想要我做的。

查尔斯贝利的评论有正确的答案。 对我来说,git-apply 是正确的做法(git-stash 看起来比我需要的更重量级,并且 rebase 和捆绑包绝对超出了我当前的技能水平。)我将接受 Charles 给出的答案(因为你无法接受评论)。 谢谢大家的建议。

编辑,6年后 熟悉该主题的人都知道,我高估了

git stash
的难度。 几乎每天左右,我都会使用以下顺序:

$ git stash
$ git merge
$ git stash pop

编辑,再过五年我基本上已经放弃了

git apply
,甚至不怎么使用
git stash
git rebase
FTW。

git
5个回答
266
投票

只需使用

-p1
:无论如何,您都需要在
-p0
的情况下使用
--no-prefix
,因此您可以省略
--no-prefix
并使用
-p1

$ git diff > save.patch
$ patch -p1 < save.patch

$ git diff --no-prefix > save.patch
$ patch -p0 < save.patch

157
投票

如果你想使用补丁,你需要删除 git 默认使用的

a/
b/
前缀。您可以使用
--no-prefix
选项来执行此操作(您也可以使用补丁的
-p
选项来执行此操作):

git diff --no-prefix [<other git-diff arguments>]

通常情况下,直接使用

git diff
然后使用输出馈送到
git apply
会更容易。

大多数时候我尽量避免使用文本补丁。通常,一个或多个临时提交与 rebase、

git stash
和捆绑包相结合更容易管理。

对于您的用例,我认为

stash
最合适。

# save uncommitted changes
git stash

# do a merge or some other operation
git merge some-branch

# re-apply changes, removing stash if successful
# (you may be asked to resolve conflicts).
git stash pop

16
投票

git diff 在文件路径前面添加了一个额外的路径段。您可以通过指定 -p1 和 patch 来删除路径中的此条目,如下所示:

patch -p1 < save.patch

12
投票
  1. 我保存当前目录(包括未提交的文件)与当前 HEAD 的差异。
  2. 然后您可以将
    save.patch
    文件传输到任何地方(包括二进制文件)。
  3. 在目标计算机上,使用
    git apply <file>
  4. 应用补丁

注意:它也与当前暂存的文件不同。

$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch

9
投票

避免创建临时补丁文件的有用技巧:

git diff | patch -p1 -d [dst-dir]
© www.soinside.com 2019 - 2024. All rights reserved.