Saltar al contenido
GitTree

Lección 32 · Recuperación

Recuperar errores después de empujar

Repare un error que otros ya puedan haber cometido: prefiera una nueva confirmación y, cuando deba reescribir una sucursal de su propiedad, fuerce un contrato de arrendamiento fijado en la punta remota exacta que revisó.

Progreso guardado en este navegador.

La reproducción carga el vídeo de YouTube (modo de privacidad mejorada).

Narración en inglés · English and Arabic subtítulos

Abre la página del vídeoVer en YouTube

lo que aprenderás

  • Elija entre una reparación aditiva y una reescritura por un error cometido.
  • Explique qué verifica un arrendamiento y por qué es importante el compromiso esperado.
  • Predice el rechazo de un contrato de arrendamiento vencido y conserva el trabajo de un compañero de equipo.
  • Sepa lo que GitTree guarda antes de forzar el empuje.

Antes de empezar

Dos situaciones en un servidor de ensayo local. El shared, ya se envió una confirmación incorrecta y es posible que otros la tengan. El lease, enviaste un borrador y luego lo reescribiste localmente, pero mientras tanto, Leo envió una confirmación más nueva a la misma rama.

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 ejecute esta lección en un proyecto real.

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.

Si los compañeros de equipo pueden tener un compromiso incorrecto, repárelo con un nuevo compromiso (una reversión, lección 28) y presione normalmente: el historial mantiene el error y el clon de nadie se invalida. Reescribe una rama publicada solo cuando sea de tu propiedad.

Un lease hace que un envío forzado sea condicional: Git reemplaza la rama remota solo si todavía apunta a donde esperas. --force-with-lease=<ref>:<commit> nombra la confirmación esperada. Un --force-with-lease simple usa tu referencia de seguimiento remoto y un git fetch mueve esa referencia, por lo que buscar y luego presionar puede sobrescribir lo que acabas de descargar. GitTree fija la última confirmación obtenida, la muestra en su cuadro de diálogo y mantiene la sugerencia reemplazada en refs/ogt/trash.

Un contrato de arrendamiento no decide si puedes sobrescribir el trabajo de un compañero de equipo. Sólo te protege de sobrescribir algo que no has visto.

Prepare el estado exacto del proyecto

Comience a partir de una copia ordinaria separada del resultado de la lección 18 con un nuevo repositorio local desnudo como único remoto. RECOVERY_BAD es la hoja de estilo incorrecta; LEASE_A, LEASE_B y LEASE_REWRITE son las tres versiones de una nota.

Entradas de archivos completas

Guarde cada archivo a continuación exactamente como se muestra: UTF-8, finales de línea LF y una nueva línea final, sin las líneas de delimitación de Markdown. Los archivos que no figuran en la lista mantienen su contenido fuera de M.

estilos.css — RECOVERY_BAD

Extracto del archivo · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #f7f8fa;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

docs/lease-note.md — ARRENDAMIENTO_A

Salida
# Private release rehearsal

The reviewed draft is still private.

docs/lease-note.md — ARRENDAMIENTO_B

Salida
# Private release rehearsal

Leo added a review that must not be overwritten.

docs/lease-note.md — LEASE_REWRITE

Salida
# Private release rehearsal

This alternative draft has not seen Leo's review.

En GitTree

Abra la paleta con Comando+Mayús+P (Ctrl+Mayús+P en Ubuntu).

  1. Cree el ensayo como se muestra en la siguiente sección: la confirmación incorrecta enviada a shared y la rama lease con la confirmación más reciente de Leo en el servidor.
  2. Additive repair. En shared, haga clic derecho en la confirmación incorrecta y elija Revert Commit, luego haga clic en Push. Este es un empujón normal; no elija Force Push (Con arrendamiento)….
  3. Stale lease. El private/lease, reescribe el borrador localmente para que la rama ya no contenga la confirmación enviada e intenta enviarla con la barra de herramientas Push. GitTree primero pregunta dónde enviar, porque private/lease rastrea a origin/lease con otro nombre: elija Push to origin/lease. Un cuadro de diálogo titulado "El control remoto rechazó privado/arrendamiento" ofrece Fetch Only, Rebase and Push, Merge and Push y Force Push….
  4. Elija Fetch Only primero y lea el gráfico: la rama remota ahora tiene la confirmación de Leo, que su reescritura no contiene. Ese es el trabajo de un compañero de equipo.
  5. Abra Force Push…. El cuadro de diálogo "¿Forzar envío privado/arrendamiento al origen/arrendamiento?" dice que las confirmaciones que le faltan a su rama se eliminarán del control remoto, que la inserción continúa solo mientras el control remoto todavía esté en la confirmación que se muestra y que la sugerencia reemplazada se mantiene en refs/ogt/trash. Cancelar; El trabajo de Leo no es tuyo para reemplazarlo.
  6. En su lugar, reconcilia: Rebase and Push coloca tu borrador encima del de Leo, o pregúntale a él primero. Si se ejecutó un impulso forzado real, el aviso dice "Empujado forzado. La punta del control remoto reemplazado se mantiene en...", y Undo trata un impulso forzado como un cambio a un control remoto que se presiona nuevamente para volver a cambiar.

en la terminal

Después de la reversión, el shared:

Command · bash
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?

La respuesta es 0: el error queda en la historia y nadie se vio obligado a reparar un clon.

El private/lease, con la confirmación de Leo ya en el servidor, pruebe el contrato de arrendamiento fijado con la confirmación que revisó:

Command · bash
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short
Salida
 ! [rejected]        HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1

Git se niega ("información obsoleta"), el servidor aún nombra la confirmación de Leo y el estado está vacío. También se rechaza un git push --force-with-lease origin HEAD:lease simple mientras su referencia de seguimiento remoto sea antigua, pero después de git fetch origin lease el mismo comando reemplaza la confirmación de Leo, porque la búsqueda movió la referencia con la que se compara. Nombra la confirmación que revisaste o concíliala con una rebase.

Resultado

Where you end: la confirmación incorrecta todavía está en el historial de shared y se ha realizado una reversión normalmente. El lease se rechazó el envío fijado, el servidor aún mantiene la confirmación de Leo y su reescritura local está intacta. No se hizo ningún empujón forzado.

Errores comunes

  • Reescribir una rama que otras personas ya retiraron cuando una reversión sería suficiente.
  • Recuperar y luego forzar el envío con un contrato de arrendamiento básico, que ahora confía en lo que acaba de descargar.
  • Tratar un contrato de arrendamiento como un permiso para reemplazar el compromiso de un compañero de equipo.
  • Suponiendo que Deshacer puede revertir un impulso forzado en el servidor.

Si algo sale mal

Si un envío forzado reemplazó la sugerencia incorrecta, el compromiso reemplazado se mantiene en refs/ogt/trash (y, para envíos nativos, en su reflog y en el clon del compañero de equipo). Dígale al compañero de equipo, restaure la punta como una rama y empújela nuevamente con su acuerdo. Un empujón rechazado no cambió nada.

Comprueba tu comprensión

Responda cada pregunta y luego lea por qué. Las preguntas marcadas como "Obligatorias" cuentan para completar la lección.

  1. Pregunta 1 de 6

    Ya existe una confirmación incorrecta en la rama compartida. ¿Cuál es la reparación más segura?

    Elija una respuesta.

  2. Pregunta 2 de 6

    ¿Cuáles de estas son ciertas sobre --force-with-lease? (opción múltiple)

    Elija cada respuesta que corresponda.

  3. Pregunta 3 de 6
    Requerido

    Usted presiona con el contrato de arrendamiento fijado al compromiso que revisó, pero Leo presiona después de eso. ¿Lo que sucede?

    Elija una respuesta.

  4. Pregunta 4 de 6

    Cambia la entrada: ejecutas git fetch origin lease y luego un simple git push --force-with-lease origin HEAD:lease. ¿Lo que sucede?

    Elija una respuesta.

  5. Pregunta 5 de 6
    Requerido

    Un colega dice que "la fuerza con arrendamiento hace que el empuje forzado sea seguro para todos". ¿Cuál es la respuesta correcta?

    Elija una respuesta.

  6. Pregunta 6 de 6
    Requerido

    Después del envío fijado, ¿qué lecturas muestran que no se perdió nada? (opción múltiple)

    Elija cada respuesta que corresponda.

0 de 6 correcto

Responda correctamente las preguntas requeridas para completar la lección.

Comprobado en este navegador.

Practica

Informe la verificación de antepasados en shared, el código de salida y el mensaje del envío fijado, la confirmación ls-remote se muestra para lease y si se habría rechazado un contrato de arrendamiento simple antes y después de una recuperación.

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

  • Prefiere un nuevo compromiso para cualquier cosa que otros puedan tener.
  • Fije el contrato de arrendamiento al compromiso que revisó.
  • Un contrato de arrendamiento lo protege a usted, no a la intención de su compañero de equipo.

Términos del glosario introducidos

Arrendamiento — قفل; información obsoleta — معلومات قديمة; punta reemplazada - الرأس المستبدَل.

Transcripción del vídeo

La narración del vídeo, cue a cue.

Mostrar la transcripción
  1. Cometiste un error. ¿Y ahora qué?
  2. Si otros pueden tener el compromiso, repárelo agregando un compromiso.
  3. Un contrato de arrendamiento dice: reemplace el control remoto solo si todavía está donde espero.
  4. Pero una búsqueda mueve lo que es un arrendamiento desnudo espera.
  5. Dos sucursales en un servidor local: compartido, y arrendamiento.
  6. En compartido, revierta el compromiso incorrecto.
  7. Empuje normalmente. Sin fuerza.
  8. El error queda en la historia y nadie Debe reparar un clon.
  9. En caso de arrendamiento, se rechaza una sucursal reescrita.
  10. Busca sólo y mira. El compromiso de Leo es allí.
  11. Continúa sólo mientras el control remoto está en este compromiso y mantiene el consejo anterior.
  12. El trabajo de Leo no es tuyo para reemplazarlo. Rebase sobre él, o pregúntale.
  13. En la terminal, el antepasado verifica compartido es cero.
  14. Nombra el compromiso que revisaste. Git dice información obsoleta.
  15. El servidor todavía nombra el compromiso de Leo.
  16. Un arrendamiento simple después de una recuperación habría lo reemplazó.
  17. Deshacer no revierte un empujón forzado sobre un servidor.
  18. Práctica: reportar el código de salida, el servidor comprometerse y el estado.
  19. A continuación, trabaje en dos ramas a la vez con árboles de trabajo.