Pregunta ¿Cómo puedo saber en git si una rama ya se ha fusionado en master?


Tengo un repositorio git con múltiples ramas.

¿Cómo puedo saber qué ramas ya están fusionadas en la rama principal?


853
2017-10-22 18:23


origen


Respuestas:


git branch --merged master listas ramas fusionadas en dominar

git branch --merged listas ramas fusionadas en CABEZA (es decir, 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. los -a bandera mostrará ramas locales y remotas, y el -r la bandera muestra solo las ramas remotas.


1387
2017-10-22 18:33



Puedes usar el git merge-base comando para encontrar el último compromiso común entre las dos ramas. Si esa confirmación es igual a la del jefe de sucursal, entonces la sucursal se habrá fusionado por completo.

Tenga en cuenta que git branch -d hace este tipo de cosas ya porque se negará a eliminar una rama que no tiene ya se ha fusionado por completo


78
2017-10-22 18:25



También hay una solución de interfaz gráfica. Sólo tipo

gitk --all

Una nueva ventana de aplicación le pedirá una representación gráfica de su repositorio completo, donde es muy fácil darse cuenta si una rama ya se fusionó o no


22
2017-10-23 10:19



Sobre el tema de limpiar ramas remotas

git branch -r | xargs -t -n 1 git branch -r --contains

Esto enumera cada rama remota seguida por las ramas remotas en las que se encuentran sus SHA más recientes.

Esto es útil para discernir qué ramas remotas se han fusionado pero no eliminado, y cuáles no se han fusionado y, por lo tanto, están decayendo.

Si estás usando 'tig' (es como gitk pero basado en terminal) entonces puedes

tig origin/feature/someones-decaying-feature

para ver el historial de confirmaciones de una sucursal sin tener que pagar


12
2017-10-23 10:09



Utilizar git merge-base <commit> <commit>.

Este comando encuentra el mejor antecesor común entre dos commits. Y si el ancestro común es idéntico al último compromiso de una "rama", entonces podemos suponer con seguridad que una "rama" ya se ha fusionado en el maestro.

Aquí están los pasos

  1. Encuentra el último commit hash en la rama principal
  2. Encuentra el último commit hash en una "rama"
  3. Ejecutar comando git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Si la salida del paso 3 es igual a la salida del paso 2, entonces una "rama" ya se ha fusionado en el maestro.

Más información sobre git merge-base https://git-scm.com/docs/git-merge-base.


7
2017-10-13 02:05



Estas son mis técnicas cuando necesito averiguar si una rama se ha fusionado, incluso si se ha reordenado para que esté actualizada 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.

1 Mostrar registro para todas las ramas

Usando una herramienta visual como gitk o TortoiseGit, o simplemente git log con --all, revisa 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.

2 Siempre elimine la rama remota cuando se fusiona en una rama de características

Si tiene la buena costumbre de eliminar siempre tanto la rama local como la remota cuando se fusiona en una rama de características, entonces simplemente puede actualizar y eliminar remotos en su otra computadora y las ramas de características desaparecerán.

Para ayudar a recordar hacer esto, ya estoy usando extensiones de flujo git (edición AVH) para crear y fusionar mis ramas de características localmente, así que agregué el siguiente gancho 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 de características

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 / hooks / 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

3 Búsqueda por mensaje de confirmación

Si no siempre elimina la rama remota, aún puede buscar confirmaciones similares para determinar si la rama se ha fusionado o no. La trampa aquí es si la rama remota ha sido reestadificada a la irreconocible, como aplastar confirmaciones o cambiar los mensajes de confirmación.

  • Recoge y poda todos los controles remotos
  • Buscar el mensaje de la última confirmación en la rama de características
  • Vea si se puede encontrar una confirmación con el mismo mensaje en la rama principal

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"
}

5
2018-05-29 08:45



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
}

2
2018-03-22 16:49