- Git rebase
- Prima di riassegnazione
- Regolare rebase
- Interactive rebase
- Forza-push
- Unisci i conflitti
Questa guida vi aiuterà a iniziare con la riassegnazione, forza di spinta, e fixingmerge conflitti a livello locale.
Prima di tuffarsi in questo documento, assicurarsi di avere familiarità con usingGit attraverso la riga di comando.
Git rebase
Rebasing è un’operazione molto comune inGit., Ci sono le seguenti opzioni di rebase:
- Rebase regolare.
- Rebase interattivo.
Prima di rinominare
git rebase
riscrive la cronologia di commit. Può essere dannoso farlo dentrorami condivisi. Può causare conflitti di unione complessi e difficili da risolvere. In questi casi,invece di rinominare il ramo contro il ramo predefinito, considera di tirarlo invece (git pull origin master
). Ha un effetto simile senza compromettere il lavoro dei tuoi contributori., È più sicuro eseguire il backup del ramo prima del rebasing per assicurarsi di non perdere alcuna modifica. Per esempio, consideriamo una funzione branchcalled my-feature-branch
:
-
Aprire il ramo terminale:
git checkout my-feature-branch
-
Checkout di un nuovo ramo di essa:
git checkout -b my-feature-branch-backup
-
torna al tuo originale ramo:
git checkout my-feature-branch
Ora si può tranquillamente rebase di esso., Se qualcosa va storto, puoi recuperare i tuoi cambiamenti reimpostandomy-feature-branch
contromy-feature-branch-backup
:
Nota che se hai aggiunto modifiche amy-feature-branch
dopo aver creato il ramo di backup,le perdi durante il ripristino.
Regular rebase
Con una regular rebase puoi aggiornare il tuo ramo feature con defaultbranch (o qualsiasi altro ramo).Questo è un passo importante per le strategie di sviluppo basate su Git., Puoi assicurarti che le modifiche che stai aggiungendo alla base di codice non interrompano le modifiche esistenti aggiunte al ramo di destinazione dopo aver creato il tuo featurebranch.,
For example, to update your branch my-feature-branch
with master
:
-
Fetch the latest changes from
master
:git fetch origin master
-
Checkout your feature branch:
git checkout my-feature-branch
-
Rebase it against
master
:git rebase origin/master
-
Force-push to your branch.,
Quando rebase:
- Git importa tutti i commit inviati a
master
dopo themoment hai creato il tuo ramo di funzionalità fino al momento presente. - Git mette il commit avete nella vostra funzione di ramo in cima di tutte impegna importati dall’
master
:
sostituire master
con qualsiasi altro ramo che si desidera rebase contro, ad esempio, release-10-3
., È inoltre possibile sostituireorigin
con altri repository remoti, ad esempioupstream
. Per verificare quali telecomandi hai collegato al tuo localrepository, puoi eseguiregit remote -v
.
Se ci sono conflitti di unione, Git richiede di risolverli prima di continuare la rebase.
Per saperne di più, controlla la documentazione di Git sulle strategie di rebasing e rebasing.
Rebase interattivo
È possibile utilizzare rebase interattivo per modificare i commit. Ad esempio, modificare un commitmessage, squash (unire più commit in uno), modifica o deletecommits., Utilizzare un rebase per modificare i messaggi di commit passati e organizzare la cronologia di commit del ramo per mantenerla pulita.
Quando vuoi cambiare qualcosa nei commit recenti, usa interactiverebase passando il flag --interactive
(o -i
) al comando rebase.,
Ad esempio, se vuoi modificare gli ultimi tre commit nel tuo ramo(HEAD~3
), esegui:
git rebase -i HEAD~3
Git apre gli ultimi tre commit nell’editor di testo del tuo terminale e descrive tutte le opzioni di rebase interattiva che puoi usare. L’opzione predefinita è pick
, che mantiene il commit invariato. Sostituire la parola chiave pick
in base all’operazione che si desidera eseguire in ogni commit. Per fare ciò, devi modificarei commit nell’editor di testo del tuo terminale.,
Ad esempio, se stai usando Vim come editor di testo nella shellZSH
di macOS e vuoi schiacciare tutti e tre i commit(uniscili in uno):
- Premi la tastiera per passare alla modalità di modifica di Vim.
- Naviga con le frecce della tastiera per modificare la seconda parola chiave di commit da
pick
asquash
(os
). Fai lo stesso con il terzo commit.Il primo commit dovrebbe essere lasciato invariato (pick
) poiché vogliamo schiacciare il secondo e il terzo nel primo., - Premere Esc per uscire dalla modalità di modifica.
- Digitare
:wq
per” scrivere “(salvare) e”uscire”. - Git emette il messaggio di commit in modo da avere la possibilità di modificarlo:
- Tutte le righe che iniziano con
#
vengono ignorate e non incluse nel commitmessage. Tutto il resto è incluso. - Per lasciarlo così com’è, digitare
:wq
. Per modificare il messaggio di commit: passa alla modalità di modifica, modifica il messaggio di commit e salvalo come hai appena fatto.,
- Tutte le righe che iniziano con
- Se non hai spinto i tuoi commit al ramo remoto prima di rebasing,spingere le modifiche normalmente. Se hai già spinto questi commit, forza-push invece.
Si noti che i passaggi per la modifica tramite la riga di comando possono essere leggermente diversi a seconda del sistema operativo e della shell che si sta utilizzando.
Vedi numerose possibilità di annullamento in Gitfor uno sguardo più profondo in rebase interattivo.,
Force-push
Quando si eseguono operazioni più complesse, ad esempio, squash commit, reset orebase il ramo, è necessario forzare un aggiornamento al ramo remoto.Queste operazioni implicano la riscrittura della cronologia di commit del branch.To forzare un aggiornamento, passare il flag--force
o-f
al comandopush
. Per esempio:
git push --force origin my-feature-branch
Forzare un aggiornamento non è raccomandato quando si lavora su sharedbranches.
In alternativa, puoi passare il flag--force-with-lease
., È più sicuro, in quanto non sovrascrivere qualsiasi lavoro sul remotebranch se si impegna di più sono stati aggiunti al ramo remoto da qualcun altro:
git push --force-with-lease origin my-feature-branch
Se il ramo che si desidera forza di spinta è protetto,non è possibile forzare-push a meno di non rimuovere la protezione prima. Quindi puoi forzarlo-spingerlo e proteggerlo nuovamente.,
Conflitti di unione
Poiché Git si basa sul confronto tra le versioni di un fileline-by-line, ogni volta che una linea modificata nel tuo ramo coincide con la stessa linea modificata nel ramo di destinazione (dopo il momento in cui hai creato il tuo ramo di funzionalità da esso), Gitidentifica queste modifiche come un conflitto di unione. Per risolverlo, devi sceglierequale versione di quella linea che vuoi mantenere.
La maggior parte dei conflitti può essere risolta tramite l’interfaccia utente GitLab.
Per casi più complessi, esistono vari metodi per risolverli. Ci sono anche app GUI Git che possono aiutare a visualizzare le differenze.,
Per risolvere i conflitti a livello locale, è possibile utilizzare il metodo riportato di seguito:
-
Aprire il terminale e verifica di funzionalità del ramo, per esempio,
my-feature-branch
:git checkout my-feature-branch
-
Rebase il ramo contro la diramazione di destinazione in modo Gitprompts con i conflitti:
git rebase origin/master
- Aprire il conflitto di file in un editor di codice di vostra preferenza.
- Cerca il blocco di conflitto:
- Inizia con il marcatore:
<<<<<<< HEAD
., - Sotto, c’è il contenuto con le tue modifiche.
- Il marcatore:
=======
indica la fine delle modifiche. - Sotto, c’è il contenuto delle ultime modifiche nel ramo di destinazione.
- Il marcatore
>>>>>>>
indica la fine del conflitto.
- Inizia con il marcatore:
- Modifica il file: scegli la versione (prima o dopo
=======
) che vuoi mantenere, quindi elimina la parte del contenuto che non vuoi nel file. - Elimina i marcatori.
- Salva il file.,
- Ripetere il processo se ci sono altri file in conflitto.
-
Fase le modifiche:
git add .
-
eseguire il Commit delle modifiche:
git commit -m "Fix merge conflicts"
-
Continuare la riassegnazione di:
git rebase --continue
cautionUp a questo punto, è possibile eseguiregit rebase --abort
per interrompere il processo.Git interrompe il rebase e riporta il ramo allo stato che avevi prima di eseguiregit rebase
.,Dopo aver eseguitogit rebase --continue
la rebase non può essere interrotta. - Forza-spingere al ramo remoto.
Leave a Reply