restaurar - ver cambios en un archivo git
¿Cómo recuperar el hash para el commit actual en Git? (18)
Aquí está one-liner en Bash shell usando lectura directa desde archivos git:
(head=($(<.git/HEAD)); cat .git/${head[1]})
Necesitas ejecutar el comando anterior en tu carpeta raíz de git.
Este método puede ser útil cuando tiene archivos de repositorio, pero el comando git
no se ha instalado.
Si no funciona, verifique en la carpeta .git/refs/heads
qué tipo de cabezas tiene presentes.
Me gustaría conservar (por ahora) la capacidad de vincular los conjuntos de cambios de Git a los elementos de trabajo almacenados en TFS.
Ya escribí una herramienta (usando un gancho de Git) en la que puedo inyectar identificadores de trabajo en el mensaje de un conjunto de cambios de Git.
Sin embargo, también me gustaría almacenar el identificador de la confirmación Git (el hash) en un campo de elemento de trabajo TFS personalizado. De esta manera puedo examinar un elemento de trabajo en TFS y ver qué conjuntos de cambios de Git están asociados con el elemento de trabajo.
¿Cómo puedo recuperar fácilmente el hash de la confirmación actual de Git?
Aquí hay otra forma de hacerlo con :)
git log | grep -o ''/w/{8,/}'' | head -n 1
Aquí hay otra implementación de acceso directo:
head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
head="$(cat ".git/${head#ref: }")"
done
Esto también funciona en http, lo cual es útil para los archivos de paquetes locales (lo sé: para sitios web públicos no se recomienda hacer accesible el directorio .git):
head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
Cometer hash
git show -s --format=%H
Abreviado cometer hash
git show -s --format=%h
Haga clic here para ver más ejemplos de git show
.
La forma más sucinta que conozco:
git show --pretty=%h
Si desea un número específico de dígitos del hash, puede agregar:
--abbrev=n
Necesitaba algo un poco más diferente: mostrar el sha1 completo de la confirmación, pero añadir un asterisco al final si el directorio de trabajo no está limpio. A menos que quisiera usar varios comandos, ninguna de las opciones en las respuestas anteriores funciona.
Aquí está el forro que hace:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Resultado: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Explicación: describe (usando etiquetas anotadas) la confirmación actual, pero solo con etiquetas que contienen "NOT A TAG". Ya que las etiquetas no pueden tener espacios, esto nunca coincide con una etiqueta y como queremos mostrar un resultado, --always
, el comando retrocede y muestra el ( --abbrev=0
) completo de la confirmación y agrega un asterisco si el directorio de trabajo es --dirty
Si no desea agregar el asterisco, esto funciona como todos los otros comandos en las respuestas anteriores:
git describe --always --abbrev=0 --match "NOT A TAG"
Resultado: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
Otro, usando git log:
git log -1 --format="%H"
Es muy similar al de @outofculture aunque un poco más corto.
Para completar, ya que nadie lo ha sugerido todavía. .git/refs/heads/master
es un archivo que contiene solo una línea: el hash del último commit en master
. Así que puedes leerlo desde allí.
O, como comando:
cat .git/refs/heads/master
Actualizar:
Tenga en cuenta que git ahora admite el almacenamiento de algunas referencias principales en el archivo paquete-ref en lugar de como un archivo en la carpeta / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
Para convertir la referencia de objeto extendida arbitraria en SHA-1, use simplemente git-rev-parse , por ejemplo
git rev-parse HEAD
o
git rev-parse --verify HEAD
Nota al margen: Si desea convertir referencias ( ramas y etiquetas ) en SHA-1, hay git show-ref
y git for-each-ref
.
Para obtener el SHA completo:
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
Para obtener la versión abreviada:
$ git rev-parse --short HEAD
cbf1b9a
Si necesita almacenar el hash en una variable durante un script, puede usar
last_commit=$(git rev-parse HEAD)
O, si solo quieres los primeros 10 caracteres (como hace github.com)
last_commit=$(git rev-parse HEAD | cut -c1-10)
Si quieres la forma super-hacky de hacerlo:
cat .git/`cat .git/HEAD | cut -d / -f 2`
Básicamente, git almacena la ubicación de HEAD en .git / HEAD, en la forma ref: {path from .git}
. Este comando lee eso, corta el "ref:", y lee cualquier archivo al que apunta.
Esto, por supuesto, fallará en el modo de cabeza separada, ya que HEAD no será "ref: ...", pero el hash en sí, pero ya sabes, no creo que esperes mucha inteligencia en tu bash -liners. Si no crees que los puntos y comas están haciendo trampa, sin embargo ...
HASH="ref: HEAD"; while [[ $HASH == ref/:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d / -f 2)")"; done; echo $HASH
Si solo quieres el hash acortado:
git log --pretty=format:''%h'' -n 1
Además, usar% H es otra forma de obtener el hash largo.
Siempre hay git describe
también. Por defecto te da -
john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe
release-0.19-11-g7a68a75
Tal vez quieras un alias para no tener que recordar todos los detalles ingeniosos. Después de realizar uno de los pasos a continuación, podrá simplemente escribir:
$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630
Siguiendo con la respuesta aceptada , aquí hay dos formas de configurar esto:
1) Enseñe git de forma explícita editando la configuración global (mi respuesta original):
# open the git config editor
$ git config --global --edit
# in the alias section, add
...
[alias]
lastcommit = rev-parse HEAD
...
2) O si te gusta un atajo para enseñar git un atajo, como comentó recientemente Adrien:
$ git config --global alias.lastcommit "rev-parse HEAD"
De aquí en adelante, usa git lastcommit
para mostrar el hash del último commit.
Utilice git rev-list --max-count=1 HEAD
en su directorio de inicio en el archivo ".gitconfig" agregue lo siguiente
[alias]
sha = rev-parse HEAD
entonces tendrás un comando más fácil de recordar:
$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
git show-ref --head --hash head
Si vas por la velocidad, sin embargo, el enfoque mencionado por Deestan
cat .git/refs/heads/<branch-name>
es significativamente más rápido que cualquier otro método enumerado aquí hasta ahora.