git am 和 git apply 有啥区别?

Posted

技术标签:

【中文标题】git am 和 git apply 有啥区别?【英文标题】:What is the difference between git am and git apply?git am 和 git apply 有什么区别? 【发布时间】:2012-08-27 17:39:53 【问题描述】:

git amgit apply 都可用于应用补丁。我看不出有什么区别。我现在看到了不同之处:git am 自动提交,而 git apply 只涉及文件但不创建提交。这是唯一的区别吗?

【问题讨论】:

am 可以认为是Apply Mail的缩写... 【参考方案1】:

输入和输出都不一样:

git apply 获取一个补丁(例如git diff 的输出)并将其应用到工作目录(或索引,如果使用了--index--cached)。 git am 采用格式为电子邮件的提交邮箱(例如 git format-patch 的输出)并将它们应用于当前分支。

git am uses git apply behind the scenes,但在之前(读取Maildirmbox,并解析电子邮件)和之后(创建提交)做了更多的工作。

【讨论】:

注意:git apply 似乎也接受git format-patch 输出。 git apply 也适用于来自git format-patch 的输出,但更改将是非暂存的,需要提交(因此在它们应用到的索引中创建不同的提交点)。使用git am,您会将提交信息(连同作者等)携带到它所应用的索引中。 git apply 然后用于修补您的回购(不好),git am 可以进行合法的功能更改并将其包含到您的回购中(首选方法)。【参考方案2】:

git apply 用于应用直接差异(例如来自git diff),而git am 用于应用来自电子邮件的补丁和补丁序列,无论是 mbox 还是 Maildir 格式,并且是 git format-patch 的“相反”。 git am 尝试从电子邮件中提取提交消息和作者详细信息,这就是它可以进行提交的原因。

【讨论】:

【参考方案3】:

使用git am,您可以应用补丁,因此当您运行git status 时,您不会看到任何本地更改,但git log 将显示补丁已提交到源代码。

但是使用git apply,您在源文件中进行更改就像您自己编写代码一样,因此git statusgit diff 将输出您应用的补丁中出现的更改。因此,使用git apply,您可以修复/添加更多更改并将git add 它们一起作为一个新补丁。

【讨论】:

以上是关于git am 和 git apply 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

不能将 `git mergetool` 与 `git am` 或 `git apply` 或 `patch` 一起使用

git命令之git stash apply和 pop 的区别

git am PATCH_FILE_NAME自动打patch失败后的操作方法

git reset 和 git revert 有啥区别?

“git shell”和“git”有啥区别

git与gitlab的区别 git与gitlab有啥区别