¿Cómo puedo get solo los nuevos files en git de otra twig?

Tengo una twig TEST y luego tengo master twig master .

Tengo una carpeta llamada DATA con subcarpetas y files.

Ahora en mi maestro tengo

  1. nuevos files que no están en TEST
  2. Archivos modificados tanto en TEST AND master
  3. files en el maestro pero eliminados en TEST

Ahora solo quiero actualizar la twig TEST con los nuevos files de la twig principal para que todo lo demás se haya desbloqueado para la twig TEST, pero los nuevos files deberían estar allí.

Podría hacerlo fácilmente con rsync pero solo pensando si eso podría hacerse en git

Debes ser un poco cuidadoso con esto ya que hay diferentes respuestas a preguntas similares, pero no exactamente iguales. Por ejemplo, supongamos que el historial de commit se ve así:

 A - B - C <-- master \ D - E <-- TEST 

Aquí master y TEST comienzan con una confirmación común, A , y luego divergen. Supongamos que el commit común A tiene estos files (en el directory DATA/ si lo desea, pero solo nombraré los files):

 file_A1 file_A2 

Supongamos además que commit B agrega file_B1 pero elimina file_A2 . Luego, commit C agrega file_C1 y modifica file_A1 ligeramente.

Esto significa que si git checkout master , obtendrás los tres files (A1, B1 y C1) con los contenidos modificados del file_A1 .

Ahora supongamos que commit D modifica file_A1 y agrega file_B1 y file_D1 . Luego, confirma E elimina el file_B1 y no agrega nada más.

Esto significa que si git checkout TEST obtendrás tres files (A1, A2 y D1) con los contenidos modificados del file_A1 (que pueden modificarse de forma diferente a la versión en commit C , o podrían ser los mismos que en C ) .

Cuando pregunta por "files en TEST que no están en master ", ¿count el file_A2 ? Está allí si tienes la git checkout TEST ; no está allí si tienes el git checkout master ; pero estaba allí en el punto de partida común, cometer A

Cuando te preguntas sobre "files modificados en ambos": claramente el file_A1 fue modificado en ambos. Pero, ¿qué file_A1 si el cambio fue idéntico en ambos, de modo que el file_A1 tiene el mismo contenido, independientemente de qué twig se desprotege. ¿Eso es "modificado en ambos", o no?

Lo que Git necesita que hagas para responder estas preguntas es elegir si comparar dos revisiones específicas , o considerar algo más parecido a una fusión tripartita (lo que obtendrías si intentas fusionar TEST y master usando su combinación de bases de datos) , revisión A , como punto de partida).


 git diff <options> master TEST 

Esto comparará la confirmación C (a qué puntos master , es decir, la "punta" de la twig maestra) frente a la confirmación E (la punta de la twig TEST ). Entonces, comparará los dos file_A1 , y verá que la confirmación E tiene el file_A2 y el file_D1 y carece del file_B1 .

La parte de <options> aquí puede estar vacía, o puede ser como se describe a continuación.


 mergebase=$(git merge-base master TEST) git diff <options> $mergebase master git diff <options> $mergebase TEST 

Esto hace dos diffs separados, de la base de combinación (commit A ) contra master , y de la base de fusión contra TEST .

El primer diff le mostrará que en Branch master , el cambio de A a C es para modificar el file_A1 , eliminar el file_A2 , agregar el file_B1 y agregar el file_C1 .

Este es el tipo de operación que usa git para descubrir cómo hacer una fusión de twig. De hecho, hay una syntax especial para ejecutar git diff contra la fusión-base de dos twigs, contra la punta de una de esas dos twigs:

 git diff <options> TEST...master # three dots 

Esto hace lo mismo que el primer diff ( git diff <options> $mergebase master ). Para comparar la base de combinación con la punta de la twig TEST :

 git diff <options> master...TEST # again, three dots 

En cuanto a <diff options> , si no está interesado en los diferentes contenidos de los files, la opción obvia para comenzar es --name-status , que imprime los nombres y --no-renames de los files, y --no-renames , para desactivar la detección de cambio de nombre (a less que desee cambiar el nombre de detección, en cuyo caso, agregue -M lugar).

Los files se mostrarán como agregados, eliminados o modificados (estado A , D y M , respectivamente) en términos del cambio entre los dos treees que obtendría si revisara los commits elegidos por el diff. Sin embargo, aquí hay más posibilidades: T ocurre si un file normal se reemplaza con un enlace simbólico o viceversa (y más casos especiales con submodules); C (más un valor de similitud numérica) se produce si agrega --find-copies-harder y / o -C opciones; y R (más un valor numérico como C ) se produce con la detección de cambio de nombre. Los casos C y R imprimen no solo el estado y el nombre del file, sino también el "nombre del file de origen".

Puede agregar --diff-filter para seleccionar solo las ocurrencias particulares: --diff-filter=A , por ejemplo, seleccionará solo aquellos files cuyo estado sea A (agregado).