le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
[Argomento correlato]
- Volere
commit
Ribasare la versione su un altro ramo- Eseguire il rebase in caso di conflitto di versione
- Esegui un rebase interattivo su una versione specificata
- Utilizzo del rebasing interattivo per versioni aggregate
- Modifica dei committer utilizzando il rebasing interattivo
- Versione di aggregazione automatica
Ribasare (Rebasing
) è una funzionalità estremamente potente di Git.Il rebasing è un tipo di operazione: se acommit
UN Il primo era basato sucommit
B di; quindiUN Ribasare aC, cioè volontà UN diventare basato suC operazione.
Nel seguente caso dimostrativo scoprirai che il rebasing spesso non è così semplice come sembra.
commit
Ribasare la versione su un altro ramo Diamo prima un'occhiata al tipo più semplice di operazione di rebase. Lavoro di preparazione correlato: introdurre un nuovo file, inviare, modificare il contenuto e inviare di nuovo.In questo modo i locali sono il doppiocommit
Versione.
Ancora con jgit
Biblioteca ad esempio:
# 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.
Prima di ribasare:
Dopo il ribasamento:
git rebase
Il processo di esecuzione:
HEAD
La versione comune tra il ramo di destinazione indicato dal rebase (merge-base
);merge-base
, trova tutte le versioni mancanti sul ramo di destinazione;Se un commit
versione o abranch
Ribase un ramo in un altroHEAD
, è probabile che si verifichino conflitti di versione.A questo punto occorre risolvere il conflitto ed eseguire il comandogit rebase --continue
, il rebase può essere completato.
Gli esempi in questa sezione dimostrano come eseguire il rebasing in presenza di conflitti.Dopo il risultato finale dimostrato nella Sezione 4.1, questa voltarebaseExample
La filiale è stata riorganizzata instable-3.2
ramo.L'esempio ricontrollerà il nuovo ramo da stable-3.1 e aggiungerà un andrebaseExample
File di testo con lo stesso nome di ramo ma contenuti incompatibilifishtank.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 situazione del conflitto è la seguente:
Passa al contenuto seguente, salva e chiudi:
Aggiungi i file uniti e continua a riorganizzare:
$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
L'editor che si apre è mostrato in figura:
Conferma, salva e chiudi e vedrai un messaggio che indica che il rebase ha avuto successo:
$ 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
I dettagli sono i seguenti:
Si può vedere che in questo rebase verranno ribasate solo le versioni presenti nel vecchio ramo ma non nel nuovo ramo (ovvero verranno aggiunte nuove versioni) commit
)。
Nelle informazioni del prompt git della prima interruzione del rebase, puoi anche vedere due alternative:
git rebase --abort
: Come significato letterale, interrompe il rebase
git rebase --skip
: Salta i conflitti e rebase direttamente, il che comporterà rebaseExample2
Scartare il nuovocommit
, direttamente fuso in rebaseExample
, ha indicato il genitore dopo aver ribasato, e rebaseExample
Coerente:
In questo esempio utilizziamo il file rebaseExample
Sulla base dei rami, dimostra come utilizzare--interactive
Mark, ribase i due in 4.1commit
Rebase al ramo di monitoraggio remotostable-3.1
superiore:
$ 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
A questo punto, nel nuovo editor pop-up verrà visualizzato un elenco di commit, con l'intervallo rebaseExample
Estable-3.1
in mezzo, tutto può essere ribasatostable-3.1
Dicommit
Documentazione.Mantieni i due nuovi nell'esempiocommit
, elimina tutto il resto (ovvero il contenuto alla riga 89 e precedenti):
Dopo aver salvato, esci dall'editor e vedrai il seguente output:
$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
Il risultato è il seguente:
Estensione di esempio
In questo esempio puoi anche ottenere rapidamente l'effetto desiderato tramite un comando:
$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
Lo schema prima e dopo il rebasing è il seguente: