Reproduciendo el conflicto de fusión de git: AU

Estoy trabajando en un guión de testing e intentando reproducir el conflicto de combinación de git AU (sin combinar, agregado por nosotros)

Sigo viniendo con AA o UU con todo lo que bash. Ejemplo:

  • Crear un repo
  • Crear / escenificar / confirmar file de testing
  • Crear una twig fuente, actualizar / etapa / confirmar file de testing
  • Maestro de comprobación, file de testing de eliminación / etapa / confirmación
  • Crear una twig de destino, agregar / establecer / confirmar file de testing
  • Intento de fusionar la twig de origen con la twig de destino

El conflicto de UU se produce, que no es lo que estoy buscando.

¿Qué pasos debo realizar para generar conflictos de AU?

Lo averigué. Aquí está la secuencia de events:

  • Crear / escenificar / confirmar file1 en el maestro
  • Crear una twig fuente desde el maestro
  • Eliminar / escenificar / confirmar en la twig fuente
  • Verificación de la twig de destino desde el maestro
  • Cambiar el nombre / etapa / confirmar file1 a file2
  • Fusionar la fuente de origen con la maestra

El conflicto termina con "AU" cuando se ejecuta git status -s

Para ampliar un poco la respuesta de Pavel Chernikov , aquí hay un script de shell 1 que literalmente produce el conflicto correcto. Tenga en count que este conflicto particular de cambio de nombre / eliminación se anuncia como AU por git status --short , ya que el file renombrado se deja en el índice y en el tree de trabajo, pero en el intervalo de índice de la etapa 2 (es decir, --ours ).

 #! /bin/sh SELF=$(basename "$0") if git rev-parse --show-toplevel 2>/dev/null; then echo 'this must be run in a temporary dir that is not a git tree' exit 1 fi files="$(ls -A)" if [ "$files" != "" -a "$files" != "$SELF" ]; then echo "this temporary dir has too many files" echo "(should be empty or contain only \"$SELF\")" exit 1 fi echo 'initializing new Git repository' git init >/dev/null || exit 1 echo 'demonstrate rename vs delete conflict' > README cat > file1 << 'end' here is a file it is named file1 at least it is, initially it has a bunch of contents so that it's clear that this is the same file even after we rename it. end echo "$SELF" > .gitignore git add README file1 .gitignore git commit -q -m initial git checkout -q -b b1 git rm -q file1 git commit -q -m 'remove file1' git checkout -q -b b2 master git mv file1 file2 git commit -q -m 'rename file1 to file2' echo 'the next merge will have a rename/delete conflict:' git merge b1 | sed 's/^/ /' 2>&1 echo echo 'however, git status --short shows AU:' git status --short # clean up rm -rf .git README file2 .gitignore 

Ejecutar el script produce:

 initializing new Git repository the next merge will have a rename/delete conflict: CONFLICT (rename/delete): file2 deleted in b1 and renamed in HEAD. Version HEAD of file2 left in tree. Automatic merge failed; fix conflicts and then commit the result. however, git status --short shows AU: AU file2 

Podemos intercambiar la fusión, para que --ours se elimine mientras se guarda --theirs (de modo que la input del índice retenido se encuentre en el slot 3). Esto es solo cuestión de comenzar en la twig b1 y luego fusionar la confirmación cuya sugerencia es identificada por b2

 git checkout -q b1 git merge b2 

La queja es ahora:

 CONFLICT (rename/delete): file2 deleted in HEAD and renamed in b2. Version b2 of file2 left in tree. 

y el git status --short salida git status --short ha cambiado el AU para sugerir los cambios de ranura:

 UA file2 

1 Esto usa solo características sh pero también funcionará en bash .