Git - Was ist der Unterschied zwischen push.default "Matching" und "Simple"?

285

Ich benutze Git schon eine Weile, aber ich musste nie selbst ein neues Remote-Repo einrichten und war neugierig darauf. Ich habe Tutorials gelesen und bin verwirrt darüber, wie ich "git push" zum Laufen bringen kann.

Wenn ich es einfach benutze git push, werde ich aufgefordert, einen Standardzweig (?) Zu sehen, auf den ich zeigen soll. Was ist der Unterschied zwischen diesen beiden Optionen, die es mir bietet?

git config --global push.default matching
git config --global push.default simple

Durch das Abgleichen werden nur die Zweige verschoben, die ich in meinem lokalen Repo habe. Wenn sie nicht übereinstimmen, muss ich sie manuell anweisen, alle neuen lokalen Zweige zu verschieben, richtig? Ist diese bewährte Methode anzuwenden oder ist sie einfach die beste?

Josh
quelle
1
Nun, wenn nur pull.defaultverfügbar ist, um alle diese Zweige lokal zu aktualisieren
Nogurenn

Antworten:

367

git push kann abhängig von dieser Konfiguration alle oder einen einzelnen Zweig pushen:

Schieben Sie alle Zweige

git config --global push.default matching

Es werden alle Zweige in den Remote-Zweig verschoben und zusammengeführt. Wenn Sie nicht alle Zweige verschieben möchten, können Sie nur den aktuellen Zweig verschieben.

Schieben Sie nur den aktuellen Zweig

git config --global push.default simple

Meiner Meinung nach ist es daher besser, diese Option zu verwenden und Ihren Code Zweig für Zweig zu pushen. Es ist besser, Zweige manuell und einzeln zu verschieben.

Lalit Sachdeva
quelle
16
Mir hat die push.default currentAntwort von @UpAndAdam gefallen . Weiß nicht davon.
Alanjds
4
Beachten Sie, dass dies simplekeine Option mehr ist. In 1.7.8.4(und früher?) Führt es zu einem Fehler, wenn Sie versuchen zu pushen. aber currentist noch verfügbar
sechzig4bit
@ sixty4bit: Ich verwende Git Version 1.7.1. Ich verwende tracking-> schiebe den aktuellen Zweig in seinen vorgelagerten Zweig.
Kevinarpe
@ sixty4bit Nein, es wurde in eine spätere Version von Git aufgenommen. Ich weiß nicht, in welcher, aber (1.7) ist verdammt alt, auch für 2016. Ich würde nicht empfehlen, solche alten Versionen überhaupt zu verwenden.
Schmoudi
Abgestimmt. Entschuldigung, aber die Beschreibung der verlinkten Seite von simplemacht keinen Sinn, widerspricht dieser Antwort und ist falsch - was diese Antwort verwirrend macht. Auf der verlinkten Seite heißt es: simple"Verschiebt Zweige nacheinander. Meistens mit dem aktuellen Zweig verbunden." Bedeutet das, dass die Zweige nacheinander und nicht parallel geschoben werden? Was bedeutet "meistens verbunden"? Dann simplezitiert die Beschreibung für die Beschreibung für matching, was bedeuten würde, dass die Beschreibung für matchingauch für gilt simple. Aber das stimmt natürlich nicht.
tvanc
91

Aus der GIT-Dokumentation: Git Docs

Unten finden Sie die vollständigen Informationen. Kurz gesagt, simplewird das current working branchund auch dann nur drücken, wenn es auch den gleichen Namen auf der Fernbedienung hat. Dies ist eine sehr gute Einstellung für Anfänger und wird zur Standardeinstellung inGIT 2.0

Während alle Filialen lokal, die den gleichen Namen haben, auf der Fernbedienung matchingpushen . (Ohne Rücksicht auf Ihren aktuellen Arbeitszweig). Dies bedeutet, dass möglicherweise viele verschiedene Zweige gepusht werden, einschließlich derer, die Sie möglicherweise nicht einmal teilen möchten.

In meinem persönlichen Gebrauch verwende ich im Allgemeinen eine andere Option: currentdie den aktuellen Arbeitszweig pusht (weil ich immer nach Änderungen verzweige). Aber für einen Anfänger würde ich vorschlagensimple

push.default
Definiert die Aktion, die git push ausführen soll, wenn keine explizite Spezifikation angegeben wird. Unterschiedliche Werte eignen sich gut für bestimmte Workflows. In einem rein zentralen Workflow (dh die Abrufquelle entspricht dem Push-Ziel) ist Upstream wahrscheinlich das, was Sie möchten. Mögliche Werte sind:

nichts - nichts pushen (Fehler raus), es sei denn, es wird ausdrücklich eine Referenz angegeben. Dies ist in erster Linie für Menschen gedacht, die Fehler vermeiden wollen, indem sie immer explizit sind.

current - Drücken Sie auf den aktuellen Zweig, um einen Zweig mit demselben Namen auf der Empfangsseite zu aktualisieren. Funktioniert sowohl in zentralen als auch in nicht zentralen Workflows.

Upstream - Schieben Sie den aktuellen Zweig zurück zu dem Zweig, dessen Änderungen normalerweise in den aktuellen Zweig integriert sind (der als @ {Upstream} bezeichnet wird). Dieser Modus ist nur dann sinnvoll, wenn Sie auf dasselbe Repository pushen, aus dem Sie normalerweise abrufen würden (dh zentralen Workflow).

Einfach - Arbeiten Sie in einem zentralisierten Workflow wie ein Upstream mit einer zusätzlichen Sicherheit, um das Drücken zu verweigern, wenn sich der Name des Upstream-Zweigs vom lokalen unterscheidet.

Wenn Sie auf eine Fernbedienung drücken, die sich von der Fernbedienung unterscheidet, von der Sie normalerweise ziehen, arbeiten Sie als Strom. Dies ist die sicherste Option und für Anfänger geeignet.

Dieser Modus wird zum Standard in Git 2.0.

Matching - Schieben Sie alle Zweige mit dem gleichen Namen an beiden Enden. Dadurch merkt sich das Repository, auf das Sie pushen, die Anzahl der zu verschiebenden Zweige (z. B. wenn Sie dort immer Maint und Master und keine anderen Zweige drücken, enthält das Repository, in das Sie pushen, diese beiden Zweige sowie Ihren lokalen Maint und Master wird dort geschoben).

Um diesen Modus effektiv zu nutzen, müssen Sie sicherstellen, dass alle Zweige, die Sie herausschieben würden, zum Herausschieben bereit sind, bevor Sie git push ausführen, da der Sinn dieses Modus darin besteht, Ihnen zu ermöglichen, alle Zweige auf einmal zu schieben. Wenn Sie normalerweise nur einen Zweig bearbeiten und das Ergebnis veröffentlichen, während andere Zweige noch nicht fertig sind, ist dieser Modus nichts für Sie. Dieser Modus eignet sich auch nicht zum Verschieben in ein freigegebenes zentrales Repository, da andere Personen dort möglicherweise neue Zweige hinzufügen oder die Spitze vorhandener Zweige außerhalb Ihrer Kontrolle aktualisieren.

Dies ist derzeit die Standardeinstellung, aber Git 2.0 ändert die Standardeinstellung in "Einfach".

UpAndAdam
quelle
Ja, aber ich gehe sogar mit der Einstellung push.default davon aus, dass, wenn Sie "$ git push origin master " ausführen, nur der aktuelle Zweig zum Ursprung zum Zweig am Ursprung mit demselben Namen verschoben wird ... richtig? Sie sollten erwähnen, dass es auch eine Standardfernbedienung gibt
Alexander Mills
1
Ich bin mir nicht sicher, ob ich verstehe, worauf du hinaus willst. Wenn Sie in JEDEM MODUS sagen, dass git push origin masteres dasselbe tut. Der Sinn der Modi und Standardeinstellungen ist im Allgemeinen, was passiert, wenn Sie einfach sagen git pushund es nicht einer Fernbedienung oder einem Zweig mitteilen. Welche Standardeinstellung? du meinst die Standardeinstellung von push.default? Die Standardeinstellung in welcher Version von Git ... Wenn Sie es nicht bekommen, ist Ihr Kommentar äußerst vage.
UpAndAdam
'push.default Definiert die Aktion, die git push ausführen soll, wenn keine Referenz angegeben wird.' Wenn Sie sagen, dass git push origin master Ihnen mehr Informationen gibt und es möglicherweise immer noch nicht das tut, was Sie beschreiben. Abhängig von der von Ihnen eingerichteten Referenz
UpAndAdam
2

Versionshinweise zu Git v2.0

Hinweise zur Abwärtskompatibilität

Wenn git push [$there]nicht gesagt wird, was zu pushen ist, haben wir bisher die traditionelle "Matching" -Semantik verwendet (alle Ihre Zweige wurden an die Fernbedienung gesendet, solange dort bereits Zweige mit demselben Namen vorhanden sind). In Git 2.0 ist die Standardeinstellung jetzt die "einfache" Semantik, die Folgendes vorantreibt:

  • Nur der aktuelle Zweig zu dem Zweig mit demselben Namen und nur, wenn der aktuelle Zweig so eingestellt ist, dass er in diesen Remote-Zweig integriert wird, wenn Sie auf denselben Remote-Zweig pushen, von dem Sie ihn abrufen. oder

  • Nur der aktuelle Zweig zu dem Zweig mit demselben Namen, wenn Sie auf eine Fernbedienung pushen, von der Sie normalerweise nicht abrufen.

Sie können dies mit der Konfigurationsvariablen "push.default" ändern. Wenn Sie ein Oldtimer sind, der weiterhin die Semantik "Matching" verwenden möchte, können Sie die Variable beispielsweise auf "Matching" setzen. Lesen Sie die Dokumentation für andere Möglichkeiten.

Wenn git add -uund git add -Ain einem Unterverzeichnis ausgeführt werden, ohne anzugeben, welche Pfade in der Befehlszeile hinzugefügt werden sollen, werden sie aus Gründen der Konsistenz mit git commit -aund anderen Befehlen für den gesamten Baum ausgeführt (diese Befehle werden nur für das aktuelle Unterverzeichnis verwendet). Sagen Sie git add -u .oder git add -A .wenn Sie den Vorgang auf das aktuelle Verzeichnis beschränken möchten.

git add <path>ist dasselbe wie git add -A <path>jetzt, sodass git add dir/Pfade, die Sie aus dem Verzeichnis entfernt haben , bemerkt und das Entfernen aufgezeichnet werden. In älteren Versionen von Git git add <path>werden Entfernungen ignoriert. Sie können sagen git add --ignore-removal <path>, dass Sie nur hinzugefügte oder geänderte Pfade hinzufügen <path>möchten, wenn Sie dies wirklich möchten.

CodeWizard
quelle