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.