Je pense que je suis sur la bonne voie pour comprendre les concepts de base de git.
J'ai déjà configuré et cloné un référentiel distant. J'ai également créé un référentiel vide côté serveur et y ai lié mon référentiel local.
Mon problème est que je ne comprends pas la différence entre:
- origine / maître vs télécommandes / origine / maître
Pour autant que je sache, master est une branche locale, et remotes / origin / master est distante.
Mais qu'est-ce que l' origine / le maître exactement ?
git
git-remote
John Rumpel
la source
la source
.git/refs/origin/master
dériverait-il jamais.git/refs/remotes/origin/master
? Cela m'arrive maintenant et je suis expulsé.Réponses:
Prenez un clone d'un référentiel distant et exécutez
git branch -a
(pour afficher toutes les branches que git connaît). Cela ressemblera probablement à ceci:Voici
master
une branche du référentiel local.remotes/origin/master
est une branche nomméemaster
sur la télécommande nomméeorigin
. Vous pouvez vous y référer soitorigin/master
comme dans:Vous pouvez également vous y référer comme
remotes/origin/master
:Ce ne sont que deux façons différentes de se référer à la même chose (d'ailleurs, ces deux commandes signifient «montrez-moi les changements entre la
master
branche distante et mamaster
branche).remotes/origin/HEAD
est le nomdefault branch
de la télécommandeorigin
. Cela vous permet simplement de direorigin
au lieu deorigin/master
.la source
git branch -a
montrer la branche distanteremotes/origin/master
est en partie parce que la référence sous-jacente est stockée.git/refs/remotes/origin
(si elle n'a pas été emballée). À mon avis, la sortie degit branch -a
pourrait être beaucoup plus claire, peut-être en séparant le nom de la télécommande du nom de la branche par autre chose qu'une barre oblique.git branch -r
, qui consiste à afficher uniquement les branches distantes, affichera la branche simplementorigin/master
parce que leremotes/
préfixe n'est pas nécessaire.git log
je voiscommit fa9sd8jasdf98 (HEAD -> master)
, qu'est-ce que cela signifie? Qu'est-ce que HEAD dans ce cas? Je pensais que j'étais actuellement "maître" et je m'engageaisorigin/master
. Je pense que j'ai mélangé quelque chose, quelqu'un pourrait-il aider à se calmer? MODIFIER LA MISE À JOUR: Je pense que je l'ai, est-il correct de supposer que HEAD pointe actuellement vers la branche master, ce qui signifie que je suis actuellement en train de m'engager sur master?Réponse courte pour les nuls comme moi (volés à Torek):
la source
Techniquement il n'y a pas réellement de choses « à distance » du tout 1 dans votre repo Git, il y a juste des noms locaux qui doivent correspondre aux noms sur un autre, différent repo. Ceux nommés
origin/whatever
correspondront initialement à ceux du dépôt que vous avez cloné:fait une copie locale de l'autre dépôt. En cours de route, il note toutes les succursales qui se trouvaient là-bas, et les valide, et les colle dans votre référentiel local sous les noms
refs/remotes/origin/
.Selon le temps que vous passez avant vous
git fetch
ou l'équivalent pour mettre à jour "ma copie de ce qui est some.where.out.there", ils peuvent changer leurs branches, en créer de nouvelles et en supprimer. Lorsque vous effectuez votregit fetch
(ougit pull
qui est vraiment chercher et fusionner), votre référentiel fera des copies de leur nouveau travail et modifiera toutes lesrefs/remotes/origin/<name>
entrées selon les besoins. C'est ce moment d'fetch
ing qui fait que tout concorde (enfin, ça, et le clone initial, et certains cas d'push
ing aussi - essentiellement chaque fois que Git a la chance de vérifier - mais voir la mise en garde ci-dessous).Git vous fait normalement référence à la vôtre
refs/heads/<name>
comme juste<name>
, et aux télécommandes commeorigin/<name>
, et tout fonctionne simplement parce qu'il est évident lequel est lequel. Il est parfois possible de créer vos propres noms de branche qui ne le rendent pas évident, mais ne vous inquiétez pas jusqu'à ce que cela se produise. :-) Donnez simplement à Git le nom le plus court qui le rende évident, et il ira de là:origin/master
c'est "où le maître était là-bas la dernière fois que j'ai vérifié", etmaster
c'est "où le maître est ici basé sur ce que j'ai fait" . Exécutezgit fetch
pour mettre à jour Git sur "là où le maître est là-bas" selon les besoins.Mise en garde: dans les versions de Git antérieures à 1.8.4,
git fetch
certains modes ne mettent pas à jour "là où le maître est là-bas" (plus précisément, les modes qui ne mettent à jour aucune branche de suivi à distance). Courirgit fetch origin
, ougit fetch --all
, ou même justegit fetch
, ne mise à jour. La coursegit fetch origin master
ne fonctionne pas . Malheureusement, ce mode "ne se met pas à jour" est déclenché par l'ordinairegit pull
. (Il s'agit principalement d'une gêne mineure et est corrigé dans Git 1.8.4 et versions ultérieures.)1 Eh bien, il y a une chose que l'on appelle une «télécommande». Mais c'est aussi local! Le nom
origin
est ce que Git appelle "une télécommande". Il s'agit essentiellement d'un nom court pour l'URL que vous avez utilisée lors du clonage. Il est également oùorigin
enorigin/master
vient. Le nomorigin/master
est appelé une branche de suivi à distance , qui est parfois raccourci en "branche distante", en particulier dans la documentation plus ancienne ou plus informelle.la source
origin/master
autocollant sur lelocal
graphique du dépôt, et non surremote
celui (je recommande sans réserve la présentation de "Git Happens" de Jessica Kerr pour les nouveaux venus surgit
: vimeo.com/46010208 . Je me grattais la tête entre 30h00 et 30h30 : 19.)J'essaierais de rendre la réponse de @ ErichBSchulz plus simple pour les débutants:
la source
last time I've checked
il perd un point important$ git remote add origin https://github.com/git/git.git
--- Vous exécuterez cette commande pour lier votre projet github à l'origine. Ici, l'origine est définie par l'utilisateur. Vous pouvez le renommer en$ git remote rename old-name new-name
$ git fetch origin
- Télécharge les objets et les références du référentiel distant sur votre ordinateur local [origine / maître]. Cela signifie que cela n'affectera pas votre branche principale locale, sauf si vous les fusionnez à l'aide$ git merge origin/master
. N'oubliez pas de vérifier la bonne branche où vous devez fusionner avant d'exécuter cette commandeRemarque: Le contenu récupéré est représenté comme une branche distante. La récupération vous donne la possibilité d'examiner les modifications avant de les intégrer à votre copie du projet. Pour afficher les changements entre le vôtre et la télécommande
$git diff master..origin/master
la source
Une précision (et un point qui m'a dérouté):
"télécommandes / origine / HEAD est la branche par défaut" n'est pas vraiment correct.
remotes / origin / master était la branche par défaut dans le référentiel distant (la dernière fois que vous avez vérifié). HEAD n'est pas une branche, il pointe simplement vers une branche.
Considérez HEAD comme votre espace de travail. Lorsque vous y pensez de cette façon, «git checkout branchname» est logique en ce qui concerne la modification de vos fichiers de zone de travail pour qu'ils soient ceux d'une branche particulière. Vous "retirez" les fichiers de branche dans votre zone de travail. TÊTE à toutes fins pratiques est ce que vous voyez dans votre zone de travail.
la source
HEAD
est un "pointeur vers une branche" (le fichier réel dans votre référentiel local contient souvent la chaîneref: refs/heads/master
, par exemple ... à moins qu'il ne soit "détaché", ce qui est une tout autre chose). Cependant, il y a une sorte de bogue dans la façon d'clone
interpréter la " tête distante": les protocoles de transfert ne peuvent pas envoyer du tout une branche indirecte, juste un SHA-1 brut, donc git a un truc qui fait que cela "fonctionne principalement". De temps en temps, quelqu'un tombe sur un cas étrange. Je souhaite en quelque sorte que Git n'ait pas crééremotes/origin/HEAD
du tout, surtout quand il se trompe ...Je pense que cette notation git slash est probablement mieux comprise en regardant à l'intérieur de votre
.git
dossier.Par exemple, voici un arbre quelque peu abrégé de mon .git pour la base source de LibreOffice.
Sous Linux, il
sudo apt-get install tree
est utile de voir cela.Sous Windows, je pense que la
tree
commande pourrait encore fonctionner.Faites défiler vers le bas et jetez un œil aux références (alias «références») près du bas:
Cela aurait pu être moins déroutant si cela avait été présenté comme ça, mais ce n'était pas le cas:
Nous avons trois types de références de base: têtes , télécommandes et balises .
.git / refs / heads détient notre maître local .
.git / refs / télécommandes peuvent contenir un certain nombre de télécommandes, bien que pour le moment nous avons seulement l' origine en elle.
.git / refs / tags (est discuté ailleurs).
origine ainsi, est notre seule et unique télécommande. Il contient origine / master .
Nous constatons que nous avons 2 HEADS (pointeurs vers les branches actuelles), un local et un distant:
Si vous listez vos succursales :
Ensuite, vous pouvez avoir de nombreuses succursales de suivi à distance, et nous en avons ici. Vous savez que ce sont des branches de suivi à distance car elles sont préfixées par ' télécommandes / '. Ceux indiqués ici sont pour l'origine nommée à distance.
Ainsi, la deuxième ligne est le pointeur de branche actuel de l'origine . Télécommandes / origine: HEAD - pointe vers -> master. Cela montre que dans le référentiel distant, la branche actuelle est leur branche nommée master (à ne pas confondre avec notre branche locale nommée master ).
Les branches restantes ne se trouvent pas dans votre .git / refs / arborescence, mais vous les trouverez plutôt dans
.git/packed-refs
.Lorsque nous git fetch nous téléchargeons les modifications du référentiel distant, dans notre référentiel de suivi à distance.
Lorsque nous fusionnons git, nous fusionnons les modifications de ce référentiel de suivi à distance local dans notre ou nos branches locales de travail, dans ce cas dans notre branche principale.
(Lorsque nous git pull, nous faisons ces deux étapes en une seule opération.)
Il est également intéressant de noter que ces UUID locaux et distants pour le maître pointent actuellement vers le même nœud (alias «commit»):
Notre maître local pointe donc au même endroit que le maître d'origine de la télécommande:
Enfin, je pense qu'il est également utile de jeter un œil à
.git/packed-refs
Cela laisse sans doute plus de questions que de réponses, mais je pense que cela peut commencer à vous aider à répondre à vos propres questions sur ce qui est quoi.
la source