2008-11-16 4 views

Respuesta

18

En git se puede canalizar la salida de git-diff entre dos interna como esta:

git diff fa1afe1 deadbeef > patch.diff 

Enviar el patch.diff para el desarrollador y dejarlo git-apply a su espacio de trabajo de la siguiente manera:

git apply patch.diff 

Si el otro desarrollador ya tiene los commits disponibles en su repositorio, siempre podría canalizarlo sin fusionarse así:

git apply < git diff fa1afe1 deadbeef 

A continuación, puede add y commit los cambios en el diff the usual way.


Ahora aquí viene la parte interesante cuando se tiene que fusionar el parche de nuevo a la rama principal (es público). Considere el siguiente árbol de revisión, donde C* es el parche aplicado desde C en la rama principal:

A---B---C---D   master, public/master 
    \ 
     E---C*---F  feature_foo 

Puede utilizar git-rebase para actualizar la rama tema (llamado en este ejemplo feature_foo) con su cabeza contra la corriente. Lo que esto significa es cuando se escribe en la siguiente:

git rebase master feature_foo 

Git reorganizar el árbol de revisión como este y también se colocará el parche en sí:

A---B---C---D   master, public/master 
      \ 
       E*---F* feature_foo 

La fusión de la rama ascendente ahora será una fácil fusión de avance rápido. También compruebe que los nuevos commits E* y F* funcionan como el E anterior y el F respectivamente.

Puede hacer lo mismo contra la sucursal de otro desarrollador siguiendo los mismos pasos, pero en lugar de hacerlo en un repositorio público, tendrá fetching revisiones del repositorio del desarrollador. De esta forma, no tendrá que pedirle al otro desarrollador un parche si ya está disponible de acuerdo con lo que publicó en su repositorio.

Tenga en cuenta que no rebase una rama pública porque el comando git reescribir la historia, que es algo que no quiere hacer en ramas que dependen las personas y creará un desastre cuando la fusión a repositorios remotos. Además, nunca olvides el integrate often para que otros miembros de tu equipo puedan participar de tus cambios.

+0

Descubrí después que puede hacer lo mismo con git format-patch para formatear un parche y git am para aplicar y confirmar el parche. Ejemplo: git formato-parche -k --stdout R1 ... R2 | git am -3 -k – Spoike

2

En SVN se puede simplemente hacer los cambios a continuación, antes de comprometerse, canalizar la salida del svn diff a un archivo como tal

svn diff > mypatch.diff 

a continuación, puede revertir los cambios y aplicar el parche en una fecha posterior mediante

patch -p0 -i mypatch.diff 

como siempre no a ciegas aplicar p atches a su código y siempre inspecciónelos primero.

También es posible que el parche rompa su código fuente si los archivos fuente han cambiado de manera significativa desde que se tomó el parche.

Tampoco puede garantizar que no habrá conflictos de combinación cuando intente registrar el código.

2

Bzr maneja el envío de una "directiva fusionar", lo que significa que envía el parche para usted para que la otra parte puede simplemente haga clic en "OK" para fusión y hay menos pelearse un poco con parches/se aplica etc.

just: $ bzr send -o mycode.patch

+0

bzr enviar solo crea una directiva de combinación entre dos ramas diferentes. Estaba buscando cómo crear parches como commits únicos o cherry-picking, y cómo funciona la fusión al aplicar esos parches. – Spoike

2

En Subversion no hay una buena forma de hacerlo. Sí, puedes usar svn diff + patch, pero esto solo pospondrá tus problemas hasta que te combines y para entonces es probable que te hayas olvidado de él.

La forma en que lo haría en Subversion sería crear una bifurcación, hacer la confirmación en la bifurcación y pedirle al destinatario del parche que cambie a la sucursal. Luego puede fusionar la rama de nuevo al tronco de la manera habitual.

Cuestiones relacionadas