2011-12-20 10 views
5

Mi repositorio git tiene 2 ramas: master y develop. Quiero un script que combine todos los cambios de desarrollo a maestro automáticamente.Secuencia de comandos para fusionar 2 ramas de git de forma automática?

que utilizan Jenkins: El Git plugin de clones el repositorio y luego este guión (variable de la 'versión' es un parámetro de trabajo) es ejecutado:

# merge 
git checkout -b develop origin/develop 
git checkout master 
git merge -Xtheirs --squash develop -m "v${version}" 

# commit 
git commit -m "v${version}" 

# tag 
git tag v${version} -m "v${version}" 

# push 
git push origin v${version} 

lo probé en un repositorio de prueba y falla con :

git funden -Xtheirs desarrollar
CONFLICTO (eliminar/modificar): test.txt borrado en desarrollar y modificado en CABEZA. Versión HEAD of test.txt a la izquierda en el árbol.
Falló la combinación automática; arregla los conflictos y luego compromete el resultado.

¿Cómo puedo solucionar este conflicto de forma automática ? Quiero la secuencia de comandos para añadir siempre/modificar/borrar los archivos de acuerdo a la rama 'desarrollar', ya que amo no es tocado todos modos ...

+3

Usted dice que "amo no se toca", pero se obtiene una conflicto de todos modos? Si en realidad nunca fuera táctil, bastaría con una simple fusión de git --sólo origen/desarrollo--. – fge

+1

Si desea _replace_ la versión maestra con la versión 'origin/develop' y no registra una fusión de commit, ¿para qué molestarse con' merge --nosquash'? ¿No sería más sencillo simplemente 'git checkout master && git reset origin/develop && git reset --soft HEAD @ {1}' o similar? –

Respuesta

5

La estrategia de combinación -X theirs sólo funciona para resolver trozos en conflicto dentro de un archivo. La documentación de estas opciones se encuentra en the git-merge man page:

 ours 
      This option forces conflicting hunks to be auto-resolved 
      cleanly by favoring our version. Changes from the other tree 
      that do not conflict with our side are reflected to the merge 
      result. 

      This should not be confused with the ours merge strategy, which 
      does not even look at what the other tree contains at all. It 
      discards everything the other tree did, declaring our history 
      contains all that happened in it. 

     theirs 
      This is opposite of ours. 

En este caso, una rama se ha eliminado el archivo, mientras que el otro se ha modificado, lo cual es un caso distinto de un simple trozo conflicto entre dos ramas que se han realizado diferentes modificaciones.

+0

¿Hay alguna manera de hacer que git elija automáticamente "eliminar el archivo" si alguno de ellos lo ha eliminado? –

1

5 años de edad ... Pero sigue siendo relevante.

aquí está mi solución: elimino la rama principal y crear una nueva rama principal de la rama quiero 'fusión' de:

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'` 
GIT_BRANCH_TO_MERGE_TO="master" 

git checkout "${GIT_BRANCH_TO_MERGE_TO}" 
git checkout "${GIT_BRANCH_TO_MERGE_FROM}" 

# Delete TO branch 
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin" 

# Create TO branch 
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin" 
Cuestiones relacionadas