Realmente no se puede hacer precisamente eso. La historia en git es un gráfico acíclico dirigido: cada confirmación contiene referencias a sus padres, pero los padres no tienen referencias sobre sus hijos.
El problema aquí debería volverse obvio cuando piensas en un commit del que has creado varias ramas. ¿Qué "siguiente compromiso" quieres decir? Con los padres, puede desvincularse (un compromiso de fusión normal tiene un primer y segundo padre), pero ¿cómo lo hace con los niños? Incluso si usted sabe qué rama que está tratando de ser activado (por ejemplo, que se haya registrado a cabo master~4
y ahora quiere mirar master~3
) no es bien definido - usted podría estar en una situación como esta:
- X (HEAD) - o - o - o - Y (master)
\ /
o - o - o ----------
dicho esto, en casos sencillos, se podría hacer algo como esto:
git checkout $(git rev-list HEAD..master | tail -n 1)
Es evidente que va a trabajar muy bien con la historia lineal. Con fusiones ... rev-list
funciona de presente a pasado en la historia, siguiéndolo hacia atrás. Creo que sigue primero al primer padre, por lo que la última cosa impresa será la confirmación después del HEAD
que se encontró al seguir a todos los últimos padres.
Editar: Eso supone que usted sabe a qué rama desea avanzar. Si no lo hace ... bueno, estás bastante atrapado mirando en todos los árbitros para las confirmaciones que tienen HEAD y como padre - probablemente grepping la salida de git rev-parse
:
git rev-list --all --children | grep ^$(git rev-parse HEAD)
Luego agarra la otra SHA1 de la línea (use awk, lo que sea) Tendrás que inspeccionar manualmente o hacer una elección arbitraria si hay resultados múltiples ...
¿De verdad quieres lo contrario de HEAD^o simplemente una forma de "volver atrás"?(Puede regresar a HEADs anteriores con HEAD @ {1}.) – nschum