【发布时间】:2012-08-27 17:39:53
【问题描述】:
git am 和 git apply 都可用于应用补丁。我看不出有什么区别。我现在看到了不同之处:git am 自动提交,而 git apply 只涉及文件但不创建提交。这是唯一的区别吗?
【问题讨论】:
-
am可以认为是Apply Mail的缩写...
git am 和 git apply 都可用于应用补丁。我看不出有什么区别。我现在看到了不同之处:git am 自动提交,而 git apply 只涉及文件但不创建提交。这是唯一的区别吗?
【问题讨论】:
am 可以认为是Apply Mail的缩写...
输入和输出都不一样:
git apply 获取一个补丁(例如git diff 的输出)并将其应用到工作目录(或索引,如果使用了--index 或--cached)。git am 采用格式为电子邮件的提交邮箱(例如 git format-patch 的输出)并将它们应用于当前分支。git am uses git apply behind the scenes,但在之前(读取Maildir 或mbox,并解析电子邮件)和之后(创建提交)做了更多的工作。
【讨论】:
git apply 似乎也接受git format-patch 输出。
git apply 也适用于来自git format-patch 的输出,但更改将是非暂存的,需要提交(因此在它们应用到的索引中创建不同的提交点)。使用git am,您会将提交信息(连同作者等)携带到它所应用的索引中。 git apply 然后用于修补您的回购(不好),git am 可以进行合法的功能更改并将其包含到您的回购中(首选方法)。
git apply 用于应用直接差异(例如来自git diff),而git am 用于应用来自电子邮件的补丁和补丁序列,无论是 mbox 还是 Maildir 格式,并且是 git format-patch 的“相反”。 git am 尝试从电子邮件中提取提交消息和作者详细信息,这就是它可以进行提交的原因。
【讨论】:
使用git am,您可以应用补丁,因此当您运行git status 时,您不会看到任何本地更改,但git log 将显示补丁已提交到源代码。
但是使用git apply,您在源文件中进行更改就像您自己编写代码一样,因此git status 和git diff 将输出您应用的补丁中出现的更改。因此,使用git apply,您可以修复/添加更多更改并将git add 它们一起作为一个新补丁。
【讨论】: