Saltar al contenido
GitTree

Lección 25 · Historia e integración

Aplicar confirmaciones seleccionadas con selección de cereza

Copie la corrección de un compañero de equipo en su rama de lanzamiento sin fusionar toda su rama, luego verifique la nueva confirmación, su autor, sus archivos y lo que quedó.

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 el compromiso para copiar y vea por qué su padre no aparece.
  • Predecir el ID, el autor y el confirmador del nuevo compromiso.
  • Reconozca una dependencia faltante o un cambio ya aplicado antes de forzar algo.
  • Verifique el resultado con la rama fuente.

Antes de empezar

La rama de Priya priya/label tiene dos confirmaciones por encima de una línea base compartida B (la página de registro). La primera es una nota no relacionada, "docs: nota fuente no relacionada", que agrega docs/temporary-review.md. La segunda es su solución, "solución: aclarar la etiqueta de correo electrónico ficticia", que cambia la etiqueta en index.html. Su rama release/label comienza desde la misma línea base B y tiene una confirmación propia, "docs: record target review", que agrega docs/integration-note.md. release/label está desprotegido y el árbol de trabajo está limpio. Quieres que se fije en tu sucursal, pero no en su nota.

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.

Cherry-pick toma el cambio que realizó una confirmación, lo mide con respecto a su propio padre y lo aplica a la rama en la que se encuentra como una confirmación new. No trae al padre ni trae las confirmaciones antes que él. Es exactamente por eso que puedes tomar la dosis de Priya y dejar su nota.

La confirmación de la fuente no se modifica. La nueva confirmación tiene una nueva ID porque tiene un nuevo padre, pero conserva el autor y el mensaje originales. El autor del compromiso, la persona que realizó este compromiso, eres tú. El mismo cambio con el mismo mensaje sigue siendo una confirmación diferente.

Las dependencias siguen siendo importantes. La solución edita una línea del formulario de registro, por lo que la rama de destino ya debe tener ese formulario. Si no es así, Git se detiene con un conflicto. Si el objetivo ya contiene el mismo cambio, la selección estará vacía y Git se detendrá nuevamente. En ambos casos mira lo que dice la operación; no fuerces un compromiso vacío solo para superarlo.

Sólo se mueve la rama objetivo. priya/label y todo en un servidor permanece como estaba. La nueva confirmación agrega el cambio de etiqueta a release/label y nada más.

Prepare el estado exacto del proyecto

Comience con una copia normal separada del proyecto tal como lo dejó la lección 18 y deje su gittree-features original intacto. Guarde SIGNUP como base y luego cree las dos ramas. Los cuerpos siguientes son la página base (SIGNUP), la nota no relacionada (DOC_NOISE), la página fija (SIGNUP_LABEL) y su propia nota (DOC_MERGE).

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

Extracto del archivo · html
<!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/revisión-temporal.md — DOC_NOISE

Salida
Temporary rehearsal note, deliberately dropped.

index.html — SIGNUP_LABEL

Extracto del archivo · html
<!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/integration-note.md — DOC_MERGE

Salida
# Integration review

This note was written on main while signup work was private.

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.

  1. Construya la línea base y las dos ramas como se muestra en la siguiente sección. Consulte release/label y confirme que el árbol de trabajo esté limpio.
  2. En el gráfico, encuentre la "solución" de confirmación de Priya: aclarar la etiqueta de correo electrónico ficticia, no la nota debajo. Selecciónelo y lea sus detalles: una ruta modificada, index.html, y su padre es la nota no relacionada.
  3. Haga clic derecho en esa confirmación y elija Cherry-Pick Commit. Se aplica de inmediato a la sucursal en la que se encuentra; no hay selector de sucursales. El comando está deshabilitado en la confirmación que ya es la actual.
  4. Espere el resultado real. Si una operación se detiene, utilice Resolve, Continue o Abort… en el banner en lugar de volver a seleccionar.
  5. Seleccione la nueva confirmación el release/label. Su ID difiere de la de Priya, la autora es Priya Nair y el autor de la confirmación es GitTree Demo.
  6. Abierto index.html: es SIGNUP_LABEL. docs/temporary-review.md no está ahí y tu propio docs/integration-note.md sí. priya/label todavía nombra su antiguo consejo.
  7. Deja release/label limpio. No presione ni combine priya/label.

Si selecciona dos o más confirmaciones en el gráfico, el menú ofrece Cherry-Pick Commits y las copia en orden. Esta lección copia una.

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 una copia separada del resultado de la lección 18, cree la rama de referencia antes de guardar REGÍSTRESE:

Command · bash
git switch --create label-base

Guarde REGÍSTRESE como index.html y luego:

Command · bash
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/label

Guarde DOC_NOISE como docs/temporary-review.md y luego:

Command · bash
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"

Guarde SIGNUP_LABEL como index.html y luego:

Command · bash
git add -- index.html
git -c user.name="Priya Nair" -c user.email=priya@example.com commit --quiet -m "fix: clarify the fictional email label"
PICK_SHA="$(git rev-parse HEAD)"
git switch --create release/label "$BASE_SHA"

Guarde DOC_MERGE como docs/integration-note.md y luego:

Command · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"

Ahora elige la solución y lee el resultado:

Command · bash
git cherry-pick "$PICK_SHA"
git log -1 --format='%s%n%an <%ae>%n%cn <%ce>'
git diff-tree --no-commit-id --name-only -r HEAD
git status --short
Salida
fix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.html

