🕷️ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 54 (from laksa105)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

📄
INDEXABLE
CRAWLED
21 hours ago
🤖
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://git-scm.com/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia
Last Crawled2026-04-07 13:06:46 (21 hours ago)
First Indexed2018-03-28 03:25:25 (8 years ago)
HTTP Status Code200
Meta TitleGit - Reescribiendo la Historia
Meta Descriptionnull
Meta Canonicalnull
Boilerpipe Text
Muchas veces, al trabajar con Git, vas a querer confirmar tu historia por alguna razón. Una de las grandes cualidades de Git es que te permite tomar decisiones en el último momento. Puede decidir qué archivos entran en juego antes de comprometerse con el área de ensayo, puedes decidir que no querías estar trabajando en algo todavía con el comando de alijos, y puedes reescribir confirmaciones que ya hayan pasado haciendo parecer que fueron hechas de diferente manera. Esto puede desenvolverse en el cambio de las confirmaciones, cambiando mensajes o modificando los archivos en un cometido, aplastando o dividiendo confirmaciones enteramente – todo antes de que compartas tu trabajo con otras personas. En esta sección, verás cómo complementar esas tareas tan útiles que harán a la confirmación de tu historia aparecer del modo en el cual quisiste compartirla. Cambiando la última confirmación Cambiar la última confirmación es probablemente lo más común que le harás a tu historia. Comúnmente querrás hacer dos cosas en tu última confirmación: cambiar la confirmación del mensaje, o cambiar la parte instantánea que acabas de agregar sumando, cambiando y/o removiendo archivos. Si solamente quieres cambiar la confirmación del mensaje final, es muy sencillo: $ git commit --amend Esto te envía al editor de texto, el cual tiene tu confirmación final, listo para modificarse en el mensaje. Cuando guardes y cierres el editor, el editor escribe una nueva confirmación conteniendo el mensaje y lo asigna a tu última confirmación. Si ya has cambiado tu última confirmación y luego quieres cambiar la instantánea que confirmaste al agregar o cambiar archivos, porque posiblemente olvidaste agregar un archivo recién creado cuando se confirmó originalmente, el proceso trabaja prácticamente de la misma manera. Tu manejas los cambios que quieras editando el archivo y oprimiendo git add en éste o git rm a un archivo adjunto, y el subsecuente git commit --amend toma tu área de trabajo actual y la vuelve una instantánea para la nueva confirmación. Debes ser cuidadoso con esta técnica porque puedes modificar los cambios del SHA-1 de la confirmación Es como un muy pequeño rebase – no necesitas modificar tu última confirmación si ya lo has hecho. Cambiando la confirmación de múltiples mensajes Para modificar una confirmación que está más atrás en tu historia, deberás aplicar herramientas más complejas Git no tiene una herramienta para modificar la historia, pero puedes usar la herramienta de rebase para rebasar ciertas series de confirmaciones en el HEAD en el que se basaron originalmente en lugar de moverlas a otro. Con la herramienta interactiva del rebase , puedes parar justo después de cada confirmación que quieras modificar y cambiar su mensaje, añadir archivos, o hacer cualquier cosa que quieras Puedes ejecutar el rebase interactivamente agregando el comando -i a git rebase . De igual manera debes indicar que tan atrás quieres regresar para reescribir las confirmaciones escribiendo en el comando cuál confirmación quieres rebasar. Por ejemplo, si quieres cambiar las confirmaciones de los tres últimos mensajes, o cualquiera de los mensajes de confirmación de ese grupo, proporcionas un argumento para el git rebase -i que quieras modificar de tu última confirmación, el cual es HEAD~2^ o HEAD~3 . Debería ser más fácil el recordar el ~3 porque estás tratando de editar las últimas tres confirmaciones; pero ten en mente que estás designando actualmente cuatro confirmaciones atrás, aparte del último cometido que deseas editar: $ git rebase -i HEAD~3 Recuerda de Nuevo que este es un comando de rebase – cualquier confirmación incluida en el rango de HEAD~3..HEAD será reescrita, aún si cambias el mensaje o no. No incluyas cualquier confirmación que ya hayas enviado al servidor central – si lo haces esto confundirá a los demás desarrolladores proporcionando una versión alternativa del mismo cambio. Utilizar este comando te da una lista de las confirmaciones en tu editor de texto que se ve como este: pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out Es importante el notar que estas confirmaciones son escuchadas en el orden contrario del que tú normalmente las verías usando el comando de log . Si utilizaras un comando de log , verías algo como esto. $ git log --pretty=format:"%h %s" HEAD~3..HEAD a5f4a0d added cat-file 310154e updated README formatting and added blame f7f3f6d changed my name a bit Nótese que el orden está al revés. El rebase interactivo te da un script que va a utilizarse. Este empezará en la confirmación que especificas en la línea de comandos ( HEAD~3 ) y reproducirá los cambios introducidos en cada una de estas confirmaciones de arriba a abajo. Este acomoda los más viejos en la parte de arriba, y va bajando hasta los más nuevos, porque ese será el primero en reproducirse Necesitaras editar el script para que se detenga en la confirmación que quieres editar. Para hacer eso, cambia la palabra pick por la frase edit para cada una de las confirmaciones en las que quieres que el script se detenga. Por ejemplo, para modificar solamente la tercera confirmación del mensaje, cambiarías el archivo para que se viera algo así: edit f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file Cuando guardes y salgas del editor, Git te enviará atrás a la última confirmación en la lisa y te llevará a la línea de comando con el siguiente mensaje: $ git rebase -i HEAD~3 Stopped at f7f3f6d... changed my name a bit You can amend the commit now, with git commit --amend Once you’re satisfied with your changes, run git rebase --continue Estas instrucciones te dirán exactamente qué hacer. Type $ git commit --amend Cambia la confirmación del mensaje, y sal del editor. Then, run $ git rebase --continue Este comando te permitirá aplicar las otras dos confirmaciones automáticamente, y después de esto estás listo. Si decides cambiar y elegir editar en más líneas, puedes repetir estos pasos para cada confirmación que cambies en cada edición. Cada vez, Git se parará, permitiéndote modificar la confirmación y continuar cuando hayas terminado Reordenando Confirmaciones De igual manera puedes usar rebases interactivos para reordenar o remover confirmaciones enteramente. Si quieres remover la “added cat-file” confirmación y cambiar el orden en el cual las otras dos confirmaciones son introducidas, puedes cambiar el rebase en el script de esto: pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file A esto: pick 310154e updated README formatting and added blame pick f7f3f6d changed my name a bit Cuando guardes y salgas del editor, Git recordará tu rama de padres de estas confirmaciones, aplicando 310154e y después f7f3f6d, y después se parará. Cambias efectivamente el orden de esas confirmaciones y eliminas la “added cat-file’’ confirmación completamente. Unir confirmaciones También es posible el tomar series de confirmaciones y unirlas todas en una sola confirmación con la herramienta interactiva de rebase . El script pone las instrucciones en el mensaje de rebase: # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out Si, en vez de “`pick” o`“edit”, especificas “squash”, Git aplica a ambos este cambio y los cambia directamente después y hace que las confirmaciones se unan. Entonces, si quieres convertir en una única confirmación estas tres confirmaciones, deberás hacer que el script se vea como esto: pick f7f3f6d changed my name a bit squash 310154e updated README formatting and added blame squash a5f4a0d added cat-file Cuando guardes y salgas del editor, Git aplicará a los tres el cambio y después te dirigirá en el editor para fusionar los tres mensajes de la confirmación: # This is a combination of 3 commits. # The first commit's message is: changed my name a bit # This is the 2nd commit message: updated README formatting and added blame # This is the 3rd commit message: added cat-file Cuando guardes eso, tendrás una única confirmación que introducirá los cambios de las tres previas confirmaciones. Dividiendo una confirmación Dividir una confirmación la deshace y después realiza etapas parciales de las confirmaciones tantas veces como confirmaciones desees finalizar. Por ejemplo, suponiendo que quieres dividir la confirmación de en medio de tus tres confirmaciones. En vez de “`updated README formatting and added blame”, quieres dividirla en dos confirmaciones: “updated README formatting” para la primera, y “added blame” para la segunda. Puedes hacer eso en el script rebase -i cambiando la instrucción en la confirmación que quieres dividir a “edit”: pick f7f3f6d changed my name a bit edit 310154e updated README formatting and added blame pick a5f4a0d added cat-file ¿Entonces, cuando el script te envíe a la línea de comandos, tu reseteas esa confirmación, tomas los cambios que se han hecho, y creas múltiples confirmación fuera de ellas? Cuando guardes y salgas del editor, Git te enviará al padre de la primera confirmación en tu lista, aplicando a la primera confirmación ( f7f3f6d ), a la segunda ( 310154e ) y te enviará directamente a la consola. Ahí, puedes hacer un reseteo mixto de esa confirmación con el git reset HEAD^ , el que efectivamente deshace las confirmaciones en los archivos referidos. Ahora puedes organizar y confirmar los archivos hasta que tengas varias confirmaciones y ejecutar git rebase --continue cuando hayas terminado: $ git reset HEAD^ $ git add README $ git commit -m 'updated README formatting' $ git add lib/simplegit.rb $ git commit -m 'added blame' $ git rebase --continue Git aplica la última confirmación ( a5f4a0d ) en el script, y tu historia quedaría de esta manera: $ git log -4 --pretty=format:"%h %s" 1c002dd added cat-file 9b29157 added blame 35cfb2b updated README formatting f3cc40e changed my name a bit Una vez de Nuevo, esto cambia el SHA-1s de todas tus confirmaciones en tu lista, así que asegúrate de que ninguna confirmación esté en esa lista que ya has puesto en un repositorio compartido. La opción nuclear: filtrar-ramificar Existe otra opción en la parte de volver a escribir la historia que puedes usar si necesitas reescribir un gran número de confirmaciones de una manera que se puedan scriptear – de hecho, cambiar tu dirección de e-mail o remover cualquier archivo en las confirmaciones. El comando es filter-branch , y este puede reescribir una gran cantidad de franjas de tu historia, así que probablemente no lo deberías usar a menos que tu proyecto aún no sea público y otra persona no se haya basado en las confirmaciones que estás a punto de reescribir. Como sea, podría ser muy útil. Aprenderás unas cuantas maneras muy comunes de obtener una idea de algunas de las cosas que es capaz de hacer. Remover un archivo de cada confirmación Esto ocurre comunmente. Alguien accidentalmente confirma un gran número binario de un archivo con un irreflexivo git add . , y quieres removerlo de todas partes. Suponiendo que accidentalmente confirmaste un archivo que contenía contraseña y quieres volverlo un proyecto abierto. filter-branch es la herramienta que tu probablemente quieres usar para limpiar toda tu historia. Para remover un archivo nombrado passwords.txt de tu historia complete puedes aplicar el comando --tree-filter a filter-branch : $ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21) Ref 'refs/heads/master' was rewritten El --tree-filter inicia el comando específico después de cada revisión del proyecto y éste entonces vuelve a confirmar los resultados. En este caso, deberías remover el archivo llamado passwords.txt de cada instantánea, aún si existe o no. Si quieres remover todas las confirmaciones accidentales del respaldo del editor de archivos, puedes iniciar algo como el git filter-branch --tree-filter 'rm -f *~' HEAD . Deberías ser capaz de ver la re-escripción de confirmaciones y estructuras de Git y luego debes mover el puntero de la rama al final. Es generalmente una buena idea hacer esto en una parte de prueba de la rama y hacer un hard-reset de tu rama principal después de haber determinado que el resultado es lo que realmente deseas. Para iniciar filter-branch en todas las ramas, puedes poner --all en el comando. Hacer que un subdirectorio sea la nueva raíz Suponiendo que has hecho una importación desde otro centro de Sistema de Control y tienes subdirecciones que no tienen ningún sentido (tronco, etiquetas, etc). . Si quieres hacer que el subdirectorio tronco sea el nuevo proyecto de la raíz de cada confirmación, filter-branch te puede ayudar a hacer eso también: $ git filter-branch --subdirectory-filter trunk HEAD Rewrite 856f0bf61e41a27326cdae8f09fe708d679f596f (12/12) Ref 'refs/heads/master' was rewritten Ahora la raíz de tu nuevo proyecto es la que solía estar en el subdirectorio tronco cada vez. Git automáticamente remueve confirmaciones que no afecten al subdirectorio. Cambiar la dirección de e-mail globalmente Otro caso común es que olvides iniciar el git config para poner tu nombre y tu dirección de e-mail antes de que hayas empezado a trabajar, o tal vez quieres abrir un proyecto en el trabajo y cambiar tu e-mail de trabajo por tu e-mail personal. En cualquier caso, puedes cambiar la dirección de e-mail de múltiples confirmaciones en un lote con filter-branch igual. Necesitas ser cuidadoso de cambiar sólo las direcciones de e-mail que son tuyas, de manera que debes usar --commit-filter : $ git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; GIT_AUTHOR_EMAIL="schacon@example.com"; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD Esto va a través de la re-escripción de cada confirmación para tener tu nuva dirección. Porque cada confirmación contiene el SHA-1 de sus padres, este comando cambia cada confirmación del SHA-1 en tu historia, no solamente aquellos en los cuales el e-mail es el mismo o encaja.
Markdown
[![Git](https://git-scm.com/images/logo@2x.png)](https://git-scm.com/) \--fast-version-control ![](https://git-scm.com/images/dark-mode.svg) - [About](https://git-scm.com/about) - [Trademark](https://git-scm.com/about/trademark) - [Learn](https://git-scm.com/learn) - [Book](https://git-scm.com/book) - [Cheat Sheet](https://git-scm.com/cheat-sheet) - [Videos](https://git-scm.com/videos) - [External Links](https://git-scm.com/doc/ext) - [Tools](https://git-scm.com/tools) - [Command Line](https://git-scm.com/tools/command-line) - [GUIs](https://git-scm.com/tools/guis) - [Hosting](https://git-scm.com/tools/hosting) - [Reference](https://git-scm.com/docs) - [Install](https://git-scm.com/install/linux) - [Community](https://git-scm.com/community) *** This book is available in [English](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History). Full translation available in | | |---| | [azərbaycan dili](https://git-scm.com/book/az/v2/Git-Al%C9%99tl%C9%99ri-Tarixi-Yenid%C9%99n-Yazmaq), | | [български език](https://git-scm.com/book/bg), | | [Deutsch](https://git-scm.com/book/de/v2/Git-Tools-Den-Verlauf-umschreiben), | | [Español](https://git-scm.com/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia), | | [فارسی](https://git-scm.com/book/fa/v2/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%DA%AF%DB%8C%D8%AA-Git-Tools-%D8%A8%D8%A7%D8%B2%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE%DA%86%D9%87-Rewriting-History), | | [Français](https://git-scm.com/book/fr/v2/Utilitaires-Git-R%C3%A9%C3%A9crire-l%E2%80%99historique), | | [Ελληνικά](https://git-scm.com/book/gr/v2/%CE%95%CF%81%CE%B3%CE%B1%CE%BB%CE%B5%CE%AF%CE%B1-%CF%84%CE%BF%CF%85-Git-%CE%97-%CE%B9%CF%83%CF%84%CE%BF%CF%81%CE%AF%CE%B1-%CE%BE%CE%B1%CE%BD%CE%B1%CE%B3%CF%81%CE%AC%CF%86%CE%B5%CF%84%CE%B1%CE%B9), | | [日本語](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88), | | [한국어](https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0), | | [Nederlands](https://git-scm.com/book/nl/v2/Git-Tools-Geschiedenis-herschrijven), | | [Русский](https://git-scm.com/book/ru/v2/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8), | | [Slovenščina](https://git-scm.com/book/sl/v2/Orodja-Git-Prepisovanje-zgodovine), | | [Српски](https://git-scm.com/book/sr/v2/%D0%93%D0%B8%D1%82-%D0%B0%D0%BB%D0%B0%D1%82%D0%B8-%D0%9F%D0%BE%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE-%D0%B8%D1%81%D0%BF%D0%B8%D1%81%D0%B8%D0%B2%D0%B0%D1%9A%D0%B5-%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%98%D0%B5), | | [Svenska](https://git-scm.com/book/sv/v2/Git-verktyg-Skriva-om-historik), | | [Tagalog](https://git-scm.com/book/tl/v2/Mga-Git-na-Kasangkapan-Pagsulat-muli-ng-Kasaysayan), | | [Türkçe](https://git-scm.com/book/tr/v2/Git-Ara%C3%A7lar%C4%B1-Ge%C3%A7mi%C5%9Fi-Yeniden-Yazma). | | [Українська](https://git-scm.com/book/uk/v2/%D0%86%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B8-Git-%D0%9F%D0%B5%D1%80%D0%B5%D0%BF%D0%B8%D1%81%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F-%D1%96%D1%81%D1%82%D0%BE%D1%80%D1%96%D1%97), | | [简体中文](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E5%86%99%E5%8E%86%E5%8F%B2), | Partial translations available in | | |---| | [Čeština](https://git-scm.com/book/cs/v2/Git-Tools-Rewriting-History), | | [Македонски](https://git-scm.com/book/mk/v2/Git-%D0%90%D0%BB%D0%B0%D1%82%D0%BA%D0%B8-Rewriting-History), | | [Polski](https://git-scm.com/book/pl/v2/Narz%C4%99dzia-Gita-Przepisywanie-historii), | | [Português (Brasil)](https://git-scm.com/book/pt-br/v2/Git-Tools-Rewriting-History), | | [Ўзбекча](https://git-scm.com/book/uz/v2/Git-Tools-Rewriting-History), | | [繁體中文](https://git-scm.com/book/zh-tw/v2/Git-%E5%B7%A5%E5%85%B7-Rewriting-History), | Translations started for | | |---| | [Беларуская](https://git-scm.com/book/be/v2/Git-Tools-Rewriting-History), | | [Indonesian](https://git-scm.com/book/id/v2/Git-Tools-Rewriting-History), | | [Italiano](https://git-scm.com/book/it/v2/Git-Tools-Rewriting-History), | | [Bahasa Melayu](https://git-scm.com/book/ms/v2/Git-Tools-Rewriting-History), | | [Português (Portugal)](https://git-scm.com/book/pt-pt/v2/Ferramentas-do-Git-Rewriting-History). | *** The source of this book is [hosted on GitHub.](https://github.com/progit/progit2-es) Patches, suggestions and comments are welcome. [Chapters ▾](https://git-scm.com/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia) 1. ## 1\. [Inicio - Sobre el Control de Versiones](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones) 1. 1\.1 [Acerca del Control de Versiones](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones) 2. 1\.2 [Una breve historia de Git](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Una-breve-historia-de-Git) 3. 1\.3 [Fundamentos de Git](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Fundamentos-de-Git) 4. 1\.4 [La Línea de Comandos](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-La-L%C3%ADnea-de-Comandos) 5. 1\.5 [Instalación de Git](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%C3%B3n-de-Git) 6. 1\.6 [Configurando Git por primera vez](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Configurando-Git-por-primera-vez) 7. 1\.7 [¿Cómo obtener ayuda?](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-%C2%BFC%C3%B3mo-obtener-ayuda%3F) 8. 1\.8 [Resumen](https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Resumen) 2. ## 2\. [Fundamentos de Git](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git) 1. 2\.1 [Obteniendo un repositorio Git](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git) 2. 2\.2 [Guardando cambios en el Repositorio](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Guardando-cambios-en-el-Repositorio) 3. 2\.3 [Ver el Historial de Confirmaciones](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Ver-el-Historial-de-Confirmaciones) 4. 2\.4 [Deshacer Cosas](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Deshacer-Cosas) 5. 2\.5 [Trabajar con Remotos](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos) 6. 2\.6 [Etiquetado](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Etiquetado) 7. 2\.7 [Alias de Git](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Alias-de-Git) 8. 2\.8 [Resumen](https://git-scm.com/book/es/v2/Fundamentos-de-Git-Resumen) 3. ## 3\. [Ramificaciones en Git](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F) 1. 3\.1 [¿Qué es una rama?](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F) 2. 3\.2 [Procedimientos Básicos para Ramificar y Fusionar](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Procedimientos-B%C3%A1sicos-para-Ramificar-y-Fusionar) 3. 3\.3 [Gestión de Ramas](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Gesti%C3%B3n-de-Ramas) 4. 3\.4 [Flujos de Trabajo Ramificados](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Flujos-de-Trabajo-Ramificados) 5. 3\.5 [Ramas Remotas](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Ramas-Remotas) 6. 3\.6 [Reorganizar el Trabajo Realizado](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Reorganizar-el-Trabajo-Realizado) 7. 3\.7 [Recapitulación](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Recapitulaci%C3%B3n) 4. ## 4\. [Git en el Servidor](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Los-Protocolos) 1. 4\.1 [Los Protocolos](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Los-Protocolos) 2. 4\.2 [Configurando Git en un servidor](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Configurando-Git-en-un-servidor) 3. 4\.3 [Generando tu clave pública SSH](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Generando-tu-clave-p%C3%BAblica-SSH) 4. 4\.4 [Configurando el servidor](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Configurando-el-servidor) 5. 4\.5 [El demonio Git](https://git-scm.com/book/es/v2/Git-en-el-Servidor-El-demonio-Git) 6. 4\.6 [HTTP Inteligente](https://git-scm.com/book/es/v2/Git-en-el-Servidor-HTTP-Inteligente) 7. 4\.7 [GitWeb](https://git-scm.com/book/es/v2/Git-en-el-Servidor-GitWeb) 8. 4\.8 [GitLab](https://git-scm.com/book/es/v2/Git-en-el-Servidor-GitLab) 9. 4\.9 [Git en un alojamiento externo](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Git-en-un-alojamiento-externo) 10. 4\.10 [Resumen](https://git-scm.com/book/es/v2/Git-en-el-Servidor-Resumen) 5. ## 5\. [Git en entornos distribuidos](https://git-scm.com/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos) 1. 5\.1 [Flujos de trabajo distribuidos](https://git-scm.com/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos) 2. 5\.2 [Contribuyendo a un Proyecto](https://git-scm.com/book/es/v2/Git-en-entornos-distribuidos-Contribuyendo-a-un-Proyecto) 3. 5\.3 [Manteniendo un proyecto](https://git-scm.com/book/es/v2/Git-en-entornos-distribuidos-Manteniendo-un-proyecto) 4. 5\.4 [Resumen](https://git-scm.com/book/es/v2/Git-en-entornos-distribuidos-Resumen) 1. ## 6\. [GitHub](https://git-scm.com/book/es/v2/GitHub-Creaci%C3%B3n-y-configuraci%C3%B3n-de-la-cuenta) 1. 6\.1 [Creación y configuración de la cuenta](https://git-scm.com/book/es/v2/GitHub-Creaci%C3%B3n-y-configuraci%C3%B3n-de-la-cuenta) 2. 6\.2 [Participando en Proyectos](https://git-scm.com/book/es/v2/GitHub-Participando-en-Proyectos) 3. 6\.3 [Mantenimiento de un proyecto](https://git-scm.com/book/es/v2/GitHub-Mantenimiento-de-un-proyecto) 4. 6\.4 [Gestión de una organización](https://git-scm.com/book/es/v2/GitHub-Gesti%C3%B3n-de-una-organizaci%C3%B3n) 5. 6\.5 [Scripting en GitHub](https://git-scm.com/book/es/v2/GitHub-Scripting-en-GitHub) 6. 6\.6 [Resumen](https://git-scm.com/book/es/v2/GitHub-Resumen) 2. ## 7\. [Herramientas de Git](https://git-scm.com/book/es/v2/Herramientas-de-Git-Revisi%C3%B3n-por-selecci%C3%B3n) 1. 7\.1 [Revisión por selección](https://git-scm.com/book/es/v2/Herramientas-de-Git-Revisi%C3%B3n-por-selecci%C3%B3n) 2. 7\.2 [Organización interactiva](https://git-scm.com/book/es/v2/Herramientas-de-Git-Organizaci%C3%B3n-interactiva) 3. 7\.3 [Guardado rápido y Limpieza](https://git-scm.com/book/es/v2/Herramientas-de-Git-Guardado-r%C3%A1pido-y-Limpieza) 4. 7\.4 [Firmando tu trabajo](https://git-scm.com/book/es/v2/Herramientas-de-Git-Firmando-tu-trabajo) 5. 7\.5 [Buscando](https://git-scm.com/book/es/v2/Herramientas-de-Git-Buscando) 6. 7\.6 [Reescribiendo la Historia](https://git-scm.com/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia) 7. 7\.7 [Reiniciar Desmitificado](https://git-scm.com/book/es/v2/Herramientas-de-Git-Reiniciar-Desmitificado) 8. 7\.8 [Fusión Avanzada](https://git-scm.com/book/es/v2/Herramientas-de-Git-Fusi%C3%B3n-Avanzada) 9. 7\.9 [Rerere](https://git-scm.com/book/es/v2/Herramientas-de-Git-Rerere) 10. 7\.10 [Haciendo debug con Git](https://git-scm.com/book/es/v2/Herramientas-de-Git-Haciendo-debug-con-Git) 11. 7\.11 [Submódulos](https://git-scm.com/book/es/v2/Herramientas-de-Git-Subm%C3%B3dulos) 12. 7\.12 [Agrupaciones](https://git-scm.com/book/es/v2/Herramientas-de-Git-Agrupaciones) 13. 7\.13 [Replace](https://git-scm.com/book/es/v2/Herramientas-de-Git-Replace) 14. 7\.14 [Almacenamiento de credenciales](https://git-scm.com/book/es/v2/Herramientas-de-Git-Almacenamiento-de-credenciales) 15. 7\.15 [Resumen](https://git-scm.com/book/es/v2/Herramientas-de-Git-Resumen) 3. ## 8\. [Personalización de Git](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Configuraci%C3%B3n-de-Git) 1. 8\.1 [Configuración de Git](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Configuraci%C3%B3n-de-Git) 2. 8\.2 [Git Attributes](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Git-Attributes) 3. 8\.3 [Puntos de enganche en Git](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Puntos-de-enganche-en-Git) 4. 8\.4 [Un ejemplo de implantación de una determinada política en Git](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Un-ejemplo-de-implantaci%C3%B3n-de-una-determinada-pol%C3%ADtica-en-Git) 5. 8\.5 [Recapitulación](https://git-scm.com/book/es/v2/Personalizaci%C3%B3n-de-Git-Recapitulaci%C3%B3n) 4. ## 9\. [Git y Otros Sistemas](https://git-scm.com/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente) 1. 9\.1 [Git como Cliente](https://git-scm.com/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente) 2. 9\.2 [Migración a Git](https://git-scm.com/book/es/v2/Git-y-Otros-Sistemas-Migraci%C3%B3n-a-Git) 3. 9\.3 [Resumen](https://git-scm.com/book/es/v2/Git-y-Otros-Sistemas-Resumen) 5. ## 10\. [Los entresijos internos de Git](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%C3%ADa-y-porcelana) 1. 10\.1 [Fontanería y porcelana](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%C3%ADa-y-porcelana) 2. 10\.2 [Los objetos Git](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Los-objetos-Git) 3. 10\.3 [Referencias Git](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Referencias-Git) 4. 10\.4 [Archivos empaquetadores](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Archivos-empaquetadores) 5. 10\.5 [Las especificaciones para hacer referencia a…​ (refspec)](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Las-especificaciones-para-hacer-referencia-a%E2%80%A6%E2%80%8B-refspec) 6. 10\.6 [Protocolos de transferencia](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Protocolos-de-transferencia) 7. 10\.7 [Mantenimiento y recuperación de datos](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Mantenimiento-y-recuperaci%C3%B3n-de-datos) 8. 10\.8 [Variables de entorno](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Variables-de-entorno) 9. 10\.9 [Recapitulación](https://git-scm.com/book/es/v2/Los-entresijos-internos-de-Git-Recapitulaci%C3%B3n) 1. ## A1. [Apéndice A: Git en otros entornos](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Interfaces-gr%C3%A1ficas) 1. A1.1 [Interfaces gráficas](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Interfaces-gr%C3%A1ficas) 2. A1.2 [Git en Visual Studio](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Git-en-Visual-Studio) 3. A1.3 [Git en Eclipse](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Git-en-Eclipse) 4. A1.4 [Git con Bash](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Git-con-Bash) 5. A1.5 [Git en Zsh](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Git-en-Zsh) 6. A1.6 [Git en Powershell](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Git-en-Powershell) 7. A1.7 [Resumen](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-A:-Git-en-otros-entornos-Resumen) 2. ## A2. [Apéndice B: Integrando Git en tus Aplicaciones](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%C3%ADnea-de-Comandos) 1. A2.1 [Git mediante Línea de Comandos](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%C3%ADnea-de-Comandos) 2. A2.2 [Libgit2](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Libgit2) 3. A2.3 [JGit](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-B:-Integrando-Git-en-tus-Aplicaciones-JGit) 3. ## A3. [Apéndice C: Comandos de Git](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Configuraci%C3%B3n) 1. A3.1 [Configuración](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Configuraci%C3%B3n) 2. A3.2 [Obtener y Crear Proyectos](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Obtener-y-Crear-Proyectos) 3. A3.3 [Seguimiento Básico](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Seguimiento-B%C3%A1sico) 4. A3.4 [Ramificar y Fusionar](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Ramificar-y-Fusionar) 5. A3.5 [Compartir y Actualizar Proyectos](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Compartir-y-Actualizar-Proyectos) 6. A3.6 [Inspección y Comparación](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Inspecci%C3%B3n-y-Comparaci%C3%B3n) 7. A3.7 [Depuración](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Depuraci%C3%B3n) 8. A3.8 [Parcheo](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Parcheo) 9. A3.9 [Correo Electrónico](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Correo-Electr%C3%B3nico) 10. A3.10 [Sistemas Externos](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Sistemas-Externos) 11. A3.11 [Administración](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Administraci%C3%B3n) 12. A3.12 [Comandos de Fontanería](https://git-scm.com/book/es/v2/Ap%C3%A9ndice-C:-Comandos-de-Git-Comandos-de-Fontaner%C3%ADa) 2nd Edition # 7\.6 Herramientas de Git - Reescribiendo la Historia ## Reescribiendo la Historia Muchas veces, al trabajar con Git, vas a querer confirmar tu historia por alguna razón. Una de las grandes cualidades de Git es que te permite tomar decisiones en el último momento. Puede decidir qué archivos entran en juego antes de comprometerse con el área de ensayo, puedes decidir que no querías estar trabajando en algo todavía con el comando de alijos, y puedes reescribir confirmaciones que ya hayan pasado haciendo parecer que fueron hechas de diferente manera. Esto puede desenvolverse en el cambio de las confirmaciones, cambiando mensajes o modificando los archivos en un cometido, aplastando o dividiendo confirmaciones enteramente – todo antes de que compartas tu trabajo con otras personas. En esta sección, verás cómo complementar esas tareas tan útiles que harán a la confirmación de tu historia aparecer del modo en el cual quisiste compartirla. ### Cambiando la última confirmación Cambiar la última confirmación es probablemente lo más común que le harás a tu historia. Comúnmente querrás hacer dos cosas en tu última confirmación: cambiar la confirmación del mensaje, o cambiar la parte instantánea que acabas de agregar sumando, cambiando y/o removiendo archivos. Si solamente quieres cambiar la confirmación del mensaje final, es muy sencillo: ``` $ git commit --amend ``` Esto te envía al editor de texto, el cual tiene tu confirmación final, listo para modificarse en el mensaje. Cuando guardes y cierres el editor, el editor escribe una nueva confirmación conteniendo el mensaje y lo asigna a tu última confirmación. Si ya has cambiado tu última confirmación y luego quieres cambiar la instantánea que confirmaste al agregar o cambiar archivos, porque posiblemente olvidaste agregar un archivo recién creado cuando se confirmó originalmente, el proceso trabaja prácticamente de la misma manera. Tu manejas los cambios que quieras editando el archivo y oprimiendo `git add` en éste o `git rm` a un archivo adjunto, y el subsecuente `git commit --amend` toma tu área de trabajo actual y la vuelve una instantánea para la nueva confirmación. Debes ser cuidadoso con esta técnica porque puedes modificar los cambios del SHA-1 de la confirmación Es como un muy pequeño *rebase* – no necesitas modificar tu última confirmación si ya lo has hecho. ### Cambiando la confirmación de múltiples mensajes Para modificar una confirmación que está más atrás en tu historia, deberás aplicar herramientas más complejas Git no tiene una herramienta para modificar la historia, pero puedes usar la herramienta de *rebase* para rebasar ciertas series de confirmaciones en el HEAD en el que se basaron originalmente en lugar de moverlas a otro. Con la herramienta interactiva del *rebase*, puedes parar justo después de cada confirmación que quieras modificar y cambiar su mensaje, añadir archivos, o hacer cualquier cosa que quieras Puedes ejecutar el *rebase* interactivamente agregando el comando `-i` a `git rebase`. De igual manera debes indicar que tan atrás quieres regresar para reescribir las confirmaciones escribiendo en el comando cuál confirmación quieres rebasar. Por ejemplo, si quieres cambiar las confirmaciones de los tres últimos mensajes, o cualquiera de los mensajes de confirmación de ese grupo, proporcionas un argumento para el `git rebase -i` que quieras modificar de tu última confirmación, el cual es `HEAD~2^` o `HEAD~3` . Debería ser más fácil el recordar el ~3 porque estás tratando de editar las últimas tres confirmaciones; pero ten en mente que estás designando actualmente cuatro confirmaciones atrás, aparte del último cometido que deseas editar: ``` $ git rebase -i HEAD~3 ``` Recuerda de Nuevo que este es un comando de *rebase* – cualquier confirmación incluida en el rango de `HEAD~3..HEAD` será reescrita, aún si cambias el mensaje o no. No incluyas cualquier confirmación que ya hayas enviado al servidor central – si lo haces esto confundirá a los demás desarrolladores proporcionando una versión alternativa del mismo cambio. Utilizar este comando te da una lista de las confirmaciones en tu editor de texto que se ve como este: ``` pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out ``` Es importante el notar que estas confirmaciones son escuchadas en el orden contrario del que tú normalmente las verías usando el comando de `log`. Si utilizaras un comando de `log`, verías algo como esto. ``` $ git log --pretty=format:"%h %s" HEAD~3..HEAD a5f4a0d added cat-file 310154e updated README formatting and added blame f7f3f6d changed my name a bit ``` Nótese que el orden está al revés. El *rebase* interactivo te da un script que va a utilizarse. Este empezará en la confirmación que especificas en la línea de comandos (`HEAD~3`) y reproducirá los cambios introducidos en cada una de estas confirmaciones de arriba a abajo. Este acomoda los más viejos en la parte de arriba, y va bajando hasta los más nuevos, porque ese será el primero en reproducirse Necesitaras editar el script para que se detenga en la confirmación que quieres editar. Para hacer eso, cambia la palabra `pick` por la frase `edit` para cada una de las confirmaciones en las que quieres que el script se detenga. Por ejemplo, para modificar solamente la tercera confirmación del mensaje, cambiarías el archivo para que se viera algo así: ``` edit f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` Cuando guardes y salgas del editor, Git te enviará atrás a la última confirmación en la lisa y te llevará a la línea de comando con el siguiente mensaje: ``` $ git rebase -i HEAD~3 Stopped at f7f3f6d... changed my name a bit You can amend the commit now, with git commit --amend Once you’re satisfied with your changes, run git rebase --continue ``` Estas instrucciones te dirán exactamente qué hacer. Type ``` $ git commit --amend ``` Cambia la confirmación del mensaje, y sal del editor. Then, run ``` $ git rebase --continue ``` Este comando te permitirá aplicar las otras dos confirmaciones automáticamente, y después de esto estás listo. Si decides cambiar y elegir editar en más líneas, puedes repetir estos pasos para cada confirmación que cambies en cada edición. Cada vez, Git se parará, permitiéndote modificar la confirmación y continuar cuando hayas terminado ### Reordenando Confirmaciones De igual manera puedes usar rebases interactivos para reordenar o remover confirmaciones enteramente. Si quieres remover la “added cat-file” confirmación y cambiar el orden en el cual las otras dos confirmaciones son introducidas, puedes cambiar el *rebase* en el script de esto: ``` pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` A esto: ``` pick 310154e updated README formatting and added blame pick f7f3f6d changed my name a bit ``` Cuando guardes y salgas del editor, Git recordará tu rama de padres de estas confirmaciones, aplicando 310154e y después f7f3f6d, y después se parará. Cambias efectivamente el orden de esas confirmaciones y eliminas la “added cat-file’’ confirmación completamente. ### Unir confirmaciones También es posible el tomar series de confirmaciones y unirlas todas en una sola confirmación con la herramienta interactiva de *rebase*. El script pone las instrucciones en el mensaje de rebase: ``` # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out ``` Si, en vez de “\`pick” o\`“edit”, especificas “squash”, Git aplica a ambos este cambio y los cambia directamente después y hace que las confirmaciones se unan. Entonces, si quieres convertir en una única confirmación estas tres confirmaciones, deberás hacer que el script se vea como esto: ``` pick f7f3f6d changed my name a bit squash 310154e updated README formatting and added blame squash a5f4a0d added cat-file ``` Cuando guardes y salgas del editor, Git aplicará a los tres el cambio y después te dirigirá en el editor para fusionar los tres mensajes de la confirmación: ``` # This is a combination of 3 commits. # The first commit's message is: changed my name a bit # This is the 2nd commit message: updated README formatting and added blame # This is the 3rd commit message: added cat-file ``` Cuando guardes eso, tendrás una única confirmación que introducirá los cambios de las tres previas confirmaciones. ### Dividiendo una confirmación Dividir una confirmación la deshace y después realiza etapas parciales de las confirmaciones tantas veces como confirmaciones desees finalizar. Por ejemplo, suponiendo que quieres dividir la confirmación de en medio de tus tres confirmaciones. En vez de “\`updated README formatting and added blame”, quieres dividirla en dos confirmaciones: “updated README formatting” para la primera, y “added blame” para la segunda. Puedes hacer eso en el script `rebase -i` cambiando la instrucción en la confirmación que quieres dividir a “edit”: ``` pick f7f3f6d changed my name a bit edit 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` ¿Entonces, cuando el script te envíe a la línea de comandos, tu reseteas esa confirmación, tomas los cambios que se han hecho, y creas múltiples confirmación fuera de ellas? Cuando guardes y salgas del editor, Git te enviará al padre de la primera confirmación en tu lista, aplicando a la primera confirmación (`f7f3f6d`), a la segunda (`310154e`) y te enviará directamente a la consola. Ahí, puedes hacer un reseteo mixto de esa confirmación con el `git reset HEAD^`, el que efectivamente deshace las confirmaciones en los archivos referidos. Ahora puedes organizar y confirmar los archivos hasta que tengas varias confirmaciones y ejecutar `git rebase --continue` cuando hayas terminado: ``` $ git reset HEAD^ $ git add README $ git commit -m 'updated README formatting' $ git add lib/simplegit.rb $ git commit -m 'added blame' $ git rebase --continue ``` Git aplica la última confirmación (`a5f4a0d`) en el script, y tu historia quedaría de esta manera: ``` $ git log -4 --pretty=format:"%h %s" 1c002dd added cat-file 9b29157 added blame 35cfb2b updated README formatting f3cc40e changed my name a bit ``` Una vez de Nuevo, esto cambia el SHA-1s de todas tus confirmaciones en tu lista, así que asegúrate de que ninguna confirmación esté en esa lista que ya has puesto en un repositorio compartido. ### La opción nuclear: filtrar-ramificar Existe otra opción en la parte de volver a escribir la historia que puedes usar si necesitas reescribir un gran número de confirmaciones de una manera que se puedan scriptear – de hecho, cambiar tu dirección de e-mail o remover cualquier archivo en las confirmaciones. El comando es `filter-branch`, y este puede reescribir una gran cantidad de franjas de tu historia, así que probablemente no lo deberías usar a menos que tu proyecto aún no sea público y otra persona no se haya basado en las confirmaciones que estás a punto de reescribir. Como sea, podría ser muy útil. Aprenderás unas cuantas maneras muy comunes de obtener una idea de algunas de las cosas que es capaz de hacer. #### Remover un archivo de cada confirmación Esto ocurre comunmente. Alguien accidentalmente confirma un gran número binario de un archivo con un irreflexivo `git add .`, y quieres removerlo de todas partes. Suponiendo que accidentalmente confirmaste un archivo que contenía contraseña y quieres volverlo un proyecto abierto. `filter-branch` es la herramienta que tu probablemente quieres usar para limpiar toda tu historia. Para remover un archivo nombrado passwords.txt de tu historia complete puedes aplicar el comando `--tree-filter` a `filter-branch`: ``` $ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21) Ref 'refs/heads/master' was rewritten ``` El `--tree-filter` inicia el comando específico después de cada revisión del proyecto y éste entonces vuelve a confirmar los resultados. En este caso, deberías remover el archivo llamado passwords.txt de cada instantánea, aún si existe o no. Si quieres remover todas las confirmaciones accidentales del respaldo del editor de archivos, puedes iniciar algo como el `git filter-branch --tree-filter 'rm -f *~' HEAD`. Deberías ser capaz de ver la re-escripción de confirmaciones y estructuras de Git y luego debes mover el puntero de la rama al final. Es generalmente una buena idea hacer esto en una parte de prueba de la rama y hacer un *hard-reset* de tu rama principal después de haber determinado que el resultado es lo que realmente deseas. Para iniciar `filter-branch` en todas las ramas, puedes poner `--all` en el comando. #### Hacer que un subdirectorio sea la nueva raíz Suponiendo que has hecho una importación desde otro centro de Sistema de Control y tienes subdirecciones que no tienen ningún sentido (tronco, etiquetas, etc). . Si quieres hacer que el subdirectorio `tronco` sea el nuevo proyecto de la raíz de cada confirmación, `filter-branch` te puede ayudar a hacer eso también: ``` $ git filter-branch --subdirectory-filter trunk HEAD Rewrite 856f0bf61e41a27326cdae8f09fe708d679f596f (12/12) Ref 'refs/heads/master' was rewritten ``` Ahora la raíz de tu nuevo proyecto es la que solía estar en el subdirectorio `tronco` cada vez. Git automáticamente remueve confirmaciones que no afecten al subdirectorio. #### Cambiar la dirección de e-mail globalmente Otro caso común es que olvides iniciar el `git config` para poner tu nombre y tu dirección de e-mail antes de que hayas empezado a trabajar, o tal vez quieres abrir un proyecto en el trabajo y cambiar tu e-mail de trabajo por tu e-mail personal. En cualquier caso, puedes cambiar la dirección de e-mail de múltiples confirmaciones en un lote con `filter-branch` igual. Necesitas ser cuidadoso de cambiar sólo las direcciones de e-mail que son tuyas, de manera que debes usar `--commit-filter`: ``` $ git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; GIT_AUTHOR_EMAIL="schacon@example.com"; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD ``` Esto va a través de la re-escripción de cada confirmación para tener tu nuva dirección. Porque cada confirmación contiene el SHA-1 de sus padres, este comando cambia cada confirmación del SHA-1 en tu historia, no solamente aquellos en los cuales el e-mail es el mismo o encaja. [prev](https://git-scm.com/book/es/v2/Herramientas-de-Git-Buscando) \| [next](https://git-scm.com/book/es/v2/Herramientas-de-Git-Reiniciar-Desmitificado) [About this site](https://git-scm.com/site) Patches, suggestions, and comments are welcome. Git is a member of [Software Freedom Conservancy](https://git-scm.com/sfc)
Readable Markdown
Muchas veces, al trabajar con Git, vas a querer confirmar tu historia por alguna razón. Una de las grandes cualidades de Git es que te permite tomar decisiones en el último momento. Puede decidir qué archivos entran en juego antes de comprometerse con el área de ensayo, puedes decidir que no querías estar trabajando en algo todavía con el comando de alijos, y puedes reescribir confirmaciones que ya hayan pasado haciendo parecer que fueron hechas de diferente manera. Esto puede desenvolverse en el cambio de las confirmaciones, cambiando mensajes o modificando los archivos en un cometido, aplastando o dividiendo confirmaciones enteramente – todo antes de que compartas tu trabajo con otras personas. En esta sección, verás cómo complementar esas tareas tan útiles que harán a la confirmación de tu historia aparecer del modo en el cual quisiste compartirla. ### Cambiando la última confirmación Cambiar la última confirmación es probablemente lo más común que le harás a tu historia. Comúnmente querrás hacer dos cosas en tu última confirmación: cambiar la confirmación del mensaje, o cambiar la parte instantánea que acabas de agregar sumando, cambiando y/o removiendo archivos. Si solamente quieres cambiar la confirmación del mensaje final, es muy sencillo: ``` $ git commit --amend ``` Esto te envía al editor de texto, el cual tiene tu confirmación final, listo para modificarse en el mensaje. Cuando guardes y cierres el editor, el editor escribe una nueva confirmación conteniendo el mensaje y lo asigna a tu última confirmación. Si ya has cambiado tu última confirmación y luego quieres cambiar la instantánea que confirmaste al agregar o cambiar archivos, porque posiblemente olvidaste agregar un archivo recién creado cuando se confirmó originalmente, el proceso trabaja prácticamente de la misma manera. Tu manejas los cambios que quieras editando el archivo y oprimiendo `git add` en éste o `git rm` a un archivo adjunto, y el subsecuente `git commit --amend` toma tu área de trabajo actual y la vuelve una instantánea para la nueva confirmación. Debes ser cuidadoso con esta técnica porque puedes modificar los cambios del SHA-1 de la confirmación Es como un muy pequeño *rebase* – no necesitas modificar tu última confirmación si ya lo has hecho. ### Cambiando la confirmación de múltiples mensajes Para modificar una confirmación que está más atrás en tu historia, deberás aplicar herramientas más complejas Git no tiene una herramienta para modificar la historia, pero puedes usar la herramienta de *rebase* para rebasar ciertas series de confirmaciones en el HEAD en el que se basaron originalmente en lugar de moverlas a otro. Con la herramienta interactiva del *rebase*, puedes parar justo después de cada confirmación que quieras modificar y cambiar su mensaje, añadir archivos, o hacer cualquier cosa que quieras Puedes ejecutar el *rebase* interactivamente agregando el comando `-i` a `git rebase`. De igual manera debes indicar que tan atrás quieres regresar para reescribir las confirmaciones escribiendo en el comando cuál confirmación quieres rebasar. Por ejemplo, si quieres cambiar las confirmaciones de los tres últimos mensajes, o cualquiera de los mensajes de confirmación de ese grupo, proporcionas un argumento para el `git rebase -i` que quieras modificar de tu última confirmación, el cual es `HEAD~2^` o `HEAD~3` . Debería ser más fácil el recordar el ~3 porque estás tratando de editar las últimas tres confirmaciones; pero ten en mente que estás designando actualmente cuatro confirmaciones atrás, aparte del último cometido que deseas editar: ``` $ git rebase -i HEAD~3 ``` Recuerda de Nuevo que este es un comando de *rebase* – cualquier confirmación incluida en el rango de `HEAD~3..HEAD` será reescrita, aún si cambias el mensaje o no. No incluyas cualquier confirmación que ya hayas enviado al servidor central – si lo haces esto confundirá a los demás desarrolladores proporcionando una versión alternativa del mismo cambio. Utilizar este comando te da una lista de las confirmaciones en tu editor de texto que se ve como este: ``` pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out ``` Es importante el notar que estas confirmaciones son escuchadas en el orden contrario del que tú normalmente las verías usando el comando de `log`. Si utilizaras un comando de `log`, verías algo como esto. ``` $ git log --pretty=format:"%h %s" HEAD~3..HEAD a5f4a0d added cat-file 310154e updated README formatting and added blame f7f3f6d changed my name a bit ``` Nótese que el orden está al revés. El *rebase* interactivo te da un script que va a utilizarse. Este empezará en la confirmación que especificas en la línea de comandos (`HEAD~3`) y reproducirá los cambios introducidos en cada una de estas confirmaciones de arriba a abajo. Este acomoda los más viejos en la parte de arriba, y va bajando hasta los más nuevos, porque ese será el primero en reproducirse Necesitaras editar el script para que se detenga en la confirmación que quieres editar. Para hacer eso, cambia la palabra `pick` por la frase `edit` para cada una de las confirmaciones en las que quieres que el script se detenga. Por ejemplo, para modificar solamente la tercera confirmación del mensaje, cambiarías el archivo para que se viera algo así: ``` edit f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` Cuando guardes y salgas del editor, Git te enviará atrás a la última confirmación en la lisa y te llevará a la línea de comando con el siguiente mensaje: ``` $ git rebase -i HEAD~3 Stopped at f7f3f6d... changed my name a bit You can amend the commit now, with git commit --amend Once you’re satisfied with your changes, run git rebase --continue ``` Estas instrucciones te dirán exactamente qué hacer. Type ``` $ git commit --amend ``` Cambia la confirmación del mensaje, y sal del editor. Then, run ``` $ git rebase --continue ``` Este comando te permitirá aplicar las otras dos confirmaciones automáticamente, y después de esto estás listo. Si decides cambiar y elegir editar en más líneas, puedes repetir estos pasos para cada confirmación que cambies en cada edición. Cada vez, Git se parará, permitiéndote modificar la confirmación y continuar cuando hayas terminado ### Reordenando Confirmaciones De igual manera puedes usar rebases interactivos para reordenar o remover confirmaciones enteramente. Si quieres remover la “added cat-file” confirmación y cambiar el orden en el cual las otras dos confirmaciones son introducidas, puedes cambiar el *rebase* en el script de esto: ``` pick f7f3f6d changed my name a bit pick 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` A esto: ``` pick 310154e updated README formatting and added blame pick f7f3f6d changed my name a bit ``` Cuando guardes y salgas del editor, Git recordará tu rama de padres de estas confirmaciones, aplicando 310154e y después f7f3f6d, y después se parará. Cambias efectivamente el orden de esas confirmaciones y eliminas la “added cat-file’’ confirmación completamente. ### Unir confirmaciones También es posible el tomar series de confirmaciones y unirlas todas en una sola confirmación con la herramienta interactiva de *rebase*. El script pone las instrucciones en el mensaje de rebase: ``` # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out ``` Si, en vez de “\`pick” o\`“edit”, especificas “squash”, Git aplica a ambos este cambio y los cambia directamente después y hace que las confirmaciones se unan. Entonces, si quieres convertir en una única confirmación estas tres confirmaciones, deberás hacer que el script se vea como esto: ``` pick f7f3f6d changed my name a bit squash 310154e updated README formatting and added blame squash a5f4a0d added cat-file ``` Cuando guardes y salgas del editor, Git aplicará a los tres el cambio y después te dirigirá en el editor para fusionar los tres mensajes de la confirmación: ``` # This is a combination of 3 commits. # The first commit's message is: changed my name a bit # This is the 2nd commit message: updated README formatting and added blame # This is the 3rd commit message: added cat-file ``` Cuando guardes eso, tendrás una única confirmación que introducirá los cambios de las tres previas confirmaciones. ### Dividiendo una confirmación Dividir una confirmación la deshace y después realiza etapas parciales de las confirmaciones tantas veces como confirmaciones desees finalizar. Por ejemplo, suponiendo que quieres dividir la confirmación de en medio de tus tres confirmaciones. En vez de “\`updated README formatting and added blame”, quieres dividirla en dos confirmaciones: “updated README formatting” para la primera, y “added blame” para la segunda. Puedes hacer eso en el script `rebase -i` cambiando la instrucción en la confirmación que quieres dividir a “edit”: ``` pick f7f3f6d changed my name a bit edit 310154e updated README formatting and added blame pick a5f4a0d added cat-file ``` ¿Entonces, cuando el script te envíe a la línea de comandos, tu reseteas esa confirmación, tomas los cambios que se han hecho, y creas múltiples confirmación fuera de ellas? Cuando guardes y salgas del editor, Git te enviará al padre de la primera confirmación en tu lista, aplicando a la primera confirmación (`f7f3f6d`), a la segunda (`310154e`) y te enviará directamente a la consola. Ahí, puedes hacer un reseteo mixto de esa confirmación con el `git reset HEAD^`, el que efectivamente deshace las confirmaciones en los archivos referidos. Ahora puedes organizar y confirmar los archivos hasta que tengas varias confirmaciones y ejecutar `git rebase --continue` cuando hayas terminado: ``` $ git reset HEAD^ $ git add README $ git commit -m 'updated README formatting' $ git add lib/simplegit.rb $ git commit -m 'added blame' $ git rebase --continue ``` Git aplica la última confirmación (`a5f4a0d`) en el script, y tu historia quedaría de esta manera: ``` $ git log -4 --pretty=format:"%h %s" 1c002dd added cat-file 9b29157 added blame 35cfb2b updated README formatting f3cc40e changed my name a bit ``` Una vez de Nuevo, esto cambia el SHA-1s de todas tus confirmaciones en tu lista, así que asegúrate de que ninguna confirmación esté en esa lista que ya has puesto en un repositorio compartido. ### La opción nuclear: filtrar-ramificar Existe otra opción en la parte de volver a escribir la historia que puedes usar si necesitas reescribir un gran número de confirmaciones de una manera que se puedan scriptear – de hecho, cambiar tu dirección de e-mail o remover cualquier archivo en las confirmaciones. El comando es `filter-branch`, y este puede reescribir una gran cantidad de franjas de tu historia, así que probablemente no lo deberías usar a menos que tu proyecto aún no sea público y otra persona no se haya basado en las confirmaciones que estás a punto de reescribir. Como sea, podría ser muy útil. Aprenderás unas cuantas maneras muy comunes de obtener una idea de algunas de las cosas que es capaz de hacer. #### Remover un archivo de cada confirmación Esto ocurre comunmente. Alguien accidentalmente confirma un gran número binario de un archivo con un irreflexivo `git add .`, y quieres removerlo de todas partes. Suponiendo que accidentalmente confirmaste un archivo que contenía contraseña y quieres volverlo un proyecto abierto. `filter-branch` es la herramienta que tu probablemente quieres usar para limpiar toda tu historia. Para remover un archivo nombrado passwords.txt de tu historia complete puedes aplicar el comando `--tree-filter` a `filter-branch`: ``` $ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21) Ref 'refs/heads/master' was rewritten ``` El `--tree-filter` inicia el comando específico después de cada revisión del proyecto y éste entonces vuelve a confirmar los resultados. En este caso, deberías remover el archivo llamado passwords.txt de cada instantánea, aún si existe o no. Si quieres remover todas las confirmaciones accidentales del respaldo del editor de archivos, puedes iniciar algo como el `git filter-branch --tree-filter 'rm -f *~' HEAD`. Deberías ser capaz de ver la re-escripción de confirmaciones y estructuras de Git y luego debes mover el puntero de la rama al final. Es generalmente una buena idea hacer esto en una parte de prueba de la rama y hacer un *hard-reset* de tu rama principal después de haber determinado que el resultado es lo que realmente deseas. Para iniciar `filter-branch` en todas las ramas, puedes poner `--all` en el comando. #### Hacer que un subdirectorio sea la nueva raíz Suponiendo que has hecho una importación desde otro centro de Sistema de Control y tienes subdirecciones que no tienen ningún sentido (tronco, etiquetas, etc). . Si quieres hacer que el subdirectorio `tronco` sea el nuevo proyecto de la raíz de cada confirmación, `filter-branch` te puede ayudar a hacer eso también: ``` $ git filter-branch --subdirectory-filter trunk HEAD Rewrite 856f0bf61e41a27326cdae8f09fe708d679f596f (12/12) Ref 'refs/heads/master' was rewritten ``` Ahora la raíz de tu nuevo proyecto es la que solía estar en el subdirectorio `tronco` cada vez. Git automáticamente remueve confirmaciones que no afecten al subdirectorio. #### Cambiar la dirección de e-mail globalmente Otro caso común es que olvides iniciar el `git config` para poner tu nombre y tu dirección de e-mail antes de que hayas empezado a trabajar, o tal vez quieres abrir un proyecto en el trabajo y cambiar tu e-mail de trabajo por tu e-mail personal. En cualquier caso, puedes cambiar la dirección de e-mail de múltiples confirmaciones en un lote con `filter-branch` igual. Necesitas ser cuidadoso de cambiar sólo las direcciones de e-mail que son tuyas, de manera que debes usar `--commit-filter`: ``` $ git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ]; then GIT_AUTHOR_NAME="Scott Chacon"; GIT_AUTHOR_EMAIL="schacon@example.com"; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD ``` Esto va a través de la re-escripción de cada confirmación para tener tu nuva dirección. Porque cada confirmación contiene el SHA-1 de sus padres, este comando cambia cada confirmación del SHA-1 en tu historia, no solamente aquellos en los cuales el e-mail es el mismo o encaja.
Shard54 (laksa)
Root Hash7104038400628677254
Unparsed URLcom,git-scm!/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia s443