2010-12-05 7 views
38

Ich bin ziemlich neu in Git, und immer noch den Dreh raus zu bekommen. Ich habe erst vor kurzem begonnen, mit Filialen zu arbeiten und stoße auf einige Fragen.Git-Zweigs namens origin/HEAD -> origin/master

Ich habe zwei Entwicklungssysteme, eine Ubuntu-Desktop und eine MacBookPro. Ich habe eine Menge Arbeit in einem neuen organizations Zweig auf dem Ubuntu System gemacht und Commits durchgeführt und zu meinem Remote Repo gedrängt. Zu diesem Zeitpunkt hatte ich diese Zweige:

[email protected]:/projects$ git branch 
    accounting 
    master 
* organizations 

[email protected]:/projects$ git branch -r 
    origin/accounting 
    origin/master 
    origin/organizations 
    origin/superstar 

Dann habe ich an die MBP schaltete den neuen Zweig zu ziehen:

[email protected]:/projects$ git branch 
    accounting 
* master 

[email protected]:/projects$ git branch -r 
    origin/HEAD -> origin/master 
    origin/accounting 
    origin/master 
    origin/superstar 

[email protected]:/projects$ git pull 
    2e20a14..ef35730 accounting -> origin/accounting 
    271a1a5..7e947ab master  -> origin/master 
* [new branch]  organizations -> origin/organizations 

[email protected]:/projects$ git branch 
* accounting 
    master 

[email protected]:/projects$ git branch -r 
    origin/HEAD -> origin/master 
    origin/accounting 
    origin/master 
    origin/organizations 
    origin/superstar 

So sind meine Fragen diese:

  1. Warum funktioniert das MBP haben einen Zweig origin/HEAD -> origin/master, aber das Ubuntu-System nicht? Was ist das für ein Zweig?
  2. Werden alle neuen entfernten Zweige automatisch mit git pull übertragen? Ich dachte, ich müsste ihm den Namen neuer Zweige sagen. Wie Sie sehen können, hat es den entfernten organizations Zweig auf den Befehl git pull gezogen.

Antwort

35

HEAD in der Regel verweist auf den derzeit ausgecheckt Zweig. In gehosteten (nackten) Repositorys wird der Standardzweig angegeben, d. H. Der Zweig, der beim Klonen des Repositorys ausgecheckt wird. Also, Herkunft/HEAD sagt Ihnen den Standard-Zweig der Herkunft.

Ich weiß nicht, warum es in Ihrem Repository auf dem Ubuntu-System nicht vorhanden ist. Vielleicht haben Sie Ihren Code ursprünglich aus diesem Repository verschoben (als der Ursprung leer war und somit noch keinen HEAD hatte) und ihn nie aktualisiert.

Mit so etwas wie origin/HEAD ist in der Praxis nicht sehr wichtig, sowieso.

Um Ihre andere Frage zu beantworten: Wenn Sie git pull ohne Argumente ausführen, holt es tatsächlich alles von der Fernbedienung (git fetch wird auch ohne Argumente ausgeführt, so dass es nur alles bekommt). Alles wird jedoch nicht verschmolzen. Nur die Remote-Tracking-Zweige (das Zeug in git branch -r) werden aktualisiert.

+5

Oh, ich habe vergessen zu erwähnen: Sie können 'git remote set-head Herkunft -a' verwenden, um Herkunft/HEAD erstellt/aktualisiert zu haben. –

+2

Die [Dokumentation] (http://www.kernel.org/pub/software/scm/git/docs/git-remote.html) für "git remote set-head" ist hilfreich, um den Zweck von z.B. "Herkunft/Kopf". – millerdev

9

Soweit ich weiß, HEAD ist keine Verzweigung, sondern ein Zeiger auf einen Knoten des Verlaufsbaums (d. H. Ein Festschreiben). Die Dateien, die sich in Ihrer bestimmten Arbeitskopie befinden, haben den von HEAD beschriebenen Zustand.

Normalerweise HEAD verweist auf den jüngsten in einer Filiale begehen, so haben Sie die neuesten Dateien in der Arbeitskopie. Mit git reset HEAD^ können Sie den Zeiger zum vorherigen Commit verschieben (d. H. Das letzte Commit in Ihrer lokalen Kopie rückgängig machen).

Jetzt hat jedes Git Repo eine HEAD, überprüfen Sie dies mit git show HEAD. Dementsprechend ist origin/HEADHEAD Ihrer origin Fernbedienung.

Nun, ich habe eine gute Frage gefunden HEAD beschreiben: What is HEAD in Git?

3

Es ist nur ein Zeiger zu meistern, ein symbolischer Link, wenn Sie es wünschen.git remote set-head origin -d

jetzt sollte es verschwunden sein:

  • ausführen

    1. Navigieren Sie zu Ihrem Repository: Sie können es sicher in einem Terminal die folgenden, indem Sie (oder git bash/Cygwin für Windows-Benutzer) löschen :

      $ git branch -r 
      origin/master