El ID de la nueva confirmación difiere de PICK_SHA, index.html es SIGNUP_LABEL, docs/temporary-review.md está ausente y el estado está vacío. Dos variaciones que debes conocer, ejecutadas en copias separadas, nunca en la canónica: git cherry-pick -x "$PICK_SHA" agrega la línea "(cherry picks from commit...)" al nuevo mensaje, lo que ayuda cuando seleccionas entre ramas compartidas; y en un objetivo que carece del formulario de registro, el mismo comando se detiene con un conflicto en index.html, que resuelves (lección 23) o lo abandonas con git cherry-pick --abort. Si el objetivo ya tiene el cambio, Git se detiene nuevamente con una selección vacía y git cherry-pick --skip o --abort es la salida.

Resultado

Where you end: release/label tiene una nueva confirmación con la solución de Priya, escrita por Priya Nair y confirmada por GitTree Demo, con una nueva ID. La página tiene la etiqueta aclarada, la nota no relacionada no apareció, priya/label y el servidor no han cambiado y el árbol de trabajo está limpio.

Errores comunes

  • Pensar en una selección selectiva mueve el compromiso. Copia el cambio; el original permanece donde estaba.
  • Elegir la confirmación incorrecta, la nota no relacionada en lugar de la solución.
  • Forzar una confirmación vacía cuando el cambio ya está en la rama.
  • Usar selección selectiva para copiar una característica completa, una confirmación a la vez, en lugar de fusionarla.

Si algo sale mal

Si la selección se detiene, lea el cartel. Resolve y Continue termínelo como en la lección 23; Abort… devuelve la rama a donde estaba. Si la selección fue un error después de finalizar, la nueva confirmación solo se realiza en release/label: deshazla allí y la rama de origen nunca se tocará.

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é significa una copia seleccionada?

    Elija una respuesta.

  2. Pregunta 2 de 6

    Después de la elección, ¿cuáles de estas afirmaciones son ciertas sobre el nuevo compromiso?

    Elija cada respuesta que corresponda.

  3. Pregunta 3 de 6
    Requerido

    La solución de Priya se encuentra encima de una confirmación de nota no relacionada. Seleccionas solo la solución en release/label. ¿docs/temporary-review.md sale release/label después?

    Elija una respuesta.

  4. Pregunta 4 de 6

    Cambie la entrada: release/label no tiene el formulario de registro que edita la corrección de Priya. ¿Qué pasa cuando eliges?

    Elija una respuesta.

  5. Pregunta 5 de 6
    Requerido

    Eliges una confirmación y Git se detiene con "La selección anterior ahora está vacía". El cambio ya está en tu sucursal. ¿A qué te dedicas?

    Elija una respuesta.

  6. Pregunta 6 de 6
    Requerido

    ¿Qué relecturas muestran que la selección hizo lo que dice la lección?

    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 el ID, el autor y el confirmador de la nueva confirmación, sus rutas modificadas y si docs/temporary-review.md existe. Luego predice qué sucede si vuelves a elegir el mismo compromiso en release/label.

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

  • Cherry-pick copia el cambio de una confirmación como una nueva confirmación.
  • El padre y las confirmaciones anteriores se quedan atrás.
  • Verifique las dependencias y las selecciones vacías antes de forzar algo.

Términos del glosario introducidos

Selección de cereza - انتقاء; confirmación de fuente - إيداع المصدر; objetivo — الهدف; dependencia — اعتماد.

Transcripción del vídeo

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

Mostrar la transcripción
  1. Tome una solución de otra rama y deja el resto.
  2. Cherry-pick copia el cambio en una confirmación hecho, como un nuevo compromiso aquí.
  3. La copia tiene un nuevo ID, pero conserva el Autor y mensaje.
  4. Construya una línea de base, la rama de Priya con un nota y una solución, y su rama de lanzamiento.
  5. Abra la carpeta. El gráfico muestra ambos ramas desde la misma línea de base.
  6. La solución de Priya se encuentra encima de una no relacionada nota. Sólo queremos la solución.
  7. Seleccione la solución. Un camino cambiado: índice.html.
  8. Asegúrese de que la etiqueta de lanzamiento esté actualizada y el árbol de trabajo está limpio.
  9. Haga clic derecho en la solución y elija Compromiso de elección selectiva.
  10. No hay selector de sucursales. Se aplica a la sucursal en la que te encuentras.
  11. En la confirmación actual, el comando está deshabilitado.
  12. Ejecútelo y espere el resultado real.
  13. Hay un nuevo compromiso en la etiqueta de lanzamiento.
  14. Su identificación difiere de la de Priya, porque su padre es diferente.
  15. La autora sigue siendo Priya. el comprometido eres tu.
  16. La página tiene la etiqueta aclarada.
  17. La nota no relacionada no llegó. Tu propia nota todavía está aquí.
  18. La sucursal de Priya está exactamente como estaba.
  19. En la terminal, git log con un formato muestra el sujeto, el autor y el autor.
  20. git diff-tree enumera las rutas de este el compromiso cambió.
  21. El estado está vacío. No quedó nada detrás.
  22. Con la opción x, el mensaje graba de donde vino la elección.
  23. Elija el mismo compromiso nuevamente y Git se detendrá: la selección está vacía.
  24. Cambiar la entrada: el objetivo no tiene registro forma.
  25. La elección se detiene con un conflicto. resolver y continuar o cancelar.
  26. Un cambio puede depender de confirmaciones que no hiciste tomar. Prueba el objetivo.
  27. Abortar devuelve la rama. La fuente es nunca modificado.
  28. Práctica: informar el nuevo ID, autor, confirmador y archivos.
  29. A continuación, deje a un lado de forma segura el trabajo sin terminar. con alijo.