Aller au contenu
yaggui docsProchaine (non publiée)

Fetch, pull et push

Cette page présente les trois boutons réseau de la barre d’outils, Fetch, Pull et Push, ainsi que l’auto-fetch, le force push, la progression des opérations et les erreurs que vous pouvez rencontrer. Les remotes eux-mêmes se gèrent sur la page Gérer les remotes, et les identifiants sur la page Authentification.

Chaque commande réseau s’exécute en arrière-plan dans la file d’opérations du dépôt : la fenêtre reste utilisable. Chaque commande lancée par yaggui est consignée dans le journal des commandes. Les raccourcis ci-dessous sont les raccourcis par défaut ; vous pouvez les réassigner (Palette de commandes et raccourcis).

Un fetch télécharge les nouveaux commits et les nouvelles branches d’un remote sans toucher à vos branches ni à vos fichiers (git fetch).

Point d’entrée Ce qui est récupéré
Bouton Fetch de la barre d’outils Tous les remotes
Flèche du bouton Fetch (Options du fetch) → Fetch de tous les remotes Tous les remotes
Flèche du bouton Fetch → Fetch de origin (une entrée par remote) Ce remote uniquement
⌘⇧F (Ctrl+Shift+F sous Windows et Linux) Tous les remotes
Palette (⌘K) → Fetch Tous les remotes
Barre latérale, clic droit sur un dossier de remote sous Remote → Fetch Ce remote uniquement

yaggui exécute :

Fenêtre de terminal
git fetch --progress --prune --all # tous les remotes
git fetch --progress --prune origin # un seul remote

Une fois l’opération terminée, une notification Fetch terminé apparaît et la barre d’état affiche Fetch terminé avec l’heure. Les branches distantes de la barre latérale et du graphe se mettent à jour d’elles-mêmes.

Quand Nettoyer au fetch est activé (c’est le cas par défaut), chaque fetch ajoute --prune : les branches de suivi supprimées sur le serveur disparaissent de la barre latérale et du graphe. Vos branches locales ne sont jamais supprimées. Le réglage se trouve dans Préférences → Comportement et s’applique à tous les fetch, auto-fetch compris. Voir Préférences.

Un fetch avec prune ne peut pas être annulé (voir Ce qui ne peut pas être annulé).

yaggui fait un fetch de tous les remotes du dépôt actif en arrière-plan, à intervalle régulier.

Réglage (Préférences → Comportement) Par défaut Effet
Fetch automatique Activé Active ou désactive l’auto-fetch
Toutes les (minutes) 10 Intervalle, de 1 à 240 minutes. Inactif quand l’auto-fetch est désactivé

Fonctionnement :

  • Seul l’onglet visible fait un fetch. Les onglets en arrière-plan mettent leur minuteur en pause ; quand vous revenez sur l’un d’eux, son minuteur repart pour un intervalle complet.
  • Aucun fetch n’est lancé à l’ouverture d’un dépôt : le premier a lieu après un intervalle complet.
  • Un déclenchement est ignoré si une autre opération est en cours dans ce dépôt.
  • L’auto-fetch est silencieux : aucune notification en cas de succès ou d’échec. La barre d’état affiche tout de même la progression, puis Fetch terminé ou Fetch a échoué. Si un fetch échoue, ouvrez le journal des commandes pour en connaître la raison.
  • Le pied du menu Fetch indique l’état actuel : Auto-fetch toutes les 10 min ou L’auto-fetch est désactivé.

Pour le désactiver, décochez Fetch automatique dans Préférences → Comportement.

Un pull récupère l’upstream de la branche courante et en intègre les commits (git pull). Le bouton Pull affiche un badge avec le nombre de commits dont vous êtes en retard ; il est désactivé quand HEAD est détaché.

Point d’entrée Stratégie
Bouton Pull de la barre d’outils Stratégie par défaut
Flèche du bouton Pull (Stratégie du pull) → Fast-forward uniquement, Merge ou Rebase Celle que vous choisissez
⌘⇧L (Ctrl+Shift+L sous Windows et Linux) Stratégie par défaut
Palette → Pull Stratégie par défaut
Barre latérale, clic droit sur une branche locale ayant un upstream → Pull Stratégie par défaut. Actif uniquement sur la branche courante (« Le pull ne s’applique qu’à la branche courante »)

Le menu Pull avec… signale la stratégie par défaut par la mention par défaut. Les trois stratégies exécutent :

Stratégie Commande Résultat
Fast-forward uniquement git pull --progress --no-rebase --ff-only Fait avancer votre branche. Échoue si votre branche et son upstream ont divergé
Merge git pull --progress --no-rebase --ff Avance en fast-forward quand c’est possible, sinon crée un commit de merge
Rebase git pull --progress --rebase Rejoue vos commits locaux par-dessus ceux de l’upstream

