web-dev-qa-db-fra.com

Quelle est la différence entre git Push et git pull?

Je suis juste tombé sur quelque chose de particulier aujourd'hui. J'ai demandé à un collègue de mon emploi d'été de m'aider à mettre en place un nouveau dépôt git à distance pour mon code et il y avait beaucoup de confusion sur ce qu'il a fait et ce que je voulais faire. Je lui ai demandé d'envoyer sa config pour pouvoir voir le chemin vers sa télécommande et j'ai découvert qu'il n'avait pas de télécommande. Quand je lui ai posé des questions à ce sujet, il a expliqué son flux de travail comme suit:

  1. Changer quelque chose localement
  2. Commettre
  3. Déplacer vers le répertoire distant
  4. git pull c:\localdir

Ainsi, au lieu de pousser vers une télécommande, il tirait constamment de son dépôt local vers celui de notre serveur. Une sorte de travail à l'envers. Quand je l'ai confronté à ce sujet, il m'a demandé quelle était la différence et je ne pouvais pas vraiment lui répondre, mais je pense qu'il y a quelque chose de bien?

Ma question est donc la suivante: quelle est la différence entre pousser vers une télécommande et tirer depuis une télécommande?

46
Qw4z1

Pousser vers une télécommande: envoyez quelques commits que vous avez à un autre dépôt git. Le dépôt git est considéré comme "distant", mais il peut s'agir d'un dépôt dans un autre dossier de votre disque dur. tirer d'une télécommande: obtenez des validations à partir d'un dépôt à distance et fusionnez-les dans votre HEAD (votre paiement actuel de votre repo)

Votre collègue peut avoir utilisé pull au lieu de Push car votre référentiel n'est peut-être pas disponible (aucun démon git en cours d'exécution, ni gitweb, ni serveur ssh activé), mais le sien est disponible depuis votre ordinateur. Comme il s'agit d'un serveur, il pourrait ne pas vouloir exposer un démon/service git qui pourrait être un vecteur d'attaque.

Mais si votre dépôt était partagé/disponible, il aurait simplement pu faire:

  1. changer quelque chose localement
  2. commettre
  3. Poussez vers votre référentiel
12
Dolanor

À mon avis, vous pouvez soit laisser les utilisateurs pousser leurs validations vers un référentiel considéré comme "le maître", soit les laisser envoyer des demandes d'extraction à un seul utilisateur autorisé à modifier ledit "maître".

Github, par exemple, ne permettra pas aux non-contributeurs de pousser vers le référentiel, mais leur permettra d'envoyer des demandes d'extraction, afin que les contributeurs puissent intégrer leurs modifications.

17
Miquel

Aucun, les dépôts sont des copies les uns des autres et tirer et pousser ne sont que des flux directionnels. La différence avec la méthode de votre collègue est qu'il a ajouté une 4ème commande inutile.

2
iain

Oui, cela fonctionne à l'envers.

Le workflow principal est:

  1. changer quelque chose localement
  2. commettre
  3. Pousser vers le répertoire distant

Un cas d'utilisation (un autre est expliqué par Dolanor ) pour ne pas pousser vers la télécommande est qu'une copie de travail est extraite sur la télécommande (c'est-à-dire qu'il n'y a pas de dépôt nu). Quand il veut pousser une branche qui est extraite de la boîte distante (par exemple master:master), cela ne réussira pas car les poussées vers les branches extraites sont interdites.

À mon avis, c'est le seul cas d'utilisation pour passer à la machine distante et tirer au lieu de pousser depuis la machine locale.

1
eckes