Compartir tecnología

[Notas de estudio de Git] Capítulo 4 Operación de rebase de git rebase y ejemplos relacionados (Parte 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Capítulo 4 Operaciones de rebase y casos relacionados

【tema relacionado】

  • Voluntad commit Rebase de versión a otra rama
  • Realizar rebase en caso de conflicto de versiones
  • Realizar una rebase interactiva en una versión específica
  • Uso del cambio de base interactivo para agregar versiones
  • Cambiar los confirmadores mediante el cambio de base interactivo
  • Versión de agregación automática

4.0 Introducción al rebase

Rebase (Rebasing ) es una característica extremadamente poderosa de Git.El rebase es un tipo de operación: si uncommit A El primero se basó encommit B de; entoncesA Rebase aC, es decir, voluntad A basarse enC operación.

En el siguiente caso de demostración, descubrirá que el rebase a menudo no es tan fácil como parece.

4.1 voluntad commit Rebase de versión a otra rama

Veamos primero el tipo más simple de operación de rebase. Trabajo de preparación relacionado: introducir un nuevo archivo, enviarlo, cambiar el contenido y enviarlo nuevamente.De esta manera, hay el doble de locales.commit Versión.

Todavía con jgit Biblioteca por ejemplo:

# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
    
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Antes de rebasar:

Insertar descripción de la imagen aquí

Después de rebasar:

Insertar descripción de la imagen aquí

git rebase El proceso de ejecución:

  1. aparecer HEAD La versión común entre la rama de destino apuntada por el rebase (merge-base);
  2. Residencia en merge-base, busque todas las versiones que faltan en la rama de destino;
  3. Intente aplicar las versiones que faltan una por una en la rama de destino.

4.2 Realización de cambios de base en caso de conflictos de versiones

si un commit versión o unabranch Rebase una rama a una diferenteHEAD , es probable que se produzcan conflictos de versiones.En este punto, el conflicto debe resolverse y ejecutar el comando.git rebase --continue, se puede completar la rebase.

Los ejemplos de esta sección demuestran cómo lograr el rebase en presencia de conflictos.Siguiendo el resultado final demostrado en la Sección 4.1, esta vezrebaseExample La sucursal ha sido reubicada astable-3.2 rama.El ejemplo volverá a verificar la nueva rama de stable-3.1 y agregará un yrebaseExample Archivos de texto con el mismo nombre de rama pero contenidos incompatiblesfishtank.txt

# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

La situación del conflicto es la siguiente:

Insertar descripción de la imagen aquí

Cambie al siguiente contenido, guarde y cierre:

Insertar descripción de la imagen aquí

Agregue los archivos combinados y continúe rebasando:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

El editor que se abre se muestra en la figura:

Insertar descripción de la imagen aquí

Confirme, guarde y cierre, y verá un mensaje indicando que el cambio de base se realizó correctamente:

$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
 1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Los detalles son los siguientes:

Insertar descripción de la imagen aquí

Se puede ver que en este rebase, solo se rebasarán las versiones que están presentes en la rama anterior pero no en la nueva rama (es decir, se agregarán nuevas versiones) commit)。

En la información del indicador de git de la primera interrupción de rebase, también puede ver dos alternativas:

  1. git rebase --abort: Como significado literal, interrumpir la rebase

  2. git rebase --skip: Omita los conflictos y cambie la base directamente, lo que resultará en rebaseExample2 Desechar lo nuevocommit, fusionado directamente con rebaseExample, señaló el padre después de rebasar, y rebaseExample Coherente:

    Insertar descripción de la imagen aquí


4.3 Realizar una rebase interactiva en una versión específica

En este ejemplo, utilizamos el rebaseExample Basado en ramas, demuestre cómo usar--interactive Mark, rebase los dos en 4.1commit Rebase a la rama de seguimiento remotostable-3.1 superior:

$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
  (use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
  • 1
  • 2
  • 3
  • 4
  • 5

En este momento, se mostrará una lista de confirmaciones en el nuevo editor emergente, con el rango rebaseExample ystable-3.1 entre, todo se puede rebasar astable-3.1 decommit Registro.Mantenga los dos nuevos en el ejemplo.commit, elimine todo el resto (es decir, el contenido de la línea 89 y anteriores):

Insertar descripción de la imagen aquí

Después de guardar, salga del editor y verá el siguiente resultado:

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
  • 1
  • 2
  • 3

El resultado es el siguiente:

Insertar descripción de la imagen aquí

Extensión de ejemplo

En este ejemplo, también puede lograr rápidamente el efecto deseado mediante un comando:

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
  • 1
  • 2

El diagrama antes y después del rebase es el siguiente:

Insertar descripción de la imagen aquí