La stratégie utilisée par le bouton Pull et par ⌘⇧L est déterminée dans cet ordre :

  1. Stratégie de pull par défaut dans Préférences → Comportement, si elle vaut Fast-forward seul, Merge ou Rebase. La valeur par défaut, Config Git, passe aux étapes suivantes.
  2. branch.<name>.rebase, sinon pull.rebase : une valeur vraie (true, merges, interactive…) donne Rebase.
  3. pull.ff=only donne Fast-forward uniquement ; toute autre valeur de pull.ff donne Merge.
  4. pull.rebase=false sans pull.ff donne Merge.
  5. Rien de défini : Fast-forward uniquement.

L’info-bulle du bouton Pull indique la stratégie retenue. Pour la changer côté Git, consultez git config pull.rebase ou réglez-la dans la Binaire Git et configuration.

  • Succès : Pull terminé (fast-forward), Pull terminé (merge) ou Pull terminé (rebase). Rien de nouveau : Déjà à jour.
  • Branches divergentes avec Fast-forward uniquement : « Ta branche et son upstream ont divergé : impossible d’avancer en fast-forward. Fais un pull en merge ou en rebase. » Choisissez Merge ou Rebase depuis la flèche du bouton.
  • Modifications locales gênantes : « Tes modifications locales seraient écrasées par le checkout. Mets-les d’abord de côté (stash, checkout puis pop). » Mettez-les de côté avec un stash, faites le pull, puis récupérez-les (pop).
  • Conflits avec Merge ou Rebase : le pull s’arrête, une notification l’explique, et le bandeau d’opération ainsi que la vue des conflits s’ouvrent. Résolvez les fichiers, puis choisissez Continuer ou annulez l’opération (Annuler le merge, Annuler le rebase), comme décrit dans Résoudre les conflits.
  • Pas d’upstream : « feature » n’a pas de branche amont (upstream). Publiez d’abord la branche avec un push (voir plus bas).

Un pull qui a modifié votre branche ne peut pas être annulé (voir Ce qui ne peut pas être annulé).

Un push envoie les commits d’une branche locale vers son upstream (git push). Le bouton Push affiche un badge avec le nombre de commits dont vous êtes en avance ; il est désactivé quand HEAD est détaché.

Point d’entrée Ce qui est poussé
Bouton Push de la barre d’outils La branche courante
Flèche du bouton Push (Options du push) → Push La branche courante
⌘⇧P (Ctrl+Shift+P sous Windows et Linux) La branche courante
Palette → Push La branche courante
Barre latérale, clic droit sur une branche locale → Push Cette branche, qu’elle soit extraite ou non
Zone de commit, case Push après commit La branche courante, juste après un commit réussi (Commiter)

yaggui pousse la branche vers le remote et la branche désignés par sa configuration d’upstream (branch.<name>.remote et branch.<name>.merge) :

Fenêtre de terminal
git push --progress --porcelain origin refs/heads/feature:refs/heads/feature

Résultats : Poussé vers origin/feature, ou origin/feature est déjà à jour.

Quand la branche n’a pas encore d’upstream, yaggui demande confirmation avant de la publier :

  1. Une boîte de dialogue Publier la branche ? indique : « feature » n’a pas encore d’upstream. Elle sera poussée vers origin/feature, qui deviendra son upstream. Elle affiche la commande, git push --set-upstream origin feature.
  2. Cliquez sur Publier.

Le remote est origin s’il existe, sinon le premier remote du dépôt. Si le dépôt n’a aucun remote, vous obtenez « Ce dépôt n’a aucun remote. » Ajoutez-en un d’abord (Gérer les remotes).

Si la branche distante contient des commits que vous n’avez pas, le push échoue avec « Push rejeté : la branche distante contient des commits que tu n’as pas. » La notification d’erreur propose un bouton Pull puis push : il fait un pull avec la stratégie par défaut puis, si le pull réussit, repousse. Si le pull s’arrête sur des conflits, résolvez-les puis refaites le push vous-même.

Un push réussi ne peut pas être annulé dans yaggui (voir Ce qui ne peut pas être annulé).

Un force push remplace la branche distante par la vôtre, en supprimant les commits qui n’existent que là-bas. yaggui utilise toujours --force-with-lease, jamais --force : Git refuse le push si la branche distante a bougé depuis votre dernier fetch.

Points d’entrée : flèche du bouton Push de la barre d’outils → Force push (avec lease)…, ou palette → Force push (avec lease). Il n’y a pas de raccourci par défaut. L’entrée est désactivée quand HEAD est détaché ou que la branche n’a pas d’upstream.

  1. yaggui liste les commits de la branche distante qui ne sont pas dans la vôtre, d’après votre dernier fetch.

  2. Une confirmation intitulée Écraser origin/feature ? indique combien de commits seront supprimés (« Le force push va supprimer 2 commits de origin/feature (état du dernier fetch). Si la branche a bougé depuis, Git refusera. ») ou qu’aucun ne sera perdu (« Aucun commit de origin/feature ne sera perdu d’après le dernier fetch. Si la branche a bougé depuis, Git refusera. »), liste ces commits (jusqu’à 100) et affiche la commande :

    Fenêtre de terminal
    git push --force-with-lease=refs/heads/feature:<sha> origin HEAD

    <sha> est la branche distante telle qu’elle était à votre dernier fetch. La commande réellement exécutée pousse la branche par son nom complet : git push --progress --porcelain --force-with-lease=refs/heads/feature:<sha> origin refs/heads/feature:refs/heads/feature.

  3. Cliquez sur Forcer le push. La notification origin/feature a été écrasé le confirme.

