La risposta breve
Finché stai eseguendo un'unione con avanzamento rapido , puoi semplicemente utilizzare
git fetch <remote> <sourceBranch>:<destinationBranch>
Esempi:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Mentre la risposta di Amber funzionerà anche in casi di avanzamento rapido, l'utilizzo git fetch
in questo modo invece è un po 'più sicuro del semplice spostamento forzato del riferimento di diramazione, poiché git fetch
previene automaticamente l'accelerazione accidentale non veloce finché non si utilizza +
nel refspec.
La lunga risposta
Non è possibile unire un ramo B nel ramo A senza estrarre A per primo se si tradurrebbe in un'unione senza avanzamento rapido. Questo perché è necessaria una copia di lavoro per risolvere eventuali conflitti.
Tuttavia, nel caso di fusioni ad avanzamento rapido, ciò è possibile , poiché tali fusioni non possono mai tradursi in conflitti, per definizione. Per fare ciò senza prima verificare un ramo, puoi usarlo git fetch
con un refspec.
Ecco un esempio di aggiornamento master
(che non consente modifiche non avanzate) se si dispone di un altro ramo feature
estratto:
git fetch upstream master:master
Questo caso d'uso è così comune, che probabilmente vorrai crearne uno nel tuo file di configurazione git, come questo:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
Ciò che fa questo alias è il seguente:
git checkout HEAD
: questo mette la tua copia di lavoro in uno stato distaccato. Questo è utile se vuoi aggiornare master
mentre ti capita di averlo estratto. Penso che fosse necessario farlo perché altrimenti il riferimento al ramo per master
non si muoverà, ma non ricordo se è davvero giusto fuori dalla cima della mia testa.
git fetch upstream master:master
: questo fa avanzare rapidamente il tuo locale master
nello stesso posto di upstream/master
.
git checkout -
controlla il tuo ramo precedentemente estratto (ecco cosa -
fa in questo caso).
La sintassi di git fetch
for (non) fast-forward si fonde
Se si desidera che il fetch
comando non riesca se l'aggiornamento non è un avanzamento rapido, è sufficiente utilizzare un refspec del modulo
git fetch <remote> <remoteBranch>:<localBranch>
Se si desidera consentire aggiornamenti non rapidi, si aggiunge a +
alla parte anteriore del refspec:
git fetch <remote> +<remoteBranch>:<localBranch>
Si noti che è possibile passare il repository locale come parametro "remoto" utilizzando .
:
git fetch . <sourceBranch>:<destinationBranch>
La documentazione
Dalla git fetch
documentazione che spiega questa sintassi (sottolineatura mia):
<refspec>
Il formato di un <refspec>
parametro è un plus facoltativo +
, seguito dal riferimento di origine <src>
, seguito da due punti :
, seguito dal riferimento di destinazione <dst>
.
Il riferimento remoto corrispondente <src>
corrisponde al recupero e, se <dst>
non è una stringa vuota, il riferimento locale corrispondente corrisponde al passaggio rapido utilizzando<src>
. Se+
si utilizza ilplus opzionale, il riferimento locale viene aggiornato anche se non comporta un aggiornamento rapido.
Guarda anche
Esegui il checkout e uniscilo senza toccare l'albero di lavoro
Fusione senza modificare la directory di lavoro