En cuanto a GitHub, para cada commit o pull request, siempre podemos añadir a la URL:

  • .diff para obtener el diff con respecto a la rama base
  • .patch para obtener el parche

Ejemplos para el commit en cuestión:

  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770
  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.diff
  • https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch

Es por esto que pude aplicar el parche sin necesidad de descargar más histórico en Git:

$ git checkout -b 9.0-event-no_mail_cancelled # Crear una nueva rama para el PR
$ curl -sSL 'https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch' | git am -3 --keep-non-patch -
Applying: [PATCH] [FIX] calendar, event: do not send emails to canceled attendees
error: sha1 information is lacking or useless (addons/calendar/models/calendar.py).
error: could not build fake ancestor
Patch failed at 0001 [PATCH] [FIX] calendar, event: do not send emails to canceled attendees
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

💥 ¡Error! Al parecer estoy descargando cambios para addons/calendar/models/calendar.py, un archivo que en la rama 9.0 no existía. El parche para dicho archivo tampoco es que me sirva de nada, así que lo ignoraremos:

$ git am --abort # Cancelamos lo que estábamos haciendo
$ curl -sSL 'https://github.com/odoo/odoo/commit/de62e33618211fd754ad6e372ac93805cce58770.patch' | git am -3 --keep-non-patch --exclude addons/calendar/models/calendar.py -
Applying: [PATCH] [FIX] calendar, event: do not send emails to canceled attendees

¡Listo! Ahora, si tengo que hacer algún cambio adicional a algún fichero, puedo hacerlo tranquilamente. También si quiero cambiar el mensaje de commit, nuestro viejo amigo git commit --amend nos puede servir.

Finalmente, subo el cambio a mi repositorio para poder abrir el PR:

$ git remote add tecnativa git@github.com:Tecnativa/odoo.git # El PR lo tengo que hacer desde nuestro repo
$ git fetch tecnativa 9.0 # Esto sirve para que mi clon local pueda generar la diferencia de commits entre los repositorios de OCB y Tecnativa
$ git push -u tecnativa 9.0-event-no_mail_cancelled # Subo los cambios de esta rama, que crearán la rama remota que no existía

¡Luego, creas el PR y listo!