Cette confirmation est toujours demandée : on ne peut pas la désactiver dans les préférences.

Si quelqu’un a poussé entre-temps, Git refuse : « Force push refusé : la branche distante a bougé depuis ton dernier fetch. Fais un fetch et vérifie ce qui serait écrasé. » Faites un fetch, examinez les nouveaux commits dans le graphe, puis décidez à nouveau.

Le force push vers une branche protégée est toujours refusé, sans possibilité de contournement : « main » est une branche protégée : le force push est refusé. Aucune commande n’est exécutée. La vérification porte sur le nom de la branche distante.

La liste se trouve dans Préférences → Comportement → Branches protégées. Valeurs par défaut : main, master, develop, release/*.

  • Une entrée est un nom exact, ou un motif préfixe/* qui correspond à toute branche située sous préfixe/ (à n’importe quelle profondeur), mais pas à préfixe lui-même.
  • Saisissez un nom dans Ajouter une branche ou un motif et cliquez sur Ajouter. Retirez-en un avec le bouton Retirer de sa pastille. Rétablir les valeurs par défaut restaure la liste par défaut.
  • Une liste vide (« Aucune branche protégée. ») ne protège rien.

Cette même liste protège aussi la suppression de branches par lot (Branches).

Depuis la section Tags de la barre latérale ou depuis la palette (Récupérer les tags, Pousser tous les tags), vous pouvez récupérer les tags, pousser un tag ou tous les tags, et supprimer un tag sur un remote. Ces actions sont décrites sur la page Tags.

Pendant un fetch, un pull ou un push, la partie gauche de la barre d’état affiche l’opération (Fetch, Pull ou Push), la phase en cours de Git (par exemple « Receiving objects »), le pourcentage, la quantité transférée et le débit, avec une barre de progression et un bouton Annuler.

Cliquez sur Annuler pour l’arrêter. La barre d’état affiche « Annulation de Push… », puis Push annulé, et une notification le confirme. yaggui arrête Git et ses processus enfants (comme ssh) en moins d’une seconde environ. L’annulation est proposée pour le fetch, le pull, le push, ainsi que pour les push, fetch et suppressions de tags sur un remote.

Les opérations d’un même dépôt s’exécutent l’une après l’autre. Un fetch, un pull ou un push que vous lancez pendant qu’une autre opération est en cours attend la fin de celle-ci.

Un fetch, un pull ou un push qui échoue affiche une notification d’erreur intitulée Fetch a échoué, Pull a échoué ou Push a échoué. Elle reste affichée jusqu’à ce que vous la fermiez, et contient :

  • un message qui dit ce qui s’est mal passé et ce qu’il faut faire,
  • Détails, replié, avec la sortie brute de Git,
  • au plus un bouton d’action, quand il y en a un d’utile.
Message Que faire Bouton
L’hôte distant est injoignable. Vérifie ta connexion et l’URL du remote. Vérifier le réseau ou l’URL (Gérer les remotes) Réessayer
Authentification refusée. yaggui ne demande jamais de mot de passe : configure un credential helper Git… Voir Authentification —
Authentification SSH refusée. Charge ta clé dans ssh-agent (ssh-add)… Voir Authentification —
Remote introuvable : vérifie son nom et son URL. Corriger l’URL du remote —
Push rejeté : la branche distante contient des commits que tu n’as pas. Faire un pull, puis pousser Pull puis push
« feature » n’a pas de branche amont (upstream). Publier la branche Créer l’upstream et pousser
HEAD est détaché (aucune branche courante) : fais d’abord un checkout d’une branche. Extraire une branche —
La commande Git a échoué. Lire la sortie de Git Ouvrir le journal

Les échecs de l’auto-fetch n’affichent aucune notification ; consultez la barre d’état et le journal des commandes. La liste complète des messages se trouve dans Messages d’erreur.

L’annulation dans yaggui ne modifie que votre dépôt local. Ces opérations réseau sont enregistrées comme « non annulables » et empêchent d’annuler tout ce qui est plus ancien dans la même session :

  • un push, un force push, un push de tag, ou une suppression sur le remote,
  • un pull qui a modifié votre branche (faites plutôt un reset de la branche si besoin : Reset),
  • un fetch avec prune (les branches de suivi supprimées reviennent au fetch suivant si elles existent encore sur le serveur).

Un fetch sans prune, ainsi qu’un pull ou un push déjà à jour, ne sont pas enregistrés. Voir Annuler et rétablir.