【问题标题】:How can I apply a patch I got from email but one change at a time?如何应用从电子邮件中获得的补丁,但一次更改一个?
【发布时间】:2021-07-12 11:10:11
【问题描述】:

我有一个补丁文件。我当然可以使用git am 应用补丁(尽管由于某种原因它在非常简单的更改上无法成功完成)

但是,我现在要做的是选择要应用的补丁中的哪些更改以及我想一一跳过的更改。我该怎么做?

【问题讨论】:

    标签: git patch


    【解决方案1】:

    如果您想要退出的更改不多,那么您可以先应用路径,然后回滚您不想保留的那些更改。之后,您可以修改应用的提交以重写它以包括您的撤销。

    这可能看起来像这样:

    # Apply patch
    $ git am <some-file>
    
    # Use interactive checkout to undo particular changes from the applied patch
    # (Note that you will have to apply those hunks that _undo_ the undesired changes)
    $ git checkout -p HEAD~1
    
    # Add those reverting changes to the index
    $ git add -u
    
    # Amend the applied commit to incorporate your reversals
    $ git commit --amend
    

    您当然也可以手动撤消这些更改,而不是使用git checkout -p。对于较大的更改集,如果您只想撤消很少的事情,这可能会更容易。

    或者,您也可以使用不提交更改的git apply 应用补丁,因此您可以先查看更改并取消暂存不需要的更改。请注意,这不会重用原始补丁中的提交消息和作者信息,因此您必须重写它(并且提交将归因于您自己而不是原始作者)。

    【讨论】:

    • 我做了最后一个选项,但现在我有一堆未提交的文件,即使没有提交,仍然会创建。如何消除它们?
    • 如果它们被 Git 跟踪(即有待处理的更改),那么您可以使用git checkout -- . 撤消这些更改,或者如果您想(再次)决定每次更改,也可以使用git checkout -p。如果这些是 Git 还不知道的新文件,你将不得不从你的工作目录中手动删除它们。
    • 谢谢。那么对于这些​​新文件,git checkout -- 不起作用,是吗?
    • 很遗憾,git checkout 只签出 Git 已知的文件,覆盖工作目录中的当前状态。未跟踪的文件不受影响。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多