remota rama comandos cambiar git diff cherry-pick git-diff

comandos - rama estable de git: no se encuentran los compromisos seleccionados



git pull (2)

Tengo el siguiente historial de git:

A --- B --- C --- D'' --- E'' [master] / / --- D --- E --- F [stable]

Tenemos una política para seleccionar todos los cambios de estable a maestro; D ''y E'' son confirmaciones elegidas por la cereza de una rama estable, F no es elegida por la cereza (se ha olvidado).

¿Cómo puedo obtener una diferencia que aumente a F (que no fue elegida por el maestro)?

No queremos usar la combinación porque:

  • historia más limpia sin confusiones de fusión
  • los compromisos de estable son raros
  • Tenemos muchas ramas estables diferentes.

El comando Git no puede resolver esto. He escrito este guión, puede ayudar.

Script 1st calcula la base de fusión de ambas ramas, branch1 y branch2. Luego hace dos listas desde la base de fusión al encabezado de la rama1 y la rama2 respectivamente. Luego crea una tabla hash de confirmaciones en branch2 con la md5sum del mensaje de confirmación. Luego, vaya a la lista de confirmación de branch1 y verifique si existe en la tabla hash de branch2 o no.

En el caso anterior, branch1 es estable y branch2 es master.

#!/bin/bash ## Usage: ./missing_cherrypicks.sh branch1 branch2 ## This script will find commits in branch1 missing in branch2 ## Final list of missing commit will be in file missing_commits_branch1_branch2.csv branch1=$1 branch2=$2 # Calculate mergebase of branch1 and branch2 mb=`git merge-base origin/$1 origin/$2` rm -rf missing_commits_${branch1}_${branch2}.csv echo "COMMIT,AUTHOR,MESSAGE,FILESLIST" >> missing_commits_${branch1}_${branch2}.csv # Get commit list on both branches from merge-base declare -a commitlist1=`git rev-list $mb..origin/$1` declare -a commitlist2=`git rev-list $mb..origin/$2` ## Make HashKey for branch2 declare -A CommitHash for com2 in ${commitlist2[@]} do message2=`git log --pretty=oneline $com2 | head -1| sed "s/${com2} //" | sed ''s/ *$//'' | cut -c1-35` hashkey=`echo $message2 |md5sum |xargs | awk ''{print $1}''` CommitHash[${hashkey}]=$com2 done # Find commits of commitlist1 and check if they are in commitlist2 for com1 in ${commitlist1[@]} do message1=`git log --pretty=oneline $com1 | head -1| sed "s/${com1} //"| sed ''s/ *$//''| cut -c1-35` hashkey1=`echo $message1 |md5sum |xargs | awk ''{print $1}''` if [[ -z ${CommitHash[${hashkey1}]} ]] then echo "------$com1-----------" author=$(git show $com1 |grep ^Author:|awk -F":" ''{print $2}'') fileslist=`git diff-tree --no-commit-id --name-only -r $com1` fl="" for file in ${fileslist[@]} do fl=${fl}":"$file done echo "------$author-------" echo "$com1,$author,$message1,$fl" >> missing_commits_${branch1}_${branch2}.csv fi done


Para eso es exactamente el comando git cherry .

Nunca debe pasar por alto un cambio no elegido, pero en ocasiones puede incluir un cambio que considere elegido si la resolución involucró la resolución del conflicto.