我正在做一些非常简单的错误.我正在尝试准备一个普通的补丁文件,所以我可以重新应用一些更改:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Run Code Online (Sandbox Code Playgroud)
与something_here 空白几乎工作,但文件名是不正确的.我想我只是缺少一些选择.
在现实生活中,我会在结账后进行合并,因此补丁可能会在那里失败,但你会看到我得到的东西.
编辑
我的错在这里提出错误的问题.实际的问题是,我想保存我的更改,进行合并,然后重新应用更改,如果可能的话?我问错了方法,因为我习惯使用补丁来解决这些问题,git diff看起来就像是我想要的那样.
Charles Bailey的评论得到了正确答案.对我来说,git-apply是正确的事情(git-stash看起来比我需要的更重,并且变调和捆绑肯定超出了我目前的技能水平.)我将接受Charles给出的答案(因为你不能接受评论).感谢所有的建议.
编辑,6年后
任何熟悉该主题的人都知道,我高估了难度git stash.几乎每天都有,我将使用以下顺序:
$ git stash
$ git merge
$ git stash pop
Run Code Online (Sandbox Code Playgroud)
ndi*_*dim 215
只需使用-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
Run Code Online (Sandbox Code Playgroud)
CB *_*ley 132
如果你想使用补丁,你需要删除a/ b/git默认使用的前缀.您可以使用该--no-prefix选项执行此操作(您也可以使用patch的-p选项执行此操作):
git diff --no-prefix [<other git-diff arguments>]
Run Code Online (Sandbox Code Playgroud)
通常,直接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
Run Code Online (Sandbox Code Playgroud)
Hen*_*son 17
git diffs在文件路径之前有一个额外的路径段.您可以通过使用patch指定-p1来删除路径中的此条目,如下所示:
patch -p1 < save.patch
Run Code Online (Sandbox Code Playgroud)
save.patch文件传输到任何位置(包括二进制文件).git apply <file>注意:它也是当前暂存的文件.
$ git diff --binary --staged HEAD > save.patch
$ git reset --hard
$ <transport it>
$ git apply save.patch
Run Code Online (Sandbox Code Playgroud)