Lección 31 · Recuperación
Mantener el trabajo desprendido y comenzar una historia huérfana
Nombre una confirmación realizada en un HEAD separado antes de abandonarlo, luego inicie una rama huérfana en una copia separada y vea qué elimina y qué conserva.
- Nivel: Intermedio
- 11 minutos de lectura
- 5 minutos de vídeo
- Actualizado
- Antes de esta lección: Cree una rama de funciones y retire solo la referencia desechable, 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
- Distinga la CABEZA adjunta, separada y no nacida.
- Coloque una rama en una confirmación separada para que permanezca accesible.
- Prediga lo que hace una rama huérfana con los archivos rastreados, los archivos sin seguimiento y la rama antigua.
- Lea un rechazo de pago causado por cambios locales.
Antes de empezar
Dos copias desechables del resultado M de la lección 18. En la primera, verifica el compromiso M en sí en lugar de la rama, realiza un pequeño cambio en la hoja de estilo allí y desea conservarlo. En el segundo, desea un historial nuevo y no relacionado para una rama de solo documentación sin tocar main.
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.
HEAD normalmente nombra una rama y la confirmación mueve esa rama. Cuando HEAD nombra una confirmación directamente, es detached: una nueva confirmación es real, pero nada la nombra, por lo que al desactivarla se puede acceder a ella solo a través del reflog. Ponerle una rama soluciona eso. Al crear una rama no se cambia a ella a menos que usted elija hacerlo.
Una rama orphan es diferente. HEAD nombra una rama que aún no se ha comprometido (una rama por nacer). Su primera confirmación no tiene padre, por lo que no comparte historial con main. Git elimina los archivos rastreados de la carpeta de trabajo; Los archivos ignorados y sin seguimiento permanecen. Si se realizó un seguimiento del antiguo .gitignore, sus reglas lo acompañarán y los archivos que se ignoraron ahora pueden mostrarse como sin seguimiento. Tu antigua rama mantiene todos los compromisos.
Ambos estados son normales, no daños. Se rechaza un pago cuando sobrescribe los cambios locales; no se pierde nada.
Prepare el estado exacto del proyecto
Comience con dos copias ordinarias separadas del resultado de la lección 18 y deje el original intacto. Los cuerpos siguientes son la hoja de estilo básica (BASE_CSS), la ampliada (LAYOUT), una edición sucia (DIRTY_LAYOUT), el archivo Léame del huérfano (ORPHAN_README), una nota local (LOCAL_NOTE) y una nota ignorada (IGNORED_NOTE).
Entradas de archivos completas
Guarde cada cuerpo UTF-8/LF completo solo en su fase indicada, con una nueva línea final y sin vallas de Markdown. BASE_CSS es la referencia 48rem heredada; DISEÑO es el compromiso de 52rem; DIRTY_LAYOUT es una repetición de 56rem independiente y no preparada. Los dos archivos de notas pertenecen únicamente a la variante superviviente. Los archivos principales sin cambios heredan la entrada L018/M completa.
estilos.css — BASE_CSS
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #17212e;
--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;
}estilos.css — DISEÑO
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #17212e;
--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: 52rem;
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;
}estilos.css — DIRTY_LAYOUT
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #17212e;
--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: 56rem;
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;
}README.md — ORPHAN_README
# GitTree Features documentation
This branch contains a documentation-only history for the fictional course project.
The landing page remains on main; no form submits information to a server.
Keep useful detached experiments under a branch name before switching away.revisión-local.txt — LOCAL_NOTE
Local rehearsal note; preserve this file.informes/vista previa.txt — IGNORED_NOTE
Ignored rehearsal preview; preserve these bytes.En GitTree
Abra la paleta con Comando+Mayús+P (Ctrl+Mayús+P en Ubuntu).
- En la primera copia, haga clic derecho en la confirmación M en el gráfico y elija Check Out This Commit. El selector de sucursales dice "Separado en..." y el gráfico muestra HEAD, detached.
- Guarde LAYOUT como
styles.css, prepare ese archivo y confírmelo con el Resumenstyle: widen the hero reading measure. El panel cuenta el cambio "en un CABEZAL desprendido" mientras trabajas. - Haga clic derecho en la nueva confirmación y elija Create Branch Here…. Nómbrelo
experiment/layout, deje desactivada la opción para comprobarlo y elija Create Branch. El aviso dice "Experimento/diseño creado". y HEAD todavía está separado. - Haga clic derecho en la etiqueta
experiment/layouty elija Check Out Branch. HEAD está adjunto nuevamente,styles.csses LAYOUT ymaintodavía apunta a M. - Dirty checkout. En otra copia, separe en
experiment/layout, editestyles.cssen DIRTY_LAYOUT sin confirmar e intente verificarmain. El cuadro de diálogo "Los cambios locales están en el camino principal" enumera el archivo y ofrece Commit First, Stash and Switch y Discard and Switch. Elija Cancelar; descartar mantiene una copia enrefs/ogt/trashpero no es necesario aquí. - Orphan. En la segunda copia, con un árbol de trabajo limpio, ejecute Create Orphan Branch… desde la paleta. En "¿Crear una rama huérfana en...?" escriba
orphan-docs. El cuadro de diálogo indica cuántos archivos rastreados abandonan la carpeta de trabajo, qué archivos ignorados y sin seguimiento permanecen y que la confirmación anterior se mantiene enrefs/ogt/trash. Cancelar tiene el foco. Elija Create Orphan Branch. - El aviso dice "Cambiado a la nueva rama huérfana orphan-docs. Deshacer vuelve atrás". La carpeta no tiene archivos rastreados y el gráfico no muestra ninguna confirmación en la nueva rama. Cree
README.mddesde ORPHAN_README, prepárelo y confírmelo con el Resumendocs: start the separate project guide. La nueva confirmación no tiene padre. - Comparar:
maintodavía tiene todas las confirmaciones; la rama huérfana es una raíz separada. No presione ninguna de las copias.
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
En la primera copia:
BASE_SHA="$(git rev-parse main)"
git switch --detach "$BASE_SHA"
git symbolic-ref --quiet --short HEAD; echo $?El último comando imprime 1: HEAD no es una rama. Guarde LAYOUT como styles.css y luego:
git commit --quiet -am "style: widen the hero reading measure"
git branch experiment/layout
git symbolic-ref --quiet --short HEAD; echo $?
git rev-parse HEAD^ main
git switch --quiet experiment/layout
git symbolic-ref --short HEAD
git status --short1
experiment/layoutEl comando de creación no adjunta HEAD (la segunda consulta todavía imprime 1), los dos ID de rev-parse son iguales (M) y el estado está vacío. En otra copia separada en experiment/layout, edite styles.css y ejecute git switch main: Git se niega con "Sus cambios locales en los siguientes archivos se sobrescribirán al finalizar la compra" y el archivo no se modifica.
En el segundo ejemplar, con un árbol limpio:
git switch --orphan orphan-docs
git symbolic-ref --short HEAD
git rev-parse --verify --quiet HEAD; echo $?
git ls-filesorphan-docs
1La rama existe pero no tiene confirmación (rev-parse sale 1) y ls-files no imprime nada. Los archivos rastreados desaparecen de la carpeta, mientras que local-review.txt y reports/ permanecen y ahora se muestran como sin seguimiento. Crea README.md, luego:
git add -- README.md
git commit --quiet -m "docs: start the separate project guide"
git ls-tree -r --name-only HEAD
git rev-list --max-parents=0 --count HEAD
git merge-base --all main orphan-docs; echo $?README.md
1
1La nueva rama tiene una confirmación raíz y ningún ancestro común con main (merge-base no imprime nada y sale 1).
Resultado
Where you end: la confirmación separada se llama experiment/layout y está desprotegida, main todavía apunta a M y el árbol está limpio. La copia huérfana tiene orphan-docs con una confirmación raíz que no tiene padre, los archivos antiguos rastreados desaparecieron de la carpeta pero main los conserva y no se envió nada.
Errores comunes
- Confirmarse en un HEAD separado y cambiar sin una rama, lo que deja la confirmación accesible solo a través del reflog.
- Esperando que
Create Branch Here…cambie a la nueva sucursal. - Iniciar una rama huérfana con cambios rastreados no confirmados o pensar que elimina
main. - Suponiendo que un archivo que fue ignorado permanece ignorado después de que su
.gitignoreabandone la carpeta.
Si algo sale mal
Si dejaste una confirmación separada sin nombre, abre el reflog (lección 29) y ponle una rama. Si una rama huérfana fue un error, Undo regresa mientras la nueva rama no tiene confirmación; de lo contrario, consulte main nuevamente. Un pago 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 dónde apunta HEAD en cada estado (rama, separada, no nacida), el ID de la confirmación separada y la rama en ella, y qué git ls-files imprimió en la rama huérfana. Luego predice qué sucederá con un archivo ignorado cuando .gitignore desaparezca.
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
- Una confirmación independiente necesita una rama para permanecer accesible.
- Una rama huérfana inicia una raíz separada y elimina los archivos rastreados de la carpeta.
- Un pago rechazado protege su edición.
Relacionado
Términos del glosario introducidos
CABEZA separada — CABEZA منفصل; rama huérfana — فرع يتيم; rama no nacida—فرع غير مولود; confirmación raíz - إيداع جذري.
Transcripción del vídeo
La narración del vídeo, cue a cue.
Mostrar la transcripción
- ¿Dónde está CABEZA? Tres estados.
- HEAD puede nombrar una rama, una confirmación o una rama sin compromiso todavía.
- Un compromiso realizado estando separado es real, pero nada lo nombra.
- Una rama en ese compromiso lo mantiene accesible.
- Haga clic derecho en la confirmación M y elija Comprobar Fuera de este compromiso.
- Cambie la hoja de estilo, prepárela y comprometerse una vez.
- Haga clic derecho en la nueva confirmación y cree una sucursal aquí, sin comprobarlo.
- Ahora mira la sucursal. CABEZA está adjunta otra vez.
- Con una edición no guardada, se realiza un pago se negó. Cancelar se queda con todo.
- Comprometerse primero, guardar y cambiar, o descartar. Descartar es el que hay que evitar.
- Para un nuevo historial, ejecute Crear huérfano Rama de la paleta.
- Cuenta los archivos rastreados que salen. Los que no son rastreados y los ignorados permanecen.
- Confirmar. La carpeta no tiene archivos rastreados.
- Agregue un archivo Léame y confirme. Este compromiso tiene ningún padre.
- En la terminal, la referencia simbólica sale 1 cuando LA CABEZA está separada.
- En una rama no nacida, análisis rápido de HEAD falla.
- Después de la confirmación, merge-base no encuentra ancestro común.
- Si te quedaste sin sucursal, el reflog todavía lo tiene.
- Práctica: nombra HEAD en cada estado, luego predecir un archivo ignorado.
- A continuación, recupérese de los errores después de empujar.