La réponse courte
Tant que vous effectuez une fusion à avance rapide , vous pouvez simplement utiliser
git fetch <remote> <sourceBranch>:<destinationBranch>
Exemples:
# 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
Bien que la réponse d'Amber fonctionne également dans les cas d'avance rapide, l'utilisation git fetch
de cette manière est un peu plus sûre que le simple déplacement forcé de la référence de branche, car git fetch
cela empêchera automatiquement les avances non rapides accidentelles tant que vous ne les utilisez pas +
dans le refspec.
La réponse longue
Vous ne pouvez pas fusionner une branche B dans la branche A sans vérifier d'abord A si cela entraînerait une fusion sans avance rapide. En effet, une copie de travail est nécessaire pour résoudre tout conflit potentiel.
Cependant, dans le cas des fusions à avance rapide, cela est possible , car de telles fusions ne peuvent jamais entraîner de conflits, par définition. Pour ce faire sans vérifier d'abord une branche, vous pouvez utilisergit fetch
avec une refspec.
Voici un exemple de mise à jour master
(interdiction des modifications non rapides) si vous avez feature
extrait une autre branche :
git fetch upstream master:master
Ce cas d'utilisation est si courant que vous voudrez probablement en faire un alias dans votre fichier de configuration git, comme celui-ci:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
Ce que cet alias fait est le suivant:
git checkout HEAD
: ceci met votre copie de travail dans un état de tête détachée. Ceci est utile si vous souhaitez mettre à jour master
pendant que vous l'avez récupéré. Je pense que c'était nécessaire parce que sinon la référence de branche pour master
ne bougera pas, mais je ne me souviens pas si c'est vraiment tout de suite.
git fetch upstream master:master
: cela fait avancer rapidement votre section locale master
au même endroit que upstream/master
.
git checkout -
vérifie votre branche précédemment extraite (c'est ce que -
fait dans ce cas).
La syntaxe de git fetch
for (non-) fast-forward merges
Si vous voulez que la fetch
commande échoue si la mise à jour n'est pas en avance rapide, alors vous utilisez simplement une spécification du formulaire
git fetch <remote> <remoteBranch>:<localBranch>
Si vous souhaitez autoriser les mises à jour sans avance rapide, vous ajoutez alors un +
au début de la spécification de référence:
git fetch <remote> +<remoteBranch>:<localBranch>
Notez que vous pouvez passer votre dépôt local en tant que paramètre "distant" en utilisant .
:
git fetch . <sourceBranch>:<destinationBranch>
La documentation
De la git fetch
documentation qui explique cette syntaxe (soulignement le mien):
<refspec>
Le format d'un <refspec>
paramètre est un plus facultatif +
, suivi de la référence source <src>
, suivi de deux points :
, suivi de la référence destination <dst>
.
La référence distante qui correspond <src>
est récupérée, et s'il <dst>
ne s'agit pas d'une chaîne vide, la référence locale qui la correspond est transmise rapidement à l'aide<src>
. Si le plus facultatif+
est utilisé, la référence locale est mise à jour même si elle n'entraîne pas une mise à jour rapide.
Voir également
Git checkout et fusionner sans toucher à l'arbre de travail
Fusion sans changer le répertoire de travail