Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
【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
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.
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.
Antes de rebasar:
Después de rebasar:
git rebase
El proceso de ejecución:
HEAD
La versión común entre la rama de destino apuntada por el rebase (merge-base
);merge-base
, busque todas las versiones que faltan en la rama de destino;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
La situación del conflicto es la siguiente:
Cambie al siguiente contenido, guarde y cierre:
Agregue los archivos combinados y continúe rebasando:
$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
El editor que se abre se muestra en la figura:
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
Los detalles son los siguientes:
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:
git rebase --abort
: Como significado literal, interrumpir la rebase
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:
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
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):
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:
El resultado es el siguiente:
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.
El diagrama antes y después del rebase es el siguiente: