Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
La simplificación del historial de Git puede ser una bestia confusa. 99% del tiempo que ni siquiera sabrá que existe, pero ocasionalmente saltará de las esquinas oscuras de Git y le mordió. En este artículo, exploraremos qué es la simplificación del historial y cómo puede causar confusión al examinar el historial de archivos.
Comencemos con un escenario común:
- Inserta un cambio en un archivo y, a continuación, combina el cambio en main.
- Algunos de sus compañeros también combinan sus ramas a main.
- Vuelve algún tiempo más tarde y observa que faltan los cambios.
- Buscando al culpable, ve a ver el historial de archivos y fíjese en... los cambios ni siquiera aparecen en la lista?
El historial de confirmaciones de Git es un árbol. A veces, el historial cronológico no es el mismo que el historial real del árbol de archivos. Esta situación se produce con más frecuencia cuando una confirmación de combinación revierte un archivo a su estado original. En ese caso, la vista de historial predeterminada no le mostrará todos los cambios, ya que técnicamente el archivo no cambió. En este escenario, Git se da cuenta de que puede simplificar el historial y los "cambios" que probablemente busque se quitan del registro.
A menos que lo haya visto antes, puede que se sienta frustrado, preguntándose dónde fue mi cambio?
Simplificación del historial: Activado de forma predeterminada
De forma predeterminada, ejecutar el comando de registro en un archivo: git log file.txt simplificará automáticamente el historial, posiblemente ocultando algunas confirmaciones de su salida. Para más información, consulte la página de git log man.
Lo que se agrega a la confusión es que la simplificación del historial no se produce si simplemente ejecuta git log, ya que está viendo todos los cambios no hay nada que simplificar.
Para desactivar la simplificación del historial, debe usar el modificador --full-historyde línea de comandos .
Un ejemplo de simplificación del historial
Para comprender mejor cómo funciona la simplificación, creamos nuestro propio ejemplo de simplificación de la historia. En primer lugar, echemos un vistazo a un diagrama del historial que vamos a crear:
Como puede ver, vamos a:
- Cree un archivo.
- Agregue una línea a ese archivo en una rama (animales).
- Agregue una línea diferente a ese archivo en otra rama (fruta).
- Vuelva a combinar animales de rama en main.
- Vuelva a combinar la fruta de la rama en main y elija toda la copia del archivo de la rama de fruta.
- Compruebe el historial del archivo.
Git simplificará el historial de nosotros. El paso 5 es la clave aquí. Ignoramos todos los cambios de la rama animal . Git observará que nuestro archivo básicamente no cambió entre el paso 1 y el paso 5, por lo que solo nos mostrará dos entradas del historial.
En primer lugar, creamos el archivo y lo agregamos al repositorio:
> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"
Ahora decidimos anexar el texto "donkeys" al archivo en una rama animal:
> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"
Mientras experimentamos, decidimos que queremos ir con fruta en nuestro archivo en su lugar, por lo que creamos una rama diferente y anexamos el texto "bananas" al final del archivo en su lugar:
> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"
Sensación de satisfacción con nuestros cambios, decidimos combinar nuestra rama animal de nuevo en principal:
> git checkout main
> git merge animals
Ahora echemos un vistazo al registro de nuestro test.txt archivo:
> git log test.txt
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Hasta ahora tan bueno, ¿verdad? Nada se ve fuera de lo normal en nuestra salida de registro. Ahora supongamos que cambiamos nuestras mentes y decidimos combinar nuestra rama de fruta:
>git merge fruit
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
Uh-oh, un conflicto de combinación. Después de tener en cuenta, decidimos usar todo test.txt el archivo de nuestra rama de fruta. Normalmente, usaría algún tipo de editor de texto o herramienta de combinación, pero simplemente volveremos a crear todo el archivo, ya que solo es dos líneas:
> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"
Ahora echemos un vistazo al historial de nuestro test.txt archivo:
> git log test.txt
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Lo suficientemente seguro, no vemos ningún cambio desde nuestro primer experimento en el registro, ni vemos nuestra combinación. ¿Siguen ahí? ¿Git eliminó completamente los cambios?
> git log --full-history test.txt
Como puede ver, aunque ha simplificado el registro sin la full-history marca, Git ha mantenido todos nuestros cambios:
> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
Merge: 6b33d99 fdd4dfd
Date: Mon Feb 15 10:59:34 2016 -0500
Fixed merge conflict
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Resumen de simplificación del historial de Git
Lo que ocurre con la simplificación de la historia es que la mayor parte del tiempo nunca lo observará. Pero cuando un conflicto de combinación se produce mal y quiere saber lo que ha ocurrido, es posible que busque el historial de registros de Git y se pregunte dónde se han producido los cambios.
Ahora, en lugar de entrar en pánico, sabe que:
- La simplificación del historial para los archivos está activada de forma predeterminada
- La
--full-historymarca le proporcionará un historial de archivos más completo.
Actualización: desde que escribí este artículo, Azure DevOps Services ha introducido una serie de opciones impresionantes de visualización del historial en la web. Lo que significa es que si no desea iniciar sesión a través de la línea de comandos, simplemente puede extraer el archivo para el que desea ver el historial en nuestro explorador y se le presentará el filtro de historial siguiente donde puede especificar vistas de historial simples o no sencillas:
(c) 2016 Microsoft Corporation. Todos los derechos reservados. Este documento se proporciona "as-is". La información y las vistas expresadas en este documento, incluidas las direcciones URL y otras referencias a sitios web de Internet, pueden cambiar sin previo aviso. Corre el riesgo de usarlo.
Este documento no le proporciona ningún derecho legal a ninguna propiedad intelectual en ningún producto de Microsoft. Puede copiar y usar este documento con fines internos de referencia.