Ich denke, ich bin auf dem richtigen Weg, um die Grundkonzepte von Git zu verstehen.
Ich habe bereits ein Remote-Repository eingerichtet und geklont. Ich habe auch ein serverseitiges leeres Repository erstellt und mein lokales Repository damit verknüpft.
Mein Problem ist, dass ich den Unterschied nicht verstehe zwischen:
- Herkunft / Master vs. Fernbedienungen / Herkunft / Master
Soweit ich verstanden habe, ist Master ein lokaler Zweig und Fernbedienungen / Ursprung / Master ein entfernter Zweig .
Aber was genau ist Herkunft / Meister ?
git
git-remote
John Rumpel
quelle
quelle
.git/refs/origin/master
jemals abdriften.git/refs/remotes/origin/master
? Das passiert mir jetzt und ich werde abgeworfen.Antworten:
Nehmen Sie einen Klon eines Remote-Repositorys und führen Sie ihn aus
git branch -a
(um alle Zweige anzuzeigen, die git kennt). Es wird wahrscheinlich ungefähr so aussehen:Hier
master
ist ein Zweig im lokalen Repository.remotes/origin/master
ist ein Zweig mit dem Namenmaster
auf der Remoteorigin
. Sie können dies wie folgt bezeichnenorigin/master
:Sie können es auch wie folgt bezeichnen
remotes/origin/master
:Dies sind nur zwei verschiedene Arten, auf dasselbe zu verweisen (im Übrigen bedeuten beide Befehle "Zeigen Sie mir die Änderungen zwischen dem Remote-
master
Zweig und meinemmaster
Zweig").remotes/origin/HEAD
ist diedefault branch
für die Fernbedienung benannteorigin
. So können Sie einfach sagenorigin
stattorigin/master
.quelle
git branch -a
, der Remote-Zweigremotes/origin/master
wird teilweise so angezeigt, weil der zugrunde liegende Ref in gespeichert ist.git/refs/remotes/origin
(wenn er nicht gepackt wurde). Meiner Meinung nachgit branch -a
könnte die Ausgabe von viel klarer sein, vielleicht indem der Name der Fernbedienung vom Namen des Zweigs durch etwas anderes als einen Schrägstrich getrennt wird.git branch -r
, da nur entfernte Zweige angezeigt werden sollen, der Zweig nur angezeigt wird,origin/master
weil dasremotes/
Präfix nicht erforderlich ist.git log
sehecommit fa9sd8jasdf98 (HEAD -> master)
, was bedeutet das? Was ist HEAD in diesem Fall? Ich dachte, ich wäre derzeit "Meister" und würde mich dazu verpflichtenorigin/master
. Ich glaube, ich habe etwas durcheinander gebracht. Könnte jemand helfen, sich zu beruhigen? EDIT UPDATE: Ich glaube, ich habe es verstanden. Ist es richtig anzunehmen, dass HEAD derzeit auf den Master-Zweig zeigt, was bedeutet, dass ich gerade dabei bin, mich zum Master zu verpflichten?Kurze Antwort für Dummies wie mich (gestohlen von Torek):
quelle
Technisch gesehen gibt es in Ihrem Git-Repo überhaupt keine "entfernten" Dinge 1, sondern nur lokale Namen, die den Namen eines anderen, anderen Repos entsprechen sollten. Die genannten
origin/whatever
stimmen zunächst mit denen auf dem Repo überein, von dem Sie geklont haben:erstellt eine lokale Kopie des anderen Repos. Unterwegs werden alle Filialen notiert, die dort vorhanden waren, und die Commits, auf die verwiesen wird, und diese werden unter den Namen in Ihr lokales Repo eingefügt
refs/remotes/origin/
.Abhängig davon, wie lange Sie vor Ihnen
git fetch
oder gleichwertig brauchen, um "meine Kopie von" some.where.out.there "zu aktualisieren, können sie ihre Zweige ändern, neue erstellen und einige löschen. Wenn Sie Ihregit fetch
(odergit pull
die wirklich Abruf- und Zusammenführungsvorgänge ausführen) ausführen, erstellt Ihr Repo Kopien der neuen Arbeit und ändert allerefs/remotes/origin/<name>
Einträge nach Bedarf. Es ist dieser Moment desfetch
Ing, der alles zusammenbringt (nun, das und der anfängliche Klon, und einige Fälle despush
Ing - im Grunde immer dann, wenn Git die Möglichkeit bekommt, dies zu überprüfen -, aber siehe unten).Normalerweise nennt man Git sein eigenes
refs/heads/<name>
als gerecht<name>
und das entfernte alsorigin/<name>
, und alles funktioniert nur, weil es offensichtlich ist, welches welches ist. Es ist manchmal möglich, eigene Filialnamen zu erstellen, die es nicht offensichtlich machen, aber machen Sie sich darüber keine Sorgen, bis es passiert. :-) Geben Sie Git einfach den kürzesten Namen, der es offensichtlich macht, und von dort aus geht es weiter:origin/master
"Wo der Meister das letzte Mal dort war, als ich das letzte Mal nachgesehen habe" undmaster
"Wo der Meister hier ist, basierend auf dem, was ich getan habe". . Führen Sie es ausgit fetch
, um Git nach Bedarf auf "Wo der Master dort drüben ist" zu aktualisieren.Vorsichtsmaßnahme: In Git-Versionen, die älter als 1.8.4 sind,
git fetch
gibt es einige Modi, die nicht aktualisiert werden, "wo sich der Master dort befindet" (genauer gesagt, Modi, die keine Remote-Tracking-Zweige aktualisieren). Laufengit fetch origin
, odergit fetch --all
, oder auch nurgit fetch
, tut Update. Laufengit fetch origin master
nicht . Leider wird dieser Modus "Nicht aktualisieren" von normal ausgelöstgit pull
. (Dies ist hauptsächlich nur ein kleiner Ärger und wurde in Git 1.8.4 und höher behoben.)1 Nun, es gibt eine Sache, die als "Fernbedienung" bezeichnet wird. Das ist aber auch lokal! Der Name
origin
ist das, was Git "eine Fernbedienung" nennt. Es ist im Grunde nur ein kurzer Name für die URL, die Sie beim Klonen verwendet haben. Es ist auch, woher dasorigin
Inorigin/master
kommt. Der Nameorigin/master
wird als Remote-Tracking-Zweig bezeichnet , der manchmal in "Remote-Zweig" abgekürzt wird, insbesondere in älteren oder informelleren Dokumentationen.quelle
origin/master
Aufkleber auf derlocal
Grafik des Repos und nicht auf der Grafik angebracht hatremote
(ich empfehle Jessica Kerrs "Git Happens" -Präsentation von ganzem Herzen für Leute, die neu ingit
: vimeo.com/46010208 sind . Ich habe mir zwischen 30:00 und 30 Uhr den Kopf gekratzt: 19.)Ich würde versuchen, die Antwort von @ ErichBSchulz für Anfänger einfacher zu machen:
quelle
last time I've checked
es verliert wichtigen Punkt$ git remote add origin https://github.com/git/git.git
--- Sie führen diesen Befehl aus, um Ihr Github-Projekt mit origin zu verknüpfen. Hier ist der Ursprung benutzerdefiniert. Sie können es umbenennen durch$ git remote rename old-name new-name
$ git fetch origin
- Lädt Objekte und Refs vom Remote-Repository auf Ihren lokalen Computer herunter [Ursprung / Master]. Dies bedeutet, dass Ihre lokale Hauptniederlassung nur betroffen ist, wenn Sie sie mit zusammenführen$ git merge origin/master
. Denken Sie daran, den richtigen Zweig auszuchecken, in dem Sie zusammenführen müssen, bevor Sie diesen Befehl ausführenHinweis: Abgerufene Inhalte werden als Remote-Zweig dargestellt. Mit Fetch können Sie Änderungen überprüfen, bevor Sie sie in Ihre Kopie des Projekts integrieren. Anzeigen von Änderungen zwischen Ihrer und der Fernbedienung
$git diff master..origin/master
quelle
Eine Klarstellung (und ein Punkt, der mich verwirrte):
"Fernbedienungen / Ursprung / KOPF ist der Standardzweig" ist nicht wirklich korrekt.
remotes / origin / master war der Standardzweig im Remote-Repository (das letzte Mal, als Sie dies überprüft haben). HEAD ist kein Zweig, sondern zeigt nur auf einen Zweig.
Stellen Sie sich HEAD als Ihren Arbeitsbereich vor. Wenn Sie es so sehen, ist 'git checkout branchname' sinnvoll, wenn Sie Ihre Arbeitsbereichsdateien so ändern möchten, dass sie die eines bestimmten Zweigs sind. Sie "checken" Zweigdateien in Ihren Arbeitsbereich aus. KOPF für alle praktischen Zwecke ist das, was für Sie in Ihrem Arbeitsbereich sichtbar ist.
quelle
HEAD
handelt es sich um einen "Zeiger auf einen Zweig" (die eigentliche Datei in Ihrem lokalen Repo enthältref: refs/heads/master
beispielsweise häufig die Zeichenfolge ... es sei denn, sie ist "getrennt", was eine ganz andere Sache ist). Es gibt jedoch eine Art Fehler in der Art und Weiseclone
, wie der "entfernte HEAD" interpretiert wird: Die Übertragungsprotokolle können überhaupt keinen indirekten Zweig senden, sondern nur einen rohen SHA-1, also hat Git einen Kludge, der dies "meistens funktioniert". Hin und wieder stolpert jedoch jemand über einen seltsamen Fall. Ich wünschte, Git hätte überhaupt nichts geschaffenremotes/origin/HEAD
, besonders wenn es falschIch denke, diese Git-Slash-Notation lässt sich wahrscheinlich am besten verstehen, wenn Sie in Ihren
.git
Ordner schauen .Hier ist zum Beispiel ein etwas abgekürzter Baum meiner .git für die LibreOffice-Quellbasis.
Unter Linux
sudo apt-get install tree
ist dies nützlich, um dies anzuzeigen.Unter Windows
tree
funktioniert der Befehl möglicherweise noch.Scrollen Sie nach unten und sehen Sie sich unten die Referenzen (auch als "Referenzen" bezeichnet) an:
Es wäre vielleicht weniger verwirrend gewesen, wenn es so angelegt wäre, aber es war nicht:
Wir haben drei grundlegende Arten von Referenzen: Köpfe , Fernbedienungen und Tags .
.git / refs / Heads hält unseren lokalen Meister .
.git / refs / remotes kann eine Reihe von Fernbedienungen enthalten, obwohl wir im Moment nur einen Ursprung darin haben.
.git / refs / tags (wird an anderer Stelle besprochen).
Ursprung ist also unsere einzige Ferne. Es enthält Herkunft / Master .
Wir stellen fest, dass wir 2 KÖPFE (Zeiger auf aktuelle Zweige) haben, einen lokalen und einen entfernten:
Wenn Sie Ihre Filialen auflisten :
Als nächstes haben Sie möglicherweise viele Remote-Tracking-Zweige, und das tun wir hier. Sie wissen, dass dies Fernverfolgungszweige sind, da ihnen ' Fernbedienungen / ' vorangestellt sind . Die hier gezeigten sind für den entfernten benannten Ursprung.
Die zweite Zeile ist also der aktuelle Verzweigungszeiger des Ursprungs . Fernbedienungen / Ursprung: HEAD - zeigt auf -> Master. Dies zeigt, dass im Remote-Repository der aktuelle Zweig der Zweig mit dem Namen master ist (nicht zu verwechseln mit unserem lokalen Zweig mit dem Namen master ).
Die restlichen Zweige befinden sich nicht in Ihrer .git / refs / tree, sondern in .git / refs / tree
.git/packed-refs
.Wenn wir fit holen , laden wir Änderungen aus dem Remote-Repository in unser Remote-Tracking-Repository herunter.
Wenn wir git merge zusammenführen, führen wir die Änderungen in diesem lokalen Remote-Tracking-Repository in unserem oder mehreren funktionierenden lokalen Zweigen zusammen, in diesem Fall in unserem Hauptzweig.
(Wenn wir ziehen, machen wir diese beiden Schritte in einer Operation.)
Es ist auch interessant zu beachten, dass diese lokalen und Remote- UUIDs für Master derzeit auf denselben Knoten verweisen (auch bekannt als "Commit"):
Unser lokaler Master zeigt also auf denselben Ort wie der Ursprungsmaster der Fernbedienung:
Schließlich denke ich, dass es auch nützlich ist, einen Blick darauf zu werfen
.git/packed-refs
Zweifellos hinterlässt dies mehr Fragen als Antworten, aber ich denke, es kann Ihnen helfen, Ihre eigenen Fragen zu beantworten, was was ist.
quelle