ver sobrescritos siguientes serán modificados los log locales fusionar error ejemplo comandos cambios archivos git

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 entre HEAD actual y towards commit (excluyendo HEAD ), y ordenarlas en el orden de precedencia (como en el git log por defecto, en lugar del orden cronológico que es extrañamente el valor predeterminado para rev-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.)