2010-11-05 33 views
23

Après la mise en place d'un repo sur Github, il semble y avoir deux façons de tirer ce repo dans un repo local.Quelle est la différence entre clone et mkdir-> cd-> init-> remote-add-> pull?

Premièrement, je pouvais créer un répertoire, initialiser un repo vierge, ajouter une télécommande, puis tirer les modifications de la télécommande.

> mkdir "exampleProject" 
> cd "exampleProject" 
> git init 
> git remote add origin [email protected]:exampleUser/exampleProject.git 
> git pull origin master 

Deuxièmement, je pourrais cloner la télécommande.

> git clone [email protected]:exampleUser/exampleProject.git 

Est-ce que le clonage est juste un raccourci pour la version en 5 étapes ci-dessus ou fait-il autre chose? Vais-je rencontrer des difficultés si j'utilise une méthode plutôt qu'une autre?

+0

Je suis assez sûr que c'est pareil. ils créent tous deux une copie du repo. – Andrey

Répondre

25

Un grand nombre de commandes, que ce soit des commandes git ou des programmes communs, font des choses sur une ligne que vous pourriez faire en dix fois. C'est toujours bon de sauver du travail! Cela dit, vos étapes sont proches, mais pas tout à fait la même chose, que le fait git clone. Je peux penser à quelques différences, tout à faire avec des branches:

  • Si, pour une raison quelconque, la tête de la télécommande est pas maître, le clone fera la bonne chose - vous donner une branche nommée même que celui de la télécommande, au lieu du maître. C'est rare, mais un bon détail à connaître.

  • Votre git pull ne créera aucune branche distante. Si la télécommande a plusieurs branches, le clone crée des branches distantes remotes/origin/foo, remotes/origin/bar, ... dans votre référentiel. Un git fetch origin prendrait soin de cela dans vos étapes énumérées.

  • Vous n'avez également pas configuré votre branche principale pour le suivi des origines, ce que fait le clone. Vous pouvez ajouter ceci à vos étapes répertoriées en tant que git config branch.master.remote origin; git config branch.master.merge refs/heads/master. Ceci est très important - avec vos étapes, si vous avez master vérifié et vous tapez git pull, il ne saura pas quoi faire.

Il est possible que j'ai raté une chose ou deux. En ce qui concerne les difficultés d'une façon ou l'autre, même en supposant que vous Aérez toutes les différences entre un clone par défaut et un « clone manuel », mon conseil serait de ne pas réinventer git clone:

  • Il est court. Pourquoi faire plus de travail?

  • Il a des options pratiques pour changer son comportement. Des choses comme --shared seraient vraiment difficiles à ajouter à vos commandes listées.

  • C'est garanti de faire la bonne chose maintenant et dans le futur. Que faire si vous avez manqué un détail, comme ceux ci-dessus? Que se passerait-il si git ajoutait un paramètre de configuration globale affectant les clones? Vous devriez changer vos commandes pour en tenir compte, mais git clone le saurait déjà.

+1

Merci pour votre réponse! C'était très utile. Ma raison de demander n'est pas parce que je veux réinventer le clone mais plutôt de comprendre exactement ce qu'il fait mais vos conseils sont très valables. –

+0

@Rupert: Ah, cool.Je pense que c'est le fait que vous avez d'abord listé la méthode manuelle qui m'a fait penser que vous envisagiez de l'utiliser. – Cascabel

+0

@Jefromi: Une autre façon de faire ce que vous faites avec ces deux commandes 'git config' est:' git branch --set-upstream maître origine/master' Qui ajoute la même section '[branch" master "]' à le fichier '.git/config'. C'est comme 'git branch --track master origin/master' sauf si vous l'utilisez quand la branche master existe déjà localement. – bjnord