Lección 22 · Historia e integración
Reordenar, aplastar, reformular y eliminar confirmaciones locales
Convierta cinco confirmaciones privadas aproximadas en dos limpias: mueva una solución dependiente, reformule un mensaje, doble y aplaste pasos, elimine solo el ruido y verifique que el resultado tenga exactamente los archivos que deseaba.
- Nivel: Avanzado
- 13 minutos de lectura
- 7 minutos de vídeo
- Actualizado
- Antes de esta lección: Cambiar la base del trabajo inédito sobre una nueva base
Progreso guardado en este navegador.
La reproducción carga el vídeo de YouTube (modo de privacidad mejorada).
lo que aprenderás
- Lea un plan de repetición: el paso más antiguo primero, aplicado de arriba a abajo.
- Elija la acción correcta: reformular, aplastar, arreglar o soltar.
- Avanza un paso sin romper el paso del que depende.
- Verifique las nuevas confirmaciones, los archivos y la rama de rescate luego.
Antes de empezar
Su rama private/signup-polish tiene cinco confirmaciones que existen solo en su computadora, además de la confirmación M. El árbol de trabajo está limpio y rescue/before-polish apunta a la quinta confirmación. En orden, los más antiguos primero:
| paso | comprometerse | que hace |
|---|---|---|
| C1 | hazaña: agregar borrador de registro | agrega el formulario de registro |
| C2 | documentos: explicar la revisión del registro | agrega docs/replay-a.md |
| C3 | documentos: explicar la validación | agrega docs/replay-b.md |
| C4 | ¡arreglo! hazaña: agregar borrador de registro | arregla la etiqueta del formulario |
| C5 | tarea: nota temporal | agrega docs/temporary-review.md |
Todo es local y en el plan gratuito (GitTree te pide que inicies sesión): sin cuenta de alojamiento, sin proveedor, sin Internet. Toda identidad es ficticia (ejemplo.com). Nunca ejecutes esta lección en un proyecto real y nunca reescribas confirmaciones que otras personas ya tengan.
Realice los cambios en GitTree o con los comandos nativos de Git, no ambos en la misma copia. Leer el resultado siempre es seguro. Las etiquetas del menú provienen de las propias cadenas de GitTree 2.0 y los comandos nativos se ejecutaron con Git 2.43 en copias desechables. Los pasos GitTree no se ejecutaron en macOS, Windows o Linux.
Efectos de concepto y estado.
Una rebase interactiva es un plan, no un juego de clasificación. Git reproduce las confirmaciones enumeradas una por una en la base, desde la parte superior de la lista hasta la parte inferior, por lo que el paso más antiguo es el primero. Cada acción le dice a Git qué hacer con un paso:
- Pick mantiene el compromiso tal como está.
- Reword conserva su contenido y te permite escribir un mensaje nuevo.
- Squash incluye la confirmación en la confirmación mantenida que se encuentra encima y le permite escribir un mensaje combinado.
- Fixup también lo dobla, pero descarta su propio mensaje.
- Drop deja el cambio de confirmación fuera por completo.
El orden importa. Un paso que depende de otro (aquí el arreglo de etiqueta necesita el formulario de C1) debe quedar debajo de él. El editor le permitirá moverlo hacia arriba y luego la reproducción se detendrá con un conflicto. GitTree también rechaza planes que Git no puede ejecutar: un plan que descarta cada confirmación, una calabaza sin nada encima para plegarse y un mensaje vacío.
Cada confirmación reproducida obtiene una nueva ID porque su padre cambia. Sólo se reescribe esta rama; la rama de rescate se queda con los cinco viejos. Las confirmaciones que ya están en un control remoto están marcadas como "En un control remoto" y reescribirlas necesita una confirmación explícita. Esta lección nunca confirma eso.
El plan que desarrollarás convierte cinco compromisos en dos:
| paso | comprometerse | acción | Resultado |
|---|---|---|---|
| 1 | C1 | Reformular | hazaña: completar el formulario de registro local |
| 2 | C4 | Reparación | doblado en el paso 1 |
| 3 | C3 | elegir | mantenido; el objetivo de calabaza |
| 4 | C2 | calabaza | documentos: explicar la revisión y validación del registro |
| 5 | C5 | soltar | ido |
Prepare el estado exacto del proyecto
Comience a partir de una copia ordinaria separada del proyecto tal como lo dejó la lección 18. Deja tu gittree-features original intacto. Cree las cinco confirmaciones siguientes en una nueva rama, un archivo a la vez, y guarde cada cuerpo completo solo en el paso indicado.
Entradas de archivos completas
Guarde solo en la fase que se menciona a continuación. Estos son cuerpos UTF-8/LF completos con una nueva línea final; Nunca pegues vallas Markdown. Los archivos ejecutables sin cambios heredan la entrada nombrada. Las versiones en variantes separadas no deben sobrescribir el original.
index.html — REGÍSTRESE
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Demo email</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/replay-a.md — DOC_A
# Local signup review
Review the label and hint together.docs/replay-b.md — DOC_B
# Local validation review
No address leaves this demonstration.index.html — SIGNUP_LABEL
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Fictional email address</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/revisión-temporal.md — DOC_NOISE
Temporary rehearsal note, deliberately dropped.En GitTree
Abra la paleta con Comando+Mayús+P (Ctrl+Mayús+P en Ubuntu). Las acciones en una confirmación utilizan el menú contextual de esa confirmación.
- Cree las cinco confirmaciones y la rama de rescate como se muestra en la siguiente sección, con
private/signup-polishverificado y limpio. Nota M y los cinco sujetos. - Haga clic derecho en M, la confirmación justo debajo de los cinco, y elija Edit History → Interactive Rebase of the Commits Above…. El editor comienza con los cinco pasos privados, el más antiguo primero.
- En Options for this rebase deje desactivadas las tres opciones, incluido Arrange fixup!, squash! and amend! commits. Usted mismo trasladará la reparación.
- Enfoca la fila C4 y presiona Alt+ ↑ dos veces, luego enfoca C3 y presiona Alt+ ↑ una vez. El orden ahora es C1, C4, C3, C2, C5. Al presionar p, r, e, s, f o d en una fila enfocada, se configura Seleccionar, Reescribir, Editar, Aplastar, Arreglar o Soltar.
- Establezca C1 en Reword y escriba
feat: complete the local signup formen su campo de mensaje. Establezca C4 en Fixup. - Mantenga C3 como Pick y establezca C2 en Squash. En Squashed commits, el grupo "2 confirmaciones en documentos: explicar la validación" muestra un mensaje combinado. Reemplácelo con
docs: explain signup review and validation. - Establezca C5 en Drop. Lea cada fila y el mensaje combinado una vez más. No hay nada marcado como "En un control remoto", por lo que no se necesita confirmación.
- Elija Start Rebase una vez y espere. Si se detiene, utilice el banner para continuar; No empieces todo el plan de nuevo.
- Verifique dos confirmaciones nuevas, la etiqueta corregida en la página, ambos documentos y ninguna nota temporal. Mantenga
rescue/before-polishy deje limpio el árbol de trabajo.
Para cada confirmación ordinaria del curso: Summary es el asunto indicado, Description está vacío y las opciones Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit y Allow Empty Commit permanecen desactivadas.
en la terminal
Construya las cinco confirmaciones en una nueva rama, guardando cada cuerpo completo en su paso:
git switch --create private/signup-polishGuarde REGÍSTRESE como index.html y luego:
git add -- index.html
git commit --quiet -m "feat: add signup draft"Guarde DOC_A como docs/replay-a.md y luego:
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"Guarde DOC_B como docs/replay-b.md y luego:
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"Guarde SIGNUP_LABEL como index.html y luego:
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"Guarde DOC_NOISE como docs/temporary-review.md y luego:
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"Proteja el consejo anterior y enumere el rango, el más antiguo primero:
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEADAhora inicie la rebase interactiva (-i es la forma abreviada de --interactive). Git abre su editor con la lista de tareas pendientes (sus ID serán diferentes):
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary noteVuelva a escribir las cinco líneas en el plan, manteniendo el ID de cada línea y guarde:
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary noteLuego, Git abre el editor dos veces más. Para redactar nuevamente, reemplace el mensaje con feat: complete the local signup form. Para la calabaza, muestra ambos mensajes; reemplácelos con una línea, docs: explain signup review and validation. Comprueba el resultado:
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validationEl estado está vacío. index.html es SIGNUP_LABEL, ambos documentos existen y docs/temporary-review.md no.
Si pones una calabaza en la primera línea, Git se detiene inmediatamente con error: cannot 'squash' without a previous commit. Arregle la lista con git rebase --edit-todo y git rebase --continue, o déjela con git rebase --abort. Con --autosquash Git hace el movimiento y la acción para fixup! se confirma por usted; esta lección lo desactiva para mostrar el plan.
Resultado
Where you end: dos confirmaciones reescritas arriba de M, "hazaña: completar el formulario de registro local" y "docs: explicar la revisión y validación del registro". La página tiene la etiqueta corregida, ambos documentos están ahí y la nota temporal no. La rama de rescate conserva los cinco compromisos antiguos y el árbol de trabajo está limpio.
Errores comunes
- Usando Drop para ocultar una confirmación que puedas necesitar. El cambio no está en absoluto en la nueva historia.
- Al mover una solución por encima del compromiso, se soluciona.
- Aplastando el primer escalón, que no tiene nada encima para doblarse.
- Comenzar el plan nuevamente una vez finalizado, en lugar de verificar el resultado primero.
Si algo sale mal
Antes de comenzar, Cancel deja la rama como está. Si GitTree dice que la rama cambió desde que se abrió el editor, cierre el editor y ábralo nuevamente. Si la rebase se detiene, solucione el conflicto o el mensaje y continúe desde el banner, o cancelelo deliberadamente. Una vez finalizado, compárelo con rescue/before-polish antes de intentar restaurar algo.
Comprueba tu comprensión
Responda cada pregunta y luego lea por qué. Las preguntas marcadas como "Obligatorias" cuentan para completar la lección.
0 de 6 correcto
Responda correctamente las preguntas requeridas para completar la lección.
Comprobado en este navegador.
Practica
Explica el plan C1, C4, C3, C2, C5 y los dos mensajes que sobreviven. Verifique el rango antiguo 5, el nuevo rango 2, los archivos esperados y ninguna nota. Luego predice, sin ejecutarlo, por qué mover C4 por encima de C1 o aplastar el paso 1 no puede funcionar.
Su propia confirmación: el sitio no puede ver su computadora.
Para completar la lección, responde correctamente a las preguntas requeridas y confirma el ejercicio práctico.
Resumen
- Un plan de reproducción tiene un orden y dependencias.
- Squash guarda ambos mensajes para que puedas combinarlos; la reparación descarta la suya.
- Drop elimina el cambio en sí, por lo que solo suelta ruido real.
Relacionado
Términos del glosario introducidos
Reformular: إعادة صياغة; calabaza—ضمّ; reparación — ضمّ مع تجاهل الرسالة; soltar—إسقاط; plan de repetición — خطة إعادة تطبيق.
Transcripción del vídeo
La narración del vídeo, cue a cue.
Mostrar la transcripción
- Cinco compromisos aproximados se convierten en dos limpios, de forma segura.
- La rebase interactiva es un plan: una lista de pasos, el más antiguo primero.
- Git reproduce la lista de arriba a abajo en una base.
- Cada paso tiene una acción: elegir, reformular, aplastar, arreglar o dejar caer.
- Primero, cree cinco confirmaciones privadas y una rama de rescate.
- Tres son un verdadero trabajo. Uno es una solución y el otro Es ruido temporal.
- Haga clic derecho en la confirmación debajo de ellos y abra Editar historial.
- Elija Rebase interactivo de las confirmaciones Arriba.
- El editor enumera los cinco pasos, el más antiguo. primero.
- Deje las tres opciones desactivadas. nos moveremos la reparación nosotros mismos.
- La reparación pertenece justo después de la confirmación. se arregla. Muévelo hacia arriba dos veces.
- Ahora mueva la nota de validación encima del nota de revisión.
- El orden ahora es uno, cuatro, tres, dos, cinco.
- Establezca el primer paso en Reformular y escriba el nuevo mensaje.
- Establezca el paso de reparación en Reparación. su mensaje es desechado.
- Guarde la nota de validación y aplaste el nota de revisión en él.
- Squash muestra ambos mensajes. escribe uno mensaje para la pareja.
- Suelta la nota temporal. Su cambio será no sobrevivir.
- Lea cada fila una vez más. No hay nada en un remoto.
- Elige Start Rebase una vez y espera. para terminar.
- El gráfico ahora tiene dos confirmaciones encima del base.
- Ambos tienen nuevas identificaciones. Los cinco viejos están en el rama de rescate.
- Abra la página: la corrección de la etiqueta está ahí. el el ruido ha desaparecido.
- Ahora el mismo plan en la terminal, con git rebase-i.
- Git abre la lista de tareas pendientes. Los más antiguos primero, todos listo para elegir.
- Reescribe las líneas en nuestro plan: reformula, arreglar, recoger, aplastar, soltar.
- Git solicita los dos mensajes. escribe uno línea para cada uno.
- Cuente las confirmaciones por encima de la base: dos.
- Enumere los temas. Estos son los dos que escribió.
- El estado está vacío y la nota temporal está ido.
- Cambiar la entrada: poner la calabaza en el primer paso.
- No hay nada encima para plegarse, así que Git se niega.
- O mueva la reparación por encima de su compromiso: el la repetición se detiene con un conflicto.
- Si se detiene, arréglalo y continúa. O abortar y nada cambia.
- La rama de rescate todavía tiene su cinco confirmaciones originales.
- Nunca reescribas los compromisos que alguien más ya lo tiene.
- Práctica: explica el plan y por qué paso uno no puede ser una calabaza.
- A continuación, resuelva los conflictos cuando se produzca una fusión o una paradas de rebase.