使用git send-email发送补丁后,如何提取并合并邮箱中的补丁?
解决Git补丁邮件无法提取合并的问题
我来帮你搞定这个问题,分三步走:先处理现有纯文本邮件里的补丁提取合并,再教你正确发送能被Git直接识别的补丁,最后说下对方怎么简便合并。
一、从现有纯文本邮件中提取并合并补丁
邮件里的纯文本其实已经包含了完整补丁内容,只是混在了邮件正文里,你可以这样提取:
- 打开收到的邮件,找到正文里从
diff --git开头到结尾的补丁片段,把这段完整复制下来(注意跳过邮件头、签名、问候语这些无关内容) - 在本地新建一个文件,比如
my-fix.patch,把复制的补丁内容粘贴进去并保存 - 切换到你的Git仓库目录,先测试补丁能否正常应用:
如果没有报错,说明补丁没问题,接着用下面的命令合并:git apply --check my-fix.patch# 方式1:直接应用补丁,之后需要手动提交 git apply my-fix.patch git add . git commit -m "Apply patch from email" # 方式2:用git am直接生成对应提交(推荐,会保留原补丁的提交信息) git am my-fix.patch
二、正确发送可被Git识别的补丁
你之前发送后变成纯文本,大概率是补丁格式或发送配置的问题,按下面的步骤操作就能让对方直接用Git命令合并:
1. 用Git规范生成补丁文件
先确保你的补丁是通过git format-patch生成的,这是Git官方推荐的格式,自带邮件兼容的头信息:
# 生成最近1次提交的补丁文件 git format-patch -1 # 生成最近N次提交的补丁,会生成N个独立的.patch文件 git format-patch -N
生成的补丁文件会包含[PATCH]前缀的主题、提交作者、提交信息等,Git工具能直接识别。
2. 配置Git Send-Email(以Gmail为例)
如果是第一次用git send-email,需要先配置SMTP信息(Gmail需要开启两步验证并创建应用密码):
git config --global sendemail.smtpServer smtp.gmail.com git config --global sendemail.smtpServerPort 587 git config --global sendemail.smtpUser "your-gmail-account@gmail.com" git config --global sendemail.smtpPass "your-app-password" git config --global sendemail.confirm always git config --global sendemail.smtpEncryption tls
3. 发送补丁
直接用git send-email发送生成的.patch文件,默认会把补丁内容作为带规范格式的邮件正文发送,对方可以直接用git am处理:
git send-email --to a1105773737@gmail.com ~/patches/*.patch
如果还是担心变成纯文本,可以强制将补丁作为附件发送:
git send-email --attach --to a1105773737@gmail.com ~/patches/*.patch
三、对方合并补丁的简便方法
如果按上面的规范发送,对方只需要:
- 如果补丁在邮件正文:把邮件保存为
.eml文件,然后在仓库执行git am path/to/your-email.eml,Git会自动提取补丁并创建对应的提交 - 如果补丁是附件:下载
.patch附件,执行git am downloaded-patch.patch即可完成合并
内容的提问来源于stack exchange,提问作者chezi chezi




