Respuestas:
git branch --merged master
enumera ramas fusionadas en maestro
git branch --merged
enumera las ramas fusionadas en HEAD (es decir, la punta de la rama actual)
git branch --no-merged
enumera las ramas que no se han fusionado
Por defecto, esto se aplica solo a las sucursales locales. La -a
bandera mostrará ramas locales y remotas, y la -r
bandera solo muestra las ramas remotas.
git branch -a --merged/no-merged
también funciona, sin crear una rama de seguimiento local en el proceso.
git branch -r --merged/--no-merged
para encontrar sucursales remotas.
--merged/--no-merged
toma un argumento de confirmación opcional después de él. Al menos en mi versión de git (1.9.1), agregar el indicador -a
o -r
después de esto me da un error fatal. Agregue el -a
o -r
antes --(no-)merged
.
Puede usar el git merge-base
comando para encontrar la última confirmación común entre las dos ramas. Si esa confirmación es la misma que la de su jefe, entonces la rama se ha fusionado por completo.
Tenga en cuenta que ya
git branch -d
hace este tipo de cosas porque se negará a eliminar una rama que aún no se ha fusionado por completo.
git branch -d
se negará a eliminar una rama que no se haya fusionado con la rama actual. No se elimina la rama actual .
También hay una solución de interfaz gráfica. Sólo tipo
gitk --all
Se abrirá una nueva ventana de aplicación con una representación gráfica de todo su repositorio, donde es muy fácil darse cuenta de si una rama ya se fusionó o no.
git
cliente. En Ubuntu, apt-get install gitk
.
brew install git-gui
, para entrar gitk
en la línea de comandos.
Estoy usando la siguiente función bash como: git-is-merged develop feature/new-feature
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2
merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)
if [[ $merge_base = $merge_source_current_commit ]]
then
echo $merge_source_branch is merged into $merge_destination_branch
return 0
else
echo $merge_source_branch is not merged into $merge_destination_branch
return 1
fi
}
Uso git merge-base <commit> <commit>
.
Este comando encuentra los mejores ancestros comunes entre dos confirmaciones. Y si el ancestro común es idéntico al último commit de una "rama", entonces podemos asumir con seguridad que una "rama" ya se ha fusionado con el maestro.
Aquí están los pasos.
git merge-base <commit-hash-step1> <commit-hash-step2>
. Más información sobre git merge-base https://git-scm.com/docs/git-merge-base .
master
se fusionó branch
y luego se agregaron 4 confirmaciones más branch
.
git log -1 $(git merge-base base-branch feature-branch)
y si ves feature-branch
en la salida, entonces sabes que están fusionados?
Sobre el tema de limpiar ramas remotas
git branch -r | xargs -t -n 1 git branch -r --contains
Esto enumera cada rama remota seguida de qué ramas remotas están dentro de sus últimos SHA.
Esto es útil para discernir qué ramas remotas se han fusionado pero no se han eliminado, y cuáles no se han fusionado y, por lo tanto, están en descomposición.
Si está usando 'tig' (es como gitk pero basado en terminal), entonces puede
tig origin/feature/someones-decaying-feature
para ver el historial de confirmación de una sucursal sin tener que pasar por caja
Para verificar qué ramas se fusionan en master, debe usar estos comandos:
git branch <flag[-r/-a/none]> --merged master
lista de todas las ramas fusionadas en master.git branch <flag[-r/-a/none]> --merged master | wc -l
cuenta el número de todas las ramas fusionadas en maestro.Las banderas son:
-a
bandera - (todos) mostrando sucursales remotas y locales-r
bandera - (remoto) que muestra solo ramas remotas<emptyFlag>
- mostrando solo sucursales localespor ejemplo: git branch -r --merged master
le mostrará todos los repositorios remotos combinados en maestro.
Estas son mis técnicas cuando necesito averiguar si una rama se ha fusionado, incluso si se ha modificado para actualizarse con nuestra rama principal, que es un escenario común para las ramas de características.
Ninguno de estos enfoques es infalible, pero los he encontrado útiles muchas veces.
Usando una herramienta visual como gitk o TortoiseGit, o simplemente git log con --todos, recorra el historial para ver todas las fusiones en la rama principal. Debería poder detectar si esta rama de característica particular se ha fusionado o no.
Si tiene el buen hábito de eliminar siempre tanto la rama local como la remota cuando se fusiona en una rama de funciones, simplemente puede actualizar y podar los controles remotos en su otra computadora y las ramas de funciones desaparecerán.
Para ayudar a recordar hacer esto, ya estoy usando extensiones de flujo de git (edición AVH) para crear y fusionar mis ramas de características localmente, así que agregué el siguiente enlace de flujo de git para preguntarme si también quiero eliminar automáticamente la rama remota.
Ejemplo de creación / finalización de la rama característica
554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'
Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$
.git / ganchos / post-flow-feature-finish
NAME=$1
ORIGIN=$2
BRANCH=$3
# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty
while true; do
read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
if [ "$yn" = "" ]; then
yn='Y'
fi
case $yn in
[Yy] )
echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
git push $2 :$3;
break;;
[Nn] )
echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
break;;
* ) echo "Please answer y or n for yes or no.";;
esac
done
# Stop reading user input (close STDIN)
exec <&-
exit 0
Si no siempre elimina la rama remota, aún puede buscar confirmaciones similares para determinar si la rama se ha fusionado o no. El problema aquí es si la rama remota se ha modificado para volverse irreconocible, como aplastar confirmaciones o cambiar mensajes de confirmación.
Comandos de ejemplo en la rama maestra:
gru
gls origin/feature/foo
glf "my message"
En mi bash .profile config
alias gru='git remote update -p'
alias glf=findCommitByMessage
findCommitByMessage() {
git log -i --grep="$1"
}
git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
git log
puede agregar --merges
solo mostrar confirmaciones de fusión. stackoverflow.com/a/25986615/134761
Aquí hay una pequeña frase que le permitirá saber si su sucursal actual incorpora o no tiene datos de una sucursal de origen / maestro remota:
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
Me encontré con esta pregunta cuando trabajaba en una rama de características y con frecuencia quería asegurarme de tener el trabajo más reciente incorporado en mi propia rama de trabajo separada.
Para generalizar esta prueba, he agregado el siguiente alias a mi ~ / .gitconfig:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
Entonces puedo llamar:
$ git current origin/master
para verificar si estoy al día.
git branch --merged
y luego eliminé las ramas locales y remotas.