Usando Git, muestra todas las confirmaciones que están en una rama, pero no en la otra (s)


Tengo una rama antigua, que me gustaría eliminar. Sin embargo, antes de hacerlo, quiero comprobar que todas las confirmaciones realizadas en esta rama se fusionaron en algún momento en otra rama. Por lo tanto, me gustaría ver todas las confirmaciones hechas en mi rama actual que no se han aplicado a ninguna otra rama [o, si esto no es posible sin un poco de scripting, ¿cómo se ven todas las confirmaciones en una rama que no se han aplicado a otra rama dada?].

Author: Alex, 2009-11-10

10 answers

Probablemente solo quieras

git branch --contains branch-to-delete

Esto listará todas las ramas que contienen las confirmaciones de "branch-to-delete". Si informa algo más que "branch-to-delete", la rama se ha fusionado.

Sus alternativas son realmente solo cosas de sintaxis de lista de revoluciones. por ejemplo, git log one-branch..another-branch muestra todo lo que one-branch necesita tener todo lo que another-branch tiene.

También puede interesarle git show-branch como una forma de ver qué es dónde.

 252
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 14:12:02

Para ver una lista de las confirmaciones que están en una rama pero no en otra, use git log:

git log oldbranch ^newbranch --no-merges

...es decir, mostrar registros de commit para todos los commits en oldbranch que son no en newbranch. Puede enumerar varias ramas para incluir y excluir, por ejemplo,

git log oldbranch1 oldbranch2 ^newbranch1 ^newbranch2 --no-merges

Nota: en Windows ^ es una tecla de escape, por lo que necesita ser escapada con otra ^:

git log oldbranch ^^newbranch --no-merges
 448
Author: jimmyorr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-18 13:13:35

Para mostrar las confirmaciones en oldbranch pero no en newbranch:

git log newbranch..oldbranch

Para mostrar la diferencia por estas confirmaciones (nota hay tres puntos):

git diff newbranch...oldbranch

Aquí está el documento con una ilustración de diagrama https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

 64
Author: Xuan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 11:35:14

Si bien algunas de las respuestas publicadas aquí te ayudarán a encontrar lo que buscas, el siguiente sub-comando de git branch es una solución más adecuada para tu tarea.

--merged se utiliza para encontrar todas las ramas que se pueden eliminar de forma segura, ya que esas ramas están completamente contenidas por HEAD.

Mientras que en master uno podría ejecutar el comando para enumerar las ramas que uno podría eliminar con seguridad, así:

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged
 49
Author: Freddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 15:41:11

Para aquellos que todavía buscan una respuesta simple, echa un vistazo a git cherry. Compara los diffs reales en lugar de los hashes de confirmación. Eso significa que se adapta a las confirmaciones que han sido seleccionadas o rebasadas.

Primera comprobación de la rama que desea eliminar:

git checkout [branch-to-delete]

Luego usa git cherry para compararlo con tu rama de desarrollo principal:

git cherry -v master

Ejemplo de salida:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

Nota: La bandera -v es incluir el mensaje de confirmación junto con el SHA hash.

Las líneas con el '+' delante están en la rama-a-borrar, pero no en la rama maestra. Aquellos con un ' - ' en frente tienen un commit equivalente en master.

Para SOLO las confirmaciones que no están en master, combine cherry pick con grep:

git cherry -v master | grep "^\+"

Ejemplo de salida:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
 42
Author: Tim S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-14 23:38:36

La respuesta de Jimmyorr no funciona en Windows. ayuda usar --not en lugar de ^ así:

git log oldbranch --not newbranch --no-merges
 14
Author: sebeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:30

Si es una (única) rama que necesita comprobar, por ejemplo, si desea que la rama ' B 'se fusiona completamente en la rama 'A', simplemente puede hacer lo siguiente:

$ git checkout A
$ git branch -d B

git branch -d <branchname> tiene la seguridad de que " La rama debe estar completamente fusionada en CABEZA."

Tenga en cuenta que esto realmente elimina la rama si se fusiona en,

 7
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 21:20:16

Puedes usar este sencillo script para ver las confirmaciones que no están combinadas

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

También puedes usar la herramienta git-wtf que mostrará el estado de las ramas

 3
Author: manRo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-31 15:29:23

Para listar confirmaciones faltantes entre dos ramas puede usar compare-branches.py

Https://bitbucket.org/aakef/compare-git-branches

 -1
Author: Bernd Schubert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 17:03:50

Crea una Pull Request a través del servicio de alojamiento git que estás utilizando. Si la rama se ha fusionado completamente en la rama base, no podrá crear el nuevo PR.

Por ejemplo, en GitHub:

No hay nada que comparar

No se puede crear un PR para las ramas que se han fusionado.

Esto no usa git en la línea de comandos, pero a menudo encuentro que es útil usar las otras herramientas a su disposición con un modelo mental claro en lugar de intentar recordar otro arcano comando git.

 -4
Author: pkamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 08:33:22