sobrescritos - ¿Cómo me muevo hacia adelante y hacia atrás entre confirmaciones en git?
git rebase ejemplo (11)
Estoy haciendo un git bisect
y después de llegar al compromiso problemático, ahora estoy tratando de dar un paso adelante / atrás para asegurarme de que estoy en el correcto.
Sé de HEAD^
para retroceder en la historia, pero hay otro atajo para avanzar (hacia un compromiso específico en el futuro) así:
A - B - C(HEAD) - D - E - F
Sé que mi objetivo es F y quiero pasar de C a D.
NOTA: este no es un duplicado de Git: cómo avanzar y retroceder entre comillas , mi pregunta es ligeramente diferente y no se responde allí
Acabo de hacer una prueba en esto. Digamos, por ejemplo, que estás en la rama maestra.
git checkout HEAD@{3}
Así que la cabeza se separa, y luego puedes intentarlo de nuevo para ir a cualquier otra confirmación:
git checkout HEAD@{4}
Una vez que haya terminado de mirar a su alrededor, puede volver a su estado original con solo mirar en esa sucursal. En mi ejemplo: rama maestra
git checkout master
Si no desea ir al estado original, y desea mantener una de las confirmaciones como su cabeza y continuar desde allí, entonces debe extenderse desde allí. por ejemplo, después de "git checkout HEAD @ {4}", puede emitir
git checkout -b MyNewBranch
Atravesar hacia atrás es trivial ya que te estás moviendo hacia abajo en el árbol, y siempre hay un camino por recorrer
function git_down
git checkout HEAD^
end
Al atravesar hacia delante, se está moviendo hacia arriba en el árbol, por lo que debe ser explícito a qué rama está apuntando:
function git_up
git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
end
Uso: git down
, git up <branch-name>
Como solución alternativa, puede volver a HEAD con
git checkout <branch>
Y luego pasar a la confirmación que te gustaría, con
git checkout HEAD~<offset>
Creo que puedes hacer:
git checkout HEAD@{1}
Para ir un paso adelante en el tiempo. Para avanzar múltiples confirmaciones, use HEAD @ {2}, HEAD @ {3}, etc.
Esto es lo que estoy usando para navegar hacia adelante y hacia atrás.
moviéndose al siguiente commit
function n() {
git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}
moviéndose al compromiso anterior
function p() {
git checkout HEAD^1
}
He experimentado un poco y esto parece hacer el truco para navegar hacia adelante:
git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
donde towards
es un SHA1 de la confirmación o una etiqueta.
Explicación:
- el comando dentro de
$()
significa: obtener todas las confirmaciones entreHEAD
actual ytowards
commit (excluyendoHEAD
), y ordenarlas en el orden de precedencia (como en elgit log
por defecto, en lugar del orden cronológico que es extrañamente el valor predeterminado pararev-list
), y luego tomar la última (tail
), es decir, la que queremos ir. - esto se evalúa en el subshell y se pasa a
git checkout
para realizar un checkout.
Puede definir una función accesible como un alias que espera parámetros en su archivo .profile
para navegar hacia el compromiso en particular:
# Go forward in Git commit hierarchy, towards particular commit
# Usage:
# gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}
# Go back in Git commit hierarchy
# Usage:
# goback
alias goback=''git checkout HEAD~''
Probablemente no sea la mejor manera, pero puedes usar el git log
para ver la lista de confirmaciones y luego usar git checkout [sha1 of D]
para moverte a D.
Si está utilizando el código vs, el historial de Git es un complemento increíble en el que puede ver de manera eficiente los compromisos y consultar su contenido en el editor. mira el link
Supongamos que F es la última confirmación en trunk
(inserte su propio nombre de rama aquí) ... puede referirse a ella como trunk~0
(o solo trunk
), E como trunk~1
, D como trunk~2
etc.
Eche un vistazo en su reflog para encontrar más formas de nombrar confirmaciones.
Todo lo que necesita para aclarar, no el estado de la cabeza separada es restablecer, no pagar.
git reset HEAD@{1}
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)
dónde:
branchName
es igual a nombre de rama
commitInOrder
es igual a una confirmación en orden desde la primera confirmación en la rama seleccionada (por lo que 1 es la primera confirmación, 2 es la segunda confirmación en la rama, etc.)