Saltar al contenido
GitTree

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.

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

  • 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

Extracto del archivo · 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

Extracto del archivo · 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: 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

Extracto del archivo · 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: 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

Salida
# 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

Salida
Local rehearsal note; preserve this file.

informes/vista previa.txt — IGNORED_NOTE

Salida
Ignored rehearsal preview; preserve these bytes.

En GitTree

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

  1. 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.
  2. Guarde LAYOUT como styles.css, prepare ese archivo y confírmelo con el Resumen style: widen the hero reading measure. El panel cuenta el cambio "en un CABEZAL desprendido" mientras trabajas.
  3. 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.
  4. Haga clic derecho en la etiqueta experiment/layout y elija Check Out Branch. HEAD está adjunto nuevamente, styles.css es LAYOUT y main todavía apunta a M.
  5. Dirty checkout. En otra copia, separe en experiment/layout, edite styles.css en DIRTY_LAYOUT sin confirmar e intente verificar main. 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 en refs/ogt/trash pero no es necesario aquí.
  6. 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 en refs/ogt/trash. Cancelar tiene el foco. Elija Create Orphan Branch.
  7. 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.md desde ORPHAN_README, prepárelo y confírmelo con el Resumen docs: start the separate project guide. La nueva confirmación no tiene padre.
  8. Comparar: main todaví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:

Command · bash
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:

Command · bash
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 --short
Salida
1
experiment/layout

El 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:

Command · bash
git switch --orphan orphan-docs
git symbolic-ref --short HEAD
git rev-parse --verify --quiet HEAD; echo $?
git ls-files
Salida
orphan-docs
1

La 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:

Command · bash
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 $?
Salida
README.md
1
1

La 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 .gitignore abandone 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.

  1. Pregunta 1 de 6

    ¿Qué es una CABEZA desprendida?

    Elija una respuesta.

  2. Pregunta 2 de 6

    ¿Cuáles de estas son ciertas sobre una rama huérfana? (opción múltiple)

    Elija cada respuesta que corresponda.

  3. Pregunta 3 de 6
    Requerido

    Te comprometes con un HEAD separado, creas experiment/layout allí sin verificarlo y miras HEAD. ¿Qué es?

    Elija una respuesta.

  4. Pregunta 4 de 6

    Cambie la entrada: el árbol de trabajo tiene una edición no confirmada en styles.css cuando intenta verificar main. ¿Lo que sucede?

    Elija una respuesta.

  5. Pregunta 5 de 6
    Requerido

    git ls-files no imprime nada inmediatamente después de git switch --orphan orphan-docs. ¿Pasa algo mal?

    Elija una respuesta.

  6. Pregunta 6 de 6
    Requerido

    Después de la primera confirmación en orphan-docs, ¿qué relecturas muestran que es una raíz separada? (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 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.

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
  1. ¿Dónde está CABEZA? Tres estados.
  2. HEAD puede nombrar una rama, una confirmación o una rama sin compromiso todavía.
  3. Un compromiso realizado estando separado es real, pero nada lo nombra.
  4. Una rama en ese compromiso lo mantiene accesible.
  5. Haga clic derecho en la confirmación M y elija Comprobar Fuera de este compromiso.
  6. Cambie la hoja de estilo, prepárela y comprometerse una vez.
  7. Haga clic derecho en la nueva confirmación y cree una sucursal aquí, sin comprobarlo.
  8. Ahora mira la sucursal. CABEZA está adjunta otra vez.
  9. Con una edición no guardada, se realiza un pago se negó. Cancelar se queda con todo.
  10. Comprometerse primero, guardar y cambiar, o descartar. Descartar es el que hay que evitar.
  11. Para un nuevo historial, ejecute Crear huérfano Rama de la paleta.
  12. Cuenta los archivos rastreados que salen. Los que no son rastreados y los ignorados permanecen.
  13. Confirmar. La carpeta no tiene archivos rastreados.
  14. Agregue un archivo Léame y confirme. Este compromiso tiene ningún padre.
  15. En la terminal, la referencia simbólica sale 1 cuando LA CABEZA está separada.
  16. En una rama no nacida, análisis rápido de HEAD falla.
  17. Después de la confirmación, merge-base no encuentra ancestro común.
  18. Si te quedaste sin sucursal, el reflog todavía lo tiene.
  19. Práctica: nombra HEAD en cada estado, luego predecir un archivo ignorado.
  20. A continuación, recupérese de los errores después de empujar.