2013-03-13 9 views
50

Wenn ich einen neuen Zweig bis zu einem Remote-Repository über Git Extensions drücken, erhalte ich eine BenachrichtigungWas ist eine Tracking-Referenz?

The branch {branch name} does not have a tracking reference. Do 
you want to add a tracking reference for {branch name}? 

sagen Was ist eine Tracking-Referenz? Ich habe nur ein paar Erwähnungen von Tracking-Referenzen in Google und keine echte Definition gefunden.

+2

Siehe push -u für die Schaufel. – bmargulies

+0

Wenn ich die git man-Seiten für push, pull und config richtig verstehe, handelt es sich bei einer Tracking-Referenz um eine Einstellung oder Einstellungen, die der config-Datei hinzugefügt werden und von arg-less git-pull verwendet werden, um zu bestimmen, was heruntergezogen werden soll. Ich finde die Dokumentation ein wenig verwirrend, aber ich nehme an, dass die Tracking-Referenz eine Kombination der folgenden Einstellungen in der Konfigurationsdatei ist: remote. .fetch und Zweig. .merge. Ist das korrekt? –

Antwort

21

Die Grundidee ist, dass es rein lokale Referenzen (z. B. Verzweigungen, Tags) gibt, und dann gibt es Remote-Tracking-Referenzen, die folgen, was in anderen Repos passiert. Da Git dezentralisiert ist, ist es möglich, einen Namen für eine Verzweigung zu wählen, die mit der einer entfernten Station identisch ist, ohne dass man sich über die andere informiert hat, so dass sie völlig anders arbeiten. Mit Git können Sie dies tun, aber es bietet auch eine Möglichkeit, lokale Referenzen mit entfernten zu verknüpfen.

Betrachten wir zum Beispiel die folgende:

% git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/maint 
    remotes/origin/master 
    remotes/origin/next 
    remotes/origin/pu 
    remotes/origin/todo 

Hier haben wir Niederlassungen auf origin genannt next und todo.

% git checkout -t remotes/origin/next 
Branch next set up to track remote branch next from origin. 
Switched to a new branch 'next' 
% git branch todo  

Jetzt haben wir eine lokale Niederlassung next, die den Remote-Zweig mit dem gleichen Namen und lokalen Zweigbahnen todo, die remotes/origin/todo mit Änderungen nicht aktualisiert werden.

+0

Danke. Eine "Referenz" ist also nur ein Objekt, wie eine Verzweigung oder ein Tag, und eine "Tracking-Referenz" ist nur ein Objekt, das mit einem entsprechenden Objekt in einem Remote-Repository verknüpft ist. –

+2

Ja - das ist die Hauptidee. "Objekt" hat in Git eine besondere Bedeutung; es bedeutet alles mit einem SHA1, das unter .git/objects gespeichert ist, also ist es allgemeiner als "reference", aber das ist die Idee. –

+15

Sooo, uhhhh, jemand möchte empfehlen, ob wir JA oder NEIN sagen sollten? "Möchten Sie eine Tracking-Referenz zum Master hinzufügen?" In praktischer Hinsicht ist alles noch verwirrend. Was wird normalerweise ausgewählt? Gibt es irgendwelche Vor- und Nachteile für beide Optionen? Kann man "JA" sagen und es einfach vergessen, ohne dass es Probleme gibt? –

5

Nick Quaranto ausgezeichneter Blog git ready hat einen Beitrag zu erklären remote tracking branches:

Fern Tracking-Zweige haben ein paar verschiedenen Zwecke:

  • Sie werden verwendet, zu verbinden, was Sie‘ re arbeitet lokal verglichen mit dem auf der Fernbedienung.

  • Sie werden automatisch wissen, welche Remote-Zweigstelle Änderungen von erhalten, wenn Sie git pull oder git fetch verwenden.

  • Noch besser, Git Status wird ihn erkennen, wie viele Commits Sie in Front der Remote-Version der Branche sind.

5

Ein lokaler git Zweig kann einen Remote-Zweig verfolgen, was bedeutet, dass git push und Git-Pull-Befehle werden wissen, standardmäßig und von dem verfolgten Zweig zu schieben und zu ziehen verpflichtet. Der git-Status zeigt außerdem den Status zwischen Ihrer aktuellen lokalen Zweigstelle und der entfernten Zweigstelle an, die verfolgt wird. Wenn Sie ein Git-Repository klonen, fügt Git dem lokalen Master-Zweig einen Tracking-Verweis hinzu, um den Remote-Master-Zweig zu verfolgen. Wenn Sie aus einer neuen Remote-Zweigstelle auschecken, fügt git der erstellten lokalen Zweigstelle eine Verfolgungsreferenz hinzu, um die entfernte Zweigstelle zu verfolgen, die Sie ausgecheckt haben.

Wenn Sie jedoch einen neuen Zweig lokal erstellen und ihn dann an das Remote-Repository senden, müssen Sie git explizit mitteilen, ob der lokale Zweig die Verfolgung des neuen Remote-Zweiges starten soll. Verwenden Sie dazu die Option -u oder --set-upstream, wenn Sie den lokalen Zweig an das Remote-Repository senden: git push -u origin my-new-branch.

Mit dem Befehl git branch -vv können Sie überprüfen, welche Remote-Zweige Ihre lokalen Niederlassungen verfolgen (falls vorhanden). Unten sehen Sie ein kleines Beispiel für die Ausgabe.

b1  560eb64 Added file.txt 
    b2  560eb64 [origin/b2] Added file.txt 
    b3  b638c18 [origin/r1: ahead 1] Added file3.txt 
* master 560eb64 [origin/master] Added file.txt 

In diesem Fall haben wir Ortsvereine master, b1, b2 und b3. Der master Zweig einen entfernten Zweig master, der b1 Zweig genannt wird Tracking alle Remote-Zweige nicht Tracking, der b2 Zweig verfolgt ein entfernter Zweig genannt b2 und der b3 Zweig ist ein Remote-Zweig genannt r1 Tracking. git branch -vv zeigt auch den Status des Zweigs an, der sich auf den verfolgten Zweig bezieht. Hier ist die Verzweigung b3 1 Commit vor der verfolgten entfernten Verzweigung und die anderen Verzweigungen sind mit ihren jeweiligen remote verfolgten Verzweigungen auf dem neuesten Stand.

Wenn Sie also eine lokale Verzweigung erstellen und an das Remote-Repository senden, möchten Sie der Verzweigung eine Verfolgungsreferenz hinzufügen oder nicht? Wenn Sie einen neuen lokalen Zweig an das Remote-Repository senden, können Sie normalerweise mit anderen Entwicklern an einem Feature zusammenarbeiten. Wenn Sie Ihrer lokalen Zweigstelle eine Verfolgungsreferenz hinzufügen, können Sie die Änderungen, die andere Personen vorgenommen haben, bequem in die Verzweigung übernehmen. Daher würde ich sagen, dass Sie in den meisten Fällen die Verfolgungsreferenz hinzufügen möchten.

1

ja wahrscheinlich möchten Sie es hinzufügen. Tun Sie dies in der Konsole: git branch --set-upstream-zum Ursprung/Master