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ó.
- Nivel: Avanzado
- 9 minutos de lectura
- 4 minutos de vídeo
- Actualizado
- Antes de esta lección: Empujar confirmaciones y publicar una rama, Revertir un cambio en el historial compartido, Encuentra un compromiso perdido con reflog
Progreso guardado en este navegador.
La reproducción carga el vídeo de YouTube (modo de privacidad mejorada).
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
: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
# Private release rehearsal
The reviewed draft is still private.docs/lease-note.md — ARRENDAMIENTO_B
# Private release rehearsal
Leo added a review that must not be overwritten.docs/lease-note.md — LEASE_REWRITE
# 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).
- Cree el ensayo como se muestra en la siguiente sección: la confirmación incorrecta enviada a
sharedy la ramaleasecon la confirmación más reciente de Leo en el servidor. - 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)…. - 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, porqueprivate/leaserastrea aorigin/leasecon 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…. - 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.
- 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. - 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:
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ó:
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short ! [rejected] HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1Git 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.
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.
Relacionado
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
- Cometiste un error. ¿Y ahora qué?
- Si otros pueden tener el compromiso, repárelo agregando un compromiso.
- Un contrato de arrendamiento dice: reemplace el control remoto solo si todavía está donde espero.
- Pero una búsqueda mueve lo que es un arrendamiento desnudo espera.
- Dos sucursales en un servidor local: compartido, y arrendamiento.
- En compartido, revierta el compromiso incorrecto.
- Empuje normalmente. Sin fuerza.
- El error queda en la historia y nadie Debe reparar un clon.
- En caso de arrendamiento, se rechaza una sucursal reescrita.
- Busca sólo y mira. El compromiso de Leo es allí.
- Continúa sólo mientras el control remoto está en este compromiso y mantiene el consejo anterior.
- El trabajo de Leo no es tuyo para reemplazarlo. Rebase sobre él, o pregúntale.
- En la terminal, el antepasado verifica compartido es cero.
- Nombra el compromiso que revisaste. Git dice información obsoleta.
- El servidor todavía nombra el compromiso de Leo.
- Un arrendamiento simple después de una recuperación habría lo reemplazó.
- Deshacer no revierte un empujón forzado sobre un servidor.
- Práctica: reportar el código de salida, el servidor comprometerse y el estado.
- A continuación, trabaje en dos ramas a la vez con árboles de trabajo.