git am和git apply之间有什么区别?

206

无论是使用git am还是git apply都可以应用补丁。

似乎git am会自动提交,而git apply只是修改文件但不会创建提交。这是唯一的区别吗?


18
“am” 可以被看作是“Apply Mail”的缩写… - Philip Oakley
3个回答

230
输入和输出都是不同的:
- `git apply` 接受一个补丁(例如 `git diff` 的输出)并将其应用到工作目录(如果使用了 `--index` 或 `--cached`,则应用到索引)。 - `git am` 接受一个格式为电子邮件消息的提交邮箱(例如 `git format-patch` 的输出)并将其应用到当前分支。 `git am` 在幕后使用 `git apply`,但在之前(读取 `Maildir` 或 `mbox`,解析电子邮件消息)和之后(创建提交)执行更多的工作。

11
注意:git apply 似乎也可以接受 git format-patch 的输出。 - Ciro Santilli OurBigBook.com
23
git apply 也可以用于 git format-patch 的输出,但更改将不会被暂存需要进行提交(因此在应用到索引中时会创建一个不同的提交点)。使用 git am 在将更改应用到索引时,将包含提交信息(以及作者等)。 因此,git apply 适用于修补您的仓库(不好),而 git am 可以将合法的功能更改整合到您的仓库中(首选方法)。 - Prasoon Joshi
如果我使用GITK查看我的树并从上下文菜单中创建一个补丁,那么我通常会想要哪个选项?我无法想象如果没有提交信息来创建提交,git am 会工作得很好,所以我猜测我需要的是 git apply。…<br> …我猜,出于一般谨慎和因为受到限制(我对这个网站的信任现在有点低,如果他们不理解AI答案的问题),我应该访问http://www.tryitands.ee。 - Twisted on STRIKE at1687989253
如果我使用GITK查看我的树并从上下文菜单中创建一个补丁,那么我通常会想要哪个选项?我无法想象如果没有提交信息来创建提交,git am会工作得很好,所以我猜我想要的是git apply。…<br> …我猜,出于一般谨慎的考虑和因为受到限制(我对这个网站的信任现在有点低,如果他们不理解AI答案的问题),我应该访问http://www.tryitands.ee - undefined
看起来git apply是在我上面描述的情况下使用的命令。如果我从GITK中的一系列命令创建补丁,我会假设同样适用吗?但是我现在不需要知道,所以我不打算尝试并查看。请随意自行尝试! - Twisted on STRIKE at1687989253
看起来git apply是在我上面描述的情况下使用的命令。如果我从GITK中的一系列命令创建补丁,我会假设同样的方法也适用。但是我现在不需要知道,所以我不会尝试并查看。请随意自行尝试! - undefined

28

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


22
使用git am命令可以应用补丁,因此在运行git status时不会看到任何本地更改,但是git log将显示补丁已提交到源代码中。
但是使用git apply命令会像您自己编写代码一样对源文件进行更改,因此git statusgit diff将输出补丁中出现的更改。因此,使用git apply命令可以修复/添加更多更改,并将它们一起git add作为单个新补丁。

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