2011-03-15 19 views
24

Parece que no puedo obtener git log --branches para filtrar correctamente su salida. Parece como si Git lo ignorara.¿Funciona el registro de git?

Por ejemplo, el jefe de git log --graph --all --decorate, impresiones:

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore) 
| Author: Chris Lewis <[email protected]> 
| Date: Mon Mar 14 17:39:56 2011 -0700 
| 
|  Ignore merge commits, as they're going to be duplicating events 
| 
* commit 770534e9d77acb03eaf842440c879aec1c5b5500 
| Author: Chris Lewis <[email protected]> 
| Date: Tue Mar 8 14:39:40 2011 -0800 
| 
|  Removed another remote branch check 
| 

Digamos que quiero filtrar por master, lo que debería significar estas confirmaciones se ignoran. El jefe de git log --graph --all --decorate --branches=master, es también: no parece

* commit 3ae0d17538f787bdde68f37f6644ffe9652d8dc1 (HEAD, feature/branch-ignore) 
| Author: Chris Lewis <[email protected]> 
| Date: Mon Mar 14 17:39:56 2011 -0700 
| 
|  Ignore merge commits, as they're going to be duplicating events 
| 
* commit 770534e9d77acb03eaf842440c879aec1c5b5500 
| Author: Chris Lewis <[email protected]> 
| Date: Tue Mar 8 14:39:40 2011 -0800 
| 
|  Removed another remote branch check 
| 

Git a ser filtrado. No parece hacer ninguna diferencia si --branches se pasa con otros argumentos o no. La versión de My Git es git version 1.7.4.1. ¿Alguien sabe cómo usar este comando con éxito?

EDIT: Todo lo que quiero poder hacer es obtener el registro de una rama u otra, sin tener que hacer el pago primero.

+2

pregunta interesante. Ninguno de los comentarios a continuación abordan lo que se supone que debe hacer Branch o cómo se supone que funciona. –

+1

He agregado una respuesta que ahora explica por qué funciona correctamente aunque parezca que no lo es. –

Respuesta

11

En primer lugar, (el otro) Adam se encuentra que no tiene sentido utilizar --all para esto: si solo quieres ver una rama como tu pregunta dice, ¿por qué preguntar por todas las ramas?

En segundo lugar, como ya se indicó en los comentarios a otras respuestas, no necesita --branches; solo haz git log mybranch.

En tercer lugar, puedo explicar por qué git log --branches=mybranch no funciona. El git-log(1) man page dice:

--branches[=<pattern>] 
    Pretend as if all the refs in refs/heads are listed on 
    the command line as <commit>. If <pattern> is given, 
    limit branches to ones matching given shell glob. If 
    pattern lacks ?, *, or [, /* at the end is implied. 

La última frase es el punto crucial aquí.Si el <pattern> es sólo mybranch entonces no hay caracteres comodines, por lo git-log lo interpreta como si se hubiera escrito

git log --branches=mybranch/* 

que sólo coincide con referencias bajo $repo/.git/refs/heads/mybranch/*, es decir, las ramas que comienzan con mybranch/.

Hay un truco sucio para evitar la /* de ser asumido:

git log --branches=[m]ybranch 

pero no puedo pensar en ninguna buena razón por la que se quiere hacer esto en lugar de simplemente escribiendo

git log mybranch 
+1

Luego solo hay una rama (git log mybranch) o todas las ramas. Qué pasa si quieres, por ejemplo, dos ramas. - ramas, uno pensaría, sería la manera de hacerlo. ¿Que es? – Emmel

+1

@Emmel 'git log branch1 branch2' –

+0

¿Puede la persona que votó negativamente esto hacernos la cortesía de agregar un comentario explicando por qué? –

12

Como especificó --all, anula las especificaciones de rama que haya realizado.

+3

La falta de una advertencia parece ser un error de usabilidad para mí. – nes1983

+2

Como mencioné en la pregunta, no parece haber ninguna diferencia si uso otras banderas o no. 'git log --branches = master' devuelve los mismos commits (formateados de forma diferente, obviamente). Simplemente no está funcionando. – cflewis

+3

@Lewisham: si solo quieres master, usa 'git log master'. – Cascabel

2

Digamos que su historia era la siguiente

d -- e [refs/tags/release1] 
/
a -- b -- c [refs/heads/master] 
     \ 
     f -- g [refs/heads/dev1] 
     \ 
     h [refs/heads/dev2] 

Si lo hace git log --branches es la misma git log master dev1 dev2, por lo que verá comete una, b, c, f, g y h. Si lo hizo git log release1 --branches=dev* es lo mismo que git log release1 dev1 dev2. Verá a, d, e, b, f, g, y h, pero no c.

3

¿Alguien sabe cómo utilizar este comando con éxito?

EDIT: Todo lo que quiero poder hacer es obtener el registro de una rama u otra, sin tener que hacer el pago primero.

Con el fin de visualizar el gráfico de confirmaciones para todos los poderes y controles remotos hacer esto:

$ git log --graph --branches=* --remotes=* --decorate 

usar esto con otros git-log opciones para controlar el nivel de detalle, por ejemplo, --oneline, --name-status, etc.

Es posible que primero tenga que buscar los cambios remotos para poder verlos. Se puede recuperar todos los cambios remotos sin aplicar a su rama actual (es) de la siguiente manera:

$ git fetch --all 
1

Explicación de --branches

git log <commit> listas de todas las confirmaciones que son accesibles desde cualquier <commit> que lista en la línea de comando.

  • --all hace lo mismo, pero finge que una lista de los árbitros en refs/.

  • --branches[=<pattern>] hace lo mismo pero pretende que haya enumerado todos los refs en refs/heads. También le permite limitar con un patrón glob. Como resultado, si su patrón glob carece de ?, , o [, entonces un / al final está implícito.

Ejemplos

git log topic1 topic2 topic3

significa lista de todas las confirmaciones accesible desde topic1, topic2, o topic3.

git log -all

significa lista de todas las confirmaciones que son accesibles desde cualquiera de los árbitros que se emiten desde git show-ref.

git log --branches="topic*"

significa lista de todas las confirmaciones que son accesibles a partir de cualquier rama que comienza con el prefijo topic.

Fuentes

https://schacon.github.io/git/git-log.html

https://schacon.github.io/git/git-rev-list.html

Cuestiones relacionadas