如何在Git中创建补丁而不提交?

52

我在网上做了一些搜索。我知道你可以在提交后使用“format-patch”,但我的情况有点不同。

我想创建一个补丁,类似于 SVN 中的“dpk”,这样我就可以将它发送出去进行代码审查,但我还不想提交它。

我如何在 Git 中实现这一目标?


6
像 Git 这样的分布式版本控制系统的一个重要特点是,没有任何理由可以避免提交某些内容。 - Michael Borgwardt
2
没有人回答这个问题。 他没有问关于提交的任何问题...他问如何生成可以分发给其他用户的补丁。 - Stephen
你不喜欢 @RayLuo 的答案有什么原因吗?如果您想在提交后生成差异,则可能需要编辑标题;我肯定期望得到不同的被接受的答案。 - ruffin
5个回答

145

当其他人已经给出符合Git惯例的答案时,对于OP的问题“创建一个补丁而不提交”,也可以通过以下方式解决:

git diff > my_patch.txt

稍后你可以通过以下方式应用此补丁,而无需进行提交:

git apply my_patch.txt

但是,如果你只是在本地工作,使用git checkout another_branch -m就足以将所有当前未提交的更改带到另一个分支,甚至不需要打补丁和应用。


2
如果您想要移除这个应用的补丁,请使用以下命令: git apply -R my_patch.txt - Sourabh
4
这样我们就不会包括新的/未跟踪的文件!如果需要包括新文件,您应该将所有文件添加到索引中(git add),然后运行命令 $ git diff --cached > my_patch.txt。 - dxvargas
6
这也不包括分阶段的文件。你需要运行 git diff --staged > my_patch.txt 来包含它们。 - Vadim Kotov
@alper,patch并不是魔法。如果您尝试将补丁应用于某些显着不同的代码,则自动合并可能会失败。即使在尝试合并两个非常不同的git分支时,也经常发生这种情况。您需要手动解决这个问题。 - RayLuo

12

在不进行最后提交的情况下生成补丁的一般步骤:

  1. 使用命令

git commit -a -m "specific message"

注意:不要推送此提交。

  • 生成补丁

  • git format-patch -s -n -1 HEAD   
    

    它将生成0001-.patch

  • 撤销本地提交

    git reset --soft HEAD~1
    

    删除提交记录但保留您的工作

    git reset --hard HEAD~1
    

    删除您的工作提交


  • 8

    在Git中进行提交是一项廉价且完全本地的操作,因此只要您不将其推送到任何地方,就没有理由避免提交。

    只需创建一个新的本地分支并在其中提交更改。如果您不再需要该分支,则始终可以稍后删除该分支;或者,您可以保留该分支并将其用于正在进行的任何工作,然后在准备好时将其合并(或变基)到主分支中。这是使用Git时应该采用的良好工作流程。

    $ git checkout -b feature-foo  # create and switch to new branch feature-foo
    $ git commit
    
    # do whatever you need to do
    
    $ git checkout master          # switch back to the master branch
    $ git merge feature-foo        # merge your change into master (optional)
    $ git branch -d feature-foo    # delete the branch
    

    17
    不太有用。有时候我想在提交之前查看本地更改,以便我可以捕捉到我没有意图提交的东西。 - Stephen
    6
    你可以使用 git diff 进行比较。 - bfontaine
    3
    @Stephen git add --patch - sigod

    7

    就像@hammar所说,提交代码很便捷,你可以用git reset等命令撤销提交。

    你也可以将更改暂存,然后执行以下操作:

    git stash show -p
    

    1
    在 Git 中,对本地存储库进行的提交并不是“绑定”的。你可以提交更改,创建一个补丁,然后在分支上进行软重置以回到之前的提交状态,就像你的提交从未发生过一样。
    话虽如此,其实你没有必要在创建补丁后重置你的分支。你可以将提交保留在存储库中,在代码审查完成前避免推送它。如果你需要回到原始提交并进行更改,那时你还有其他的选择。
    另外,像 hammar 建议的创建一个分支来提交更改可以更容易地回去并进行修改,而不必在推送之前在主分支上进行任何繁琐的变基操作。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接