Git-Verzweigung: Master vs. Ursprung / Master vs. Fernbedienungen / Ursprung / Master

201

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 ?

John Rumpel
quelle
1
@ChristopherWallace: Sie haben mit Ihrer Bearbeitung zwei Fragen zum Thema Meta gestellt: " Brauchen wir wirklich ein [origin] -Tag? " Und " Was ist der wahre [Master]? ".
Deduplikator
@Deduplicator Ist das ein Problem?
nbro
@ChristopherWallace: Nun, viele scheinen zu denken, dass beide Tags (das von Ihnen erstellte und das gerade hinzugefügte) schlecht sind. Ich stimme dem zu, aber vielleicht haben Sie der verknüpften Diskussion etwas hinzuzufügen, das nicht berücksichtigt wurde. Wenn nicht, scheint es so.
Deduplikator
Folgefrage: Warum sollte .git/refs/origin/masterjemals abdriften .git/refs/remotes/origin/master? Das passiert mir jetzt und ich werde abgeworfen.
Paul

Antworten:

219

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:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Hier masterist ein Zweig im lokalen Repository. remotes/origin/masterist ein Zweig mit dem Namen masterauf der Remote origin. Sie können dies wie folgt bezeichnen origin/master:

git diff origin/master..master

Sie können es auch wie folgt bezeichnen remotes/origin/master:

git diff remotes/origin/master..master

Dies sind nur zwei verschiedene Arten, auf dasselbe zu verweisen (im Übrigen bedeuten beide Befehle "Zeigen Sie mir die Änderungen zwischen dem Remote- masterZweig und meinem masterZweig").

remotes/origin/HEADist die default branchfür die Fernbedienung benannte origin. So können Sie einfach sagen originstatt origin/master.

Larsks
quelle
5
Gute Antwort. Ich denke git branch -a, der Remote-Zweig remotes/origin/masterwird teilweise so angezeigt, weil der zugrunde liegende Ref in gespeichert ist .git/refs/remotes/origin(wenn er nicht gepackt wurde). Meiner Meinung nach git branch -akö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.
Matt Hurne
14
Beachten Sie auch, dass git branch -r, da nur entfernte Zweige angezeigt werden sollen, der Zweig nur angezeigt wird, origin/masterweil das remotes/Präfix nicht erforderlich ist.
Matt Hurne
3
@misterbiscuit: das stimmt. Die Ausgabe ist eher verwirrend als klarstellend. Vielen Dank, eine großartige Antwort auf meine Frage, die mir die richtigen Hinweise gab
John Rumpel
Wenn ich git logsehe commit fa9sd8jasdf98 (HEAD -> master), was bedeutet das? Was ist HEAD in diesem Fall? Ich dachte, ich wäre derzeit "Meister" und würde mich dazu verpflichten origin/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?
Sebastian Nielsen
@SebastianNielsen Ja, Sie haben Recht, der HEAD -> Master-Teil bedeutet, dass Sie sich derzeit im Master-Zweig befinden.
iRestMyCaseYourHonor
108

Kurze Antwort für Dummies wie mich (gestohlen von Torek):

  • origin / master ist "wo der Master dort war, als ich das letzte Mal nachgesehen habe"
  • Meister ist "wo Meister hier ist, basierend auf dem, was ich getan habe"
ErichBSchulz
quelle
9
origin / master = Sicherung des Remote-Computers, aktualisiert beim letzten Überprüfen von master = Ihre Kopie von origin / master
sakurashinken
40

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/whateverstimmen zunächst mit denen auf dem Repo überein, von dem Sie geklont haben:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

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 fetchoder 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 Ihre git fetch(oder git pulldie wirklich Abruf- und Zusammenführungsvorgänge ausführen) ausführen, erstellt Ihr Repo Kopien der neuen Arbeit und ändert alle refs/remotes/origin/<name>Einträge nach Bedarf. Es ist dieser Moment des fetchIng, der alles zusammenbringt (nun, das und der anfängliche Klon, und einige Fälle des pushIng - 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 als origin/<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" und master"Wo der Meister hier ist, basierend auf dem, was ich getan habe". . Führen Sie es aus git 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 fetchgibt es einige Modi, die nicht aktualisiert werden, "wo sich der Master dort befindet" (genauer gesagt, Modi, die keine Remote-Tracking-Zweige aktualisieren). Laufen git fetch origin, oder git fetch --all, oder auch nur git fetch, tut Update. Laufen git fetch origin master nicht . Leider wird dieser Modus "Nicht aktualisieren" von normal ausgelöst git 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 originist 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 das originIn origin/masterkommt. Der Name origin/masterwird als Remote-Tracking-Zweig bezeichnet , der manchmal in "Remote-Zweig" abgekürzt wird, insbesondere in älteren oder informelleren Dokumentationen.

torek
quelle
2
Hervorragende Beschreibung für einen Neuling wie mich, danke! Es wurde klargestellt, warum sie den origin/masterAufkleber auf der localGrafik des Repos und nicht auf der Grafik angebracht hat remote(ich empfehle Jessica Kerrs "Git Happens" -Präsentation von ganzem Herzen für Leute, die neu in git: vimeo.com/46010208 sind . Ich habe mir zwischen 30:00 und 30 Uhr den Kopf gekratzt: 19.)
Elder Elder
11

Ich würde versuchen, die Antwort von @ ErichBSchulz für Anfänger einfacher zu machen:

  • origin / master ist der Status des Master-Zweigs im Remote-Repository
  • master ist der Status des Master-Zweigs im lokalen Repository
MKJ
quelle
1
Guter Versuch, aber IMHO ohne last time I've checkedes verliert wichtigen Punkt
Alexei Martianov
6
  1. Ursprung - Dies ist ein benutzerdefinierter und gebräuchlicher Name, der auf Remote verweist.

$ 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


  1. master - Der Standardzweigname in Git ist master. Für Remote- und lokale Computer.

  1. origin / master - Dies ist nur ein Zeiger auf den Master-Zweig im Remote-Repo. Denken Sie daran, ich sagte, Ursprung zeigt auf Remote.

$ 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ühren

Hinweis: 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

Gnanasekar S.
quelle
5

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.

Rick
quelle
Genauer gesagt HEADhandelt es sich um einen "Zeiger auf einen Zweig" (die eigentliche Datei in Ihrem lokalen Repo enthält ref: refs/heads/masterbeispielsweise 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 Weise clone, 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 geschaffen remotes/origin/HEAD, besonders wenn es falsch
rauskommt
2

Ich denke, diese Git-Slash-Notation lässt sich wahrscheinlich am besten verstehen, wenn Sie in Ihren .gitOrdner 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 Windowstree funktioniert der Befehl möglicherweise noch.

Scrollen Sie nach unten und sehen Sie sich unten die Referenzen (auch als "Referenzen" bezeichnet) an:

$ tree  
.  
├── branches  
├── config  
├── description  
├── FETCH_HEAD  
├── gitk.cache  
├── HEAD  
├── hooks  
│   ├── applypatch-msg.sample  
    ...
├── index  
├── info  
│   └── exclude  
├── logs  
│   ├── HEAD  
│   └── refs  
│       ├── heads  
│       │   ├── master  
│       │   └── remotes  
│       │       └── origin  
│       └── remotes  
│           └── origin  
│               ├── distro  
│               │   ├── cib  
│               │   │   └── libreoffice-6-0  
│               │   ├── collabora  
│               │   │   └── cp-6.0  
│               │   └── lhm  
│               │       └── libreoffice-5-2+backports  
│               ├── HEAD  
│               ├── libreoffice-6-2  
│               ├── master  
│               └── private  
│                   └── mst  
│                       └── sw_redlinehide_4a  
├── objects  
│   ├── info  
│   └── pack  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack  
│       ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx  
│       └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack  
├── ORIG_HEAD  
├── packed-refs  
└── refs  
    ├── heads  
    │   ├── master  
    │   └── remotes  
    │       └── origin  
    ├── remotes  
    │   └── origin  
    │       ├── distro  
    │       │   ├── cib  
    │       │   │   └── libreoffice-6-0  
    │       │   ├── collabora  
    │       │   │   └── cp-6.0  
    │       │   └── lhm  
    │       │       └── libreoffice-5-2+backports  
    │       ├── HEAD  
    │       ├── libreoffice-6-2  
    │       ├── master  
    │       └── private  
    │           └── mst  
    │               └── sw_redlinehide_4a  
    └── tags  
        └── libreoffice-6-2-branch-point  

32 directories, 45 files

Es wäre vielleicht weniger verwirrend gewesen, wenn es so angelegt wäre, aber es war nicht:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──origin1
│  └──master
└──origin2
   └──master

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:

$ cat .git/HEAD                        #         local:  HEAD -> master
ref: refs/heads/master

$ cat .git/refs/remotes/origin/HEAD    # remote origin:  HEAD -> master
ref: refs/remotes/origin/master

Wenn Sie Ihre Filialen auflisten :

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/aoo/aw080
  remotes/origin/aoo/trunk
  remotes/origin/distro/capgemini/cg-4.1
  remotes/origin/distro/cib/libreoffice-5-0
  remotes/origin/distro/cib/libreoffice-5-1
  remotes/origin/distro/cib/libreoffice-5-2
  ...
  • Der erste aufgeführte Zweig ( Master ) ist der einzige, der keine Fernbedienung ist. In diesem Fall haben wir also eine lokale Niederlassung. Hier beginnen wir unsere eigene Arbeit für unsere eigenen neuen Niederlassungen und nachfolgenden Verpflichtungen.

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"):

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/origin/master          # remote origin master
1ca409292272632f443733450313de5a82c54a9c

Unser lokaler Master zeigt also auf denselben Ort wie der Ursprungsmaster der Fernbedienung:

[local] master = [remote] origin master

Schließlich denke ich, dass es auch nützlich ist, einen Blick darauf zu werfen .git/packed-refs

$ cat packed-refs 
# pack-refs with: peeled fully-peeled 
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1
....

Zweifellos hinterlässt dies mehr Fragen als Antworten, aber ich denke, es kann Ihnen helfen, Ihre eigenen Fragen zu beantworten, was was ist.

Elliptische Ansicht
quelle