2010-01-17 24 views
24

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 (a través de 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".¿Cómo funcionan los parches en Git?

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 hacen querer hacer ciertas cosas en mi monitor.

+2

No necesitas usar parches casi tan seguido si usas Git, mira mi respuesta debajo de –

+1

[This] (https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/) el artículo podría ser útil comprensión del proceso completo de parcheo –

Respuesta

19

Crea tu parche a través de:

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

continuación patch.diff contendrá el diff, que luego se puede enviar a otra persona para aplicar usando:

$ git am < patch.diff 

A veces, cuando los manuales están un poco densa, que tiene sentido para buscar un tutorial:

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

13

El método más fácil para crear parches desde la última confirmación (o últimos commits) es utilizar format-patch con un número negativo que indica el número de confirmaciones para crear parches para:

git format-patch -1 

Usted obtendrá un archivo de revisión nombrado después de la descripción del compromiso.El uso am para insertarlo en otro repositorio:

git am << name_of_patch_file 
+2

Solo un pequeño detalle; pero no es un número negativo, es solo una bandera para indicar la profundidad. ¡No hay magia extraña! También puede especificar un rango de confirmaciones si eso es más natural, p. 'git format-patch origin/master..' o similar (consulte el manual de git rev-parse para conocer todas las formas de expresar esos argumentos). –

+0

En Windows use 'git am name_of_patch_file' –

0

Tienes que ir a "repositorio de 2", el que desea crear el parche, y correr git-formato de parche para crear el parche: git formato de parche maestro --stdout> name_of_patch_file

Después de ir en "depósito 1", la que desea aplicar el parche a: git aplica name_of_patch_file

a veces es útil sólo compruebe si el el parche causará problemas: git apply --check name _of_patch_file

2

Usando GitHub parche

  1. Añadir .patch a una URL comprometerse a conseguir el archivo de revisión, ejemplo

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

  2. parchear el archivo original como esto:

    git am /tmp/b6b3b6a.patch 
    

Usando GitHub diff

  1. Añadir .diff a una URL comprometerse a conseguir el archivo de revisión, ejemplo

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

  2. parchear el archivo original como esto:

    git apply -p0 /tmp/b6b3b6a.diff 
    

§5.3 Distributed Git - Maintaining a Project

+0

Agradable con un ejemplo, pero el enlace desafortunadamente ya no funciona. :( –

2

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

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 

Este emigrarán comete de una cesión temporal a otro, incluyendo sus autores y los mensajes de confirmación, y te ayudará a resolver conflictos de combinación (especialmente si te estás moviendo> 1 commit)

+0

¿Esto funcionará cuando su repositorio inicial no sea el mismo? Todos los commits tendrán hashes diferentes, ya que tiene diferente historial. ¿No está parcheando la única manera de hacerlo entonces? –