Aggiornare il codice con recupero, unione e pull
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019 | TFS 2018
Visual Studio 2022 | Visual Studio 2019 | Visual Studio 2017 | Visual Studio 2015
Quando sono presenti diversi collaboratori a un progetto, mantenere aggiornato il repository Git locale scaricando e integrando il lavoro caricato da altri utenti nel repository remoto del progetto. Questi comandi Git aggiornano il repository locale:
- Git fetch scarica tutti i nuovi commit caricati da altri utenti nel repository remoto. I rami di rilevamento remoto nella cache dei repository locali vengono aggiornati. I rami locali rimangono invariati.
- L'unione Git integra i commit da uno o più rami di origine in un ramo di destinazione.
- Git rebase integra i commit da un ramo di origine in un ramo di destinazione, ma usa una strategia diversa rispetto a Git merge.
- Git pull esegue un recupero e quindi un merge o una rebase per integrare i commit recuperati nel ramo locale corrente.
Visual Studio usa un subset di tali comandi Git quando si sincronizza il repository locale con un repository remoto.
Per una panoramica del flusso di lavoro Git, vedere Azure Repos esercitazione su Git.
Questo articolo illustra le procedure per le attività seguenti:
- Scaricare le modifiche con recupero
- Aggiornare i rami con merge o rebase
- Scaricare le modifiche e aggiornare i rami con pull
Scaricare le modifiche con recupero
Il recupero Git scarica i commit dei rami remoti e gli oggetti file di riferimento che non esistono nel repository locale e aggiornano i rami di rilevamento remoto nella cache del repository locale. I rami di rilevamento remoto sono copie di sola lettura memorizzate nella cache locale di rami remoti e non sono rami locali. Il recupero Git non aggiorna i rami locali. Ad esempio, se un repository remoto designato da ha un bugfix3
ramo, git fetch aggiornerà il ramo di rilevamento remoto denominato origin/bugfix3
e non il ramo localebugfix3
.origin
È possibile usare rami di rilevamento remoto per:
- Confrontare un ramo di rilevamento remoto con un ramo locale per esaminare le modifiche recuperate.
- Unire un ramo di rilevamento remoto in un ramo locale.
- Creare un nuovo ramo locale da un ramo di rilevamento remoto.
Visual Studio 2019 versione 16.8 e versioni successive offre un'esperienza di controllo della versione Git mantenendo l'interfaccia utente git di Team Explorer . Per usare Team Explorer, deselezionare Strumenti>Opzioni>anteprima Funzionalità>Nuova esperienza utente Git dalla barra dei menu. È possibile usare le funzionalità Git da entrambe le interfacce in modo intercambiabile. Di seguito viene fornito un confronto side-by-side di come eseguire un recupero Git.
Visual Studio Git
- Nella finestra Modifiche Git scegliere Recupera. Selezionare quindi in uscita/in ingresso per aprire la finestra Repository Git .
È anche possibile scegliere Recupera dal menu Git.
- Nella finestra Repository Git i commit recuperati vengono visualizzati nella sezione In ingresso . Selezionare un commit recuperato per visualizzare l'elenco dei file modificati nel commit. Selezionare un file modificato per visualizzare una visualizzazione differenze del contenuto modificato.
Visual Studio Team Explorer
- In Team Explorer selezionare Home e quindi scegliere Sincronizza per aprire la visualizzazione Sincronizzazione .
- Nella visualizzazione Sincronizzazione scegliere Recupera. Entrambi i pulsanti Fetch eseguono la stessa operazione. Al termine del download, i commit recuperati verranno visualizzati nella sezione Commit in ingresso .
- Nella sezione Commit in ingresso fare clic con il pulsante destro del mouse su un commit e scegliere Visualizza dettagli commit per visualizzare i file modificati.
- Nella finestra Dettagli commit i file modificati sono elencati nella sezione Modifiche .
Fare doppio clic su un file modificato per aprire una visualizzazione differenze del contenuto modificato.
Suggerimento
Il recupero non eliminerà i rami di rilevamento remoto nella cache del repository locale che non hanno più una controparte remota. Per configurare Visual Studio per eliminare i rami di rilevamento remoto non aggiornati durante un recupero:
- Selezionare Strumenti>Opzioni> controllo >del codice sorgenteImpostazioni globali Git.
- Impostare l'opzione Prune remote branch durante il recupero su
True
.
Dopo un recupero Git, è possibile confrontare un ramo locale con il ramo di rilevamento remoto corrispondente per visualizzare le modifiche apportate al ramo remoto. Se si decide di aggiornare il ramo locale corrente con le modifiche recuperate, è possibile eseguire un'operazione di merge o rebase Git. In alternativa, è possibile eseguire il pull Git, che combina un recupero Git con un'operazione di merge o rebase Git. Sia git merge che Git rebase aggiornano un ramo di destinazione applicando i commit da un ramo di origine. Tuttavia, Git merge e Git rebase usano strategie diverse. Per altre informazioni, vedere Aggiornare i rami con merge o rebase e When to rebase vs.
Aggiornare i rami con merge o rebase
Git merge e Git rebase integrano i commit da un ramo di origine nel ramo locale corrente (ramo di destinazione). L'unione Git esegue un merge rapido osenza avanzamento rapido. L'unione senza inoltro rapido è nota anche come unione a tre vie o vera unione. La rebase Git è un altro tipo di merge. Questi tipi di unione sono illustrati nel diagramma seguente.
Il merge Git e la rebase Git vengono ampiamente usati nel flusso di lavoro Git. Quando si lavora a una funzionalità locale o a un ramo di correzione di bug, è pratica comune:
- Mantenere il ramo locale
main
corrente con la controparte remota eseguendo periodicamente il pull per recuperare e unire i commit remoti. - Integrare gli aggiornamenti del ramo locale
main
nel ramo di funzionalità locale usando una rebase o un merge. - Eseguire il backup del lavoro nel ramo di funzionalità locale eseguendo il push nel ramo remoto corrispondente.
- Al termine della funzionalità, creare una richiesta pull per unire il ramo di funzionalità remota nel ramo remoto
main
.
Questo approccio consente di:
- Tieni presente il lavoro recente da parte di altri che potrebbero influire sul tuo lavoro.
- Risolvere tempestivamente eventuali conflitti tra il lavoro e quello degli altri.
- Applicare la nuova funzionalità al contenuto del progetto aggiornato.
- Ottenere una revisione della richiesta pull del lavoro.
Unione
Per l'unione git, se il suggerimento del ramo di destinazione esiste all'interno del ramo di origine, il tipo di unione predefinito sarà un merge rapido. In caso contrario, il tipo di unione predefinito sarà un merge senza inoltro rapido.
Un'unione Git a inoltro rapido non può mai avere un conflitto di merge perché Git non applica un merge fast forward se la punta del ramo di destinazione si è allontanata dal ramo di origine. Per impostazione predefinita, Git usa un merge a inoltro rapido ogni volta che possibile. Ad esempio, Git applicherà un merge rapido in un ramo locale che si aggiorna solo eseguendo il pull dal ramo della controparte remota.
Un merge Git no-fast-forward genera un nuovo ramo di destinazione "merge commit" che integra le modifiche del ramo di origine con le modifiche del ramo di destinazione. Le modifiche applicabili sono quelle apportate dopo l'ultimo commit comune a entrambi i rami. Nel diagramma precedente il commit C è l'ultimo commit comune in entrambi i rami. Se qualsiasi modifica del ramo di origine è in conflitto con qualsiasi modifica del ramo di destinazione, Git richiederà di risolvere il conflitto di merge. Il commit di merge (L) contiene le modifiche del ramo di origine integrato e del ramo di destinazione. I suggerimenti per il ramo di origine e di destinazione (K e E) sono i genitori del commit di merge. Nella cronologia del commit del ramo, un commit di merge è un indicatore utile per un'operazione di unione e mostra chiaramente quali rami sono stati uniti.
L'unione Git modifica solo il ramo di destinazione: il ramo di origine rimane invariato. Quando si verificano uno o più conflitti di unione, è necessario risolverli per completare l'unione. In alternativa, è possibile annullare l'operazione di unione e restituire il ramo di destinazione allo stato precedente.
Per altre informazioni sulle opzioni di merge e sulle strategie, vedere la guida di riferimento git e le strategie di unione Git.
Suggerimento
Se il ramo di origine è un ramo di rilevamento remoto, assicurarsi che il ramo sia aggiornato eseguendo un recupero Git prima dell'unione.
Visual Studio 2019 versione 16.8 e versioni successive offre un'esperienza di controllo della versione Git mantenendo l'interfaccia utente Git di Team Explorer . Per usare Team Explorer, deselezionareOpzioni>strumenti>Anteprima funzionalità>Nuova esperienza utente Git dalla barra dei menu. È possibile usare le funzionalità Git da entrambe le interfacce in modo interscambiabile. Di seguito viene fornito un confronto side-by-side di come eseguire un merge Git.
Visual Studio Git
- Scegliere Git > Gestisci rami dalla barra dei menu per aprire la finestra Repository Git .
- Nella finestra Repository Git fare clic con il pulsante destro del mouse sul ramo di destinazione e selezionare Verifica.
- Fare clic con il pulsante destro del mouse sul ramo di origine e scegliere Merge <source-branch in <target-branch>>.
- Visual Studio visualizzerà un messaggio di conferma dopo l'unione riuscita.
Se l'unione viene interrotta a causa di conflitti di unione, Visual Studio vi notifica. È possibile risolvere i conflitti o annullare l'unione e tornare allo stato di pre-unione.
Visual Studio Team Explorer
- In Team Explorer selezionare Home e scegliere Rami.
- Nella visualizzazione Rami fare clic con il pulsante destro del mouse sul ramo di destinazione e selezionare Verifica.
- Fare clic con il pulsante destro del mouse sul ramo di origine e scegliere Unione da.
- Verificare le opzioni di unione e quindi fare clic su Merge.
- Visual Studio visualizzerà un messaggio di conferma dopo l'unione riuscita.
Se durante l'unione sono presenti conflitti, Visual Studio notifica. È possibile risolvere i conflitti o annullare l'unione e tornare allo stato di pre-unione.
Rebase
Git rebase restituisce la cronologia del commit del ramo di destinazione in modo che contenga tutti i commit del ramo di origine, seguiti da tutti i commit dei rami di destinazione dall'ultimo commit comune. Un altro modo per visualizzare è che una rebase Git riproduce le modifiche nel ramo di destinazione nella parte superiore della cronologia dei rami di origine. Se qualsiasi modifica del ramo di origine è in conflitto con qualsiasi modifica del ramo di destinazione, Git richiederà di risolvere il conflitto di merge. La rebase git non crea un commit di merge. In particolare, Git rebase modifica la sequenza dei commit del ramo di destinazione esistente, che non è il caso delle altre strategie di merge. Nel diagramma precedente il commit K' contiene le stesse modifiche di K, ma ha un nuovo ID commit perché si collega nuovamente al commit E anziché C.
Git rebase modifica solo il ramo di destinazione: il ramo di origine rimane invariato. Quando si verificano uno o più conflitti di unione, è necessario risolverli per completare la ribase. In alternativa, è possibile annullare l'operazione di ribase e restituire il ramo di destinazione allo stato precedente.
Se si è l'unico utente che lavora nella funzionalità o nel ramo di bugfix, è consigliabile usare Git rebase per integrare nuovi main
commit di ramo in esso. In caso contrario, usare git merge. Per altre informazioni sulla rebase Git e su quando usarla, vedere Applicare modifiche con la rebase e Rebase vs merge.
Suggerimento
Se il ramo di origine è un ramo di rilevamento remoto, assicurarsi che il ramo sia aggiornato eseguendo un recupero Git prima della rebase.
Visual Studio 2019 versione 16.8 e versioni successive offre un'esperienza di controllo della versione Git mantenendo l'interfaccia utente git di Team Explorer . Per usare Team Explorer, deselezionare Strumenti>Opzioni>anteprima Funzionalità>Nuova esperienza utente Git dalla barra dei menu. È possibile usare le funzionalità Git da entrambe le interfacce in modo intercambiabile. Di seguito viene fornito un confronto side-by-side di come eseguire una ribase Git.
Visual Studio Git
- Scegliere Git Manage Branch (Gestisci rami Git>) per aprire la finestra Git Repository (Repository Git).
- Nella finestra Repository Git fare clic con il pulsante destro del mouse sul ramo di destinazione e scegliere Checkout (Checkout).
- Fare clic con il pulsante destro del mouse sul ramo di origine e scegliere Rebase <target-branch on source-branch (Ripristina ramo> di destinazione nel <ramo di origine>).
- Visual Studio visualizzerà un messaggio di conferma dopo una ribase riuscita.
Se la rebase viene interrotta a causa di conflitti di merge, Visual Studio invierà una notifica. È possibile risolvere i conflitti oppure annullare la ribase e tornare allo stato di pre-ribase.
Visual Studio Team Explorer
- In Team Explorer selezionare Home e scegliere Rami.
- Nella visualizzazione Rami fare clic con il pulsante destro del mouse sul ramo di destinazione e scegliere Estrazione.
- Fare clic con il pulsante destro del mouse sul ramo di origine e scegliere Ripristina base.
- Verificare le opzioni di ribase e quindi fare clic su Rebase.
- Visual Studio visualizzerà un messaggio di conferma dopo una ribase riuscita.
In caso di conflitti durante la ribase, Visual Studio invierà una notifica. È possibile risolvere i conflitti oppure annullare la ribase e tornare allo stato di pre-ribase.
Scaricare le modifiche e aggiornare i rami con pull
Per impostazione predefinita, Git pull combina un recupero Git e un'unione Git per aggiornare il ramo locale corrente dalla controparte remota. Facoltativamente, Git pull può eseguire una rebase Git anziché un'unione Git.
A differenza del recupero Git, git pull aggiornerà il ramo locale corrente immediatamente dopo il download di nuovi commit dal repository remoto. Usare git pull quando si sa di voler aggiornare il ramo locale corrente subito dopo un recupero Git.
Visual Studio 2019 versione 16.8 e versioni successive offre un'esperienza di controllo della versione Git mantenendo l'interfaccia utente git di Team Explorer . Per usare Team Explorer, deselezionare Strumenti>Opzioni>anteprima Funzionalità>Nuova esperienza utente Git dalla barra dei menu. È possibile usare le funzionalità Git da entrambe le interfacce in modo intercambiabile. Di seguito viene fornito un confronto affiancato di come eseguire un pull Git.
Suggerimento
Per configurare Visual Studio in modo che ribase invece di eseguire il merge quando si esegue il pull:
- Dal menu Git passare a Strumenti>Opzioni> controllo >del codice sorgenteImpostazioni globali Git.
- Impostare l'opzione Rebase local branch quando si esegue il pull su
True
.
Visual Studio Git
- Nella finestra Modifiche Git scegliere Pull.
È anche possibile scegliere Pull dal menu Git.
- Al termine dell'operazione pull viene visualizzato un messaggio di conferma.
In caso di conflitti durante la parte di merge dell'operazione pull, Visual Studio invierà una notifica. È possibile risolvere i conflitti oppure annullare l'unione e tornare allo stato di pre-unione.
Visual Studio Team Explorer
- In Team Explorer selezionare Home e scegliere Sincronizza per aprire la visualizzazione Sincronizzazione .
- Nella visualizzazione Sincronizzazione scegliere Pull. Entrambi i pulsanti Pull eseguono la stessa operazione.
- Visual Studio visualizzerà un messaggio di conferma al termine dell'operazione pull.
In caso di conflitti durante la parte di merge dell'operazione pull, Visual Studio invierà una notifica. È possibile risolvere i conflitti oppure annullare l'unione e tornare allo stato di pre-unione.
Nota
In Visual Studio la sincronizzazione esegue un'operazione pull e quindi un push per sincronizzare un ramo locale e remoto. Per altre informazioni sulla sincronizzazione, vedere Usare git fetch, pull, push e sincronizzazione per il controllo della versione in Visual Studio.