¿Cómo preguntarle a Git si el repository se encuentra en una etapa de conflicto?

Hay muchas maneras de ver, como ser humano, si el repository tiene conflictos que deben resolverse o no.

Sin embargo, estoy buscando una forma de verificar esto en un script. Es decir, para verificar si el repository está en buenas condiciones para comenzar a hacer algo con él, o se encuentra en una etapa en la que el usuario debe solucionar los conflictos.

Puedo pensar de una manera como la siguiente:

__git_ps1 "%s" | grep MERGING > /dev/null 2>&1 && echo "In merge state" 

Sin embargo, sospecho que este no es un método recomendado. Primero porque __git_ps1 comienza con __ y como progtwigdor en C, tiendo a pensar que no es para mi uso, y segundo, supongo que hay una manera más adecuada, como:

 git repo-status --is-merging 

que tendría el valor de retorno, o algo así.

Entonces, ¿cómo pido git (como script) si el repository está en un estado de fusión?

El uso de git status o similar será lento en un repository grande, ya que necesita verificar el estado completo de la copy de trabajo, así como también el índice. Solo estamos interesados ​​en el índice, por lo que podemos usar commands mucho más rápidos que simplemente verificarán el estado del índice.

Específicamente, podemos usar git ls-files --unmerged . Ese command no producirá salida si no hay files en un estado en conflicto, y algo como el siguiente si hay:

 $ git ls-files --unmerged 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 1 filename 100644 4a58007052a65fbc2fc3f910f2855f45a4058e74 2 filename 100644 65b2df87f7df3aeedef04be96703e55ac19c2cfb 3 filename 

Entonces podemos verificar si ese file produce alguna salida: [[ -z $(git ls-files --unmerged) ]] . Ese command dará un código de retorno de cero si el repository está limpio y no es cero si el repository tiene conflictos. Reemplace -z con -n para el comportamiento inverso.

Puede agregar lo siguiente a su ~/.gitconfig :

 [alias] conflicts = ![[ -n $(git ls-files --unmerged) ]] list-conflicts = "!cd ${GIT_PREFIX:-.}; git ls-files --unmerged | cut -f2 | sort -u" 

Esto dará un comportamiento como el siguiente:

 $ git st # On branch master nothing to commit (working directory clean) $ git conflicts && echo 'Conflicts exist' || echo 'No conflicts' No conflicts $ git merge other-branch Auto-merging file CONFLICT (content): Merge conflict in file Automatic merge failed; fix conflicts and then commit the result. $ git conflicts && echo 'Conflicts exist' || echo 'No conflicts' Conflicts exist $ git list-conflicts file 

(La parte cd ${GIT_PREFIX:-.} segundo alias significa que solo obtiene una list de los files en conflicto en el directory actual, no para todo el repository).

En GNU / algo que haría

 $ if { git status --porcelain | sed -nr '/^U.|.U|AA|DD/q1'; } > then # no merge conflicts > else # merge conflicts > fi 

Que este trabajo para usted?

 $ git merge origin/master Auto-merging file CONFLICT (content): Merge conflict in file Automatic merge failed; fix conflicts and then commit the result. $ git status # On branch master # Your branch and 'origin/master' have diverged, # and have 1 and 1 different commit each, respectively. # # Unmerged paths: # (use "git add/rm <file>..." as appropriate to mark resolution) # # both modified: file # no changes added to commit (use "git add" and/or "git commit -a") $ git status -s UU file 

Puede indicar que se encuentra en un estado de fusión porque le informa que un file tiene 2 modificaciones y ambas no están fusionadas. En realidad, si tiene un XY file donde X e Y son ambas letras, probablemente tenga un conflicto que deba resolverse.