El siguiente comando de shell debe hacer lo que quieras:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Advertencias
Si ha mybranchdesprotegido, el comando anterior no funcionará. Esto se debe a que mybranchtambién se puede HEADacceder a los commits, por lo que Git no considera que los commits sean únicos mybranch. Para que funcione cuando mybranchestá desprotegido, también debe agregar una exclusión para HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Sin embargo, debe no excluir HEADa menos que la mybranchestá desprotegido, de lo contrario se corre el riesgo mostrando compromete a que no son exclusivos demybranch .
Del mismo modo, si tiene una rama remota llamada origin/mybranchque corresponde a la mybranchrama local , deberá excluirla:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
Y si la rama remota es la rama predeterminada para el repositorio remoto (generalmente solo es cierto para origin/master), también deberá excluir origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Si tiene la rama desprotegida, y hay una rama remota, y la rama remota es la predeterminada para el repositorio remoto, entonces termina excluyendo mucho:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Explicación
El git rev-listcomando es un comando de bajo nivel (plomería) que recorre las revisiones dadas y vuelca los identificadores SHA1 encontrados. Piense en ello como equivalente a git logexcepto que solo muestra el SHA1: sin mensaje de registro, sin nombre de autor, sin marca de tiempo, ninguna de esas cosas "elegantes".
La --no-walkopción, como su nombre lo indica, evita git rev-listcaminar por la cadena de ascendencia. Entonces, si escribe git rev-list --no-walk mybranch, solo imprimirá un identificador SHA1: el identificador de la confirmación de propinas de la mybranchrama.
Los --exclude=refs/heads/mybranch --allargumentos le dicen git rev-listque comience desde cada referencia, excepto para refs/heads/mybranch.
Entonces, cuando ejecutas git rev-list --no-walk --exclude=refs/heads/mybranch --all, Git imprime el identificador SHA1 de la confirmación de propinas de cada referencia a excepción de refs/heads/mybranch. Estas confirmaciones y sus antepasados son las confirmaciones en las que no está interesado; estas son las confirmaciones que no desea ver.
Las otras confirmaciones son las que desea ver, por lo que recopilamos el resultado git rev-list --no-walk --exclude=refs/heads/mybranch --ally le decimos a Git que muestre todo menos esas confirmaciones y sus antepasados.
El --no-walkargumento es necesario para repositorios grandes (y es una optimización para repositorios pequeños): sin él, Git tendría que imprimir, y el shell tendría que recopilar (y almacenar en la memoria) muchos más identificadores de confirmación de los necesarios. Con un repositorio grande, el número de confirmaciones recopiladas podría superar fácilmente el límite de argumento de la línea de comandos del shell.
Git bug?
Hubiera esperado que funcionara lo siguiente:
git log --all --not --exclude=refs/heads/mybranch --all
Pero no lo hace. Supongo que esto es un error en Git, pero tal vez sea intencional.