¿Cómo funcionan los parches en Git?


Soy nuevo en Git, pero estoy familiarizado con SVN. Como prueba hice un repositorio en un directorio local con git init. Luego cloné el repositorio vacío (sobre SSH usando 127.0.0.1, que es otra cosa que quería probar) a otro directorio local. Agregué algunos archivos en el repositorio 2, hice git add * y finalmente git commit -a -m "First source code".

Ahora quiero crear un parche usando git format-patch y aplicarlo en el repositorio 1. ¿Cómo hago esto? Sé que hay un manual, pero estas cosas son terriblemente complicadas y me dan ganas de hacer ciertas cosas para mi monitor.

 24
Author: Moacir Rosa, 2010-01-17

5 answers

Crea tu parche a través de:

$ git format-patch master --stdout > patch.diff

Luego parche.diff contendrá el diff, que luego puede enviar a otra persona para aplicar usando:

$ git am < patch.diff

A Veces, cuando los manuales son un poco densos, tiene sentido buscar un tutorial:

Http://luhman.org/blog/2009/09/22/git-patch-tutorial

 20
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-17 19:33:54

El método más fácil para crear parches desde el último commit (o los últimos commits) es usar format-patch con un número negativo que indica el número de commits para crear parches para:

git format-patch -1

Obtendrá un archivo de parche con el nombre de la descripción del commit. El uso am para insertarlo en otro repositorio:

git am << name_of_patch_file
 14
Author: Jakob Borg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-17 19:37:10

La forma correcta y más fácil de hacer esto si estás usando Git es a través de controles remotos:

cd \path\to\repo1
git remote add otherrepo \path\to\repo2
git fetch otherrepo

git log otherrepo/master  ## Find the commit you want to steal in the list

git cherry-pick SOME_SHA1  ## Snag just one commit
git merge otherrepo/master  ## Merge all of the new commits from otherrepo/master

Esto migrará commits de un repositorio a otro, incluidos sus autores y mensajes de confirmación, y le ayudará a resolver los conflictos de fusión (especialmente si está moviendo > 1 commit)

 2
Author: Paul Betts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-13 07:27:41

Usando el parche de GitHub

  1. Agregue .patch a una URL de confirmación para obtener el archivo de parche, ejemplo

    github.com/git/git/commit/b6b3b6a.patch

  2. Parchea el archivo original así:

    git am /tmp/b6b3b6a.patch
    

Usando GitHub diff

  1. Agregue .diff a una URL de confirmación para obtener el archivo de parche, ejemplo

    github.com/git/git/commit/b6b3b6a.diff

  2. Parchea el archivo original así:

    git apply -p0 /tmp/b6b3b6a.diff
    

§5.3 Git distribuido-Mantenimiento de un Proyecto

 2
Author: Steven Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-18 04:34:32

Tienes que ir al" repositorio 2", desde el que quieres crear el parche, y ejecutar git-format-patch para crear el parche : git format-patch master st stdout > name_of_patch_file

Luego entras en" repositorio 1", al que quieres aplicar el parche : git apply name_of_patch_file

A veces es útil simplemente comprobar si el parche causará problemas : git apply check check name_of_patch_file

 0
Author: baraber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 15:05:58