"Einfach" vs "aktuell" push.default in git für dezentralen Workflow

121

Funktionell sehe ich in einem dezentralen Workflow keinen Unterschied zwischen simpleund currentOptionen für die push.defaultKonfigurationseinstellung.

currentschiebt den aktuellen Zweig zu einem Zweig mit identischem Namen auf der angegebenen Fernbedienung. simplewird effektiv dasselbe für die verfolgten und alle nicht verfolgten Fernbedienungen für den aktuellen Zweig tun (erzwingt in beiden Fällen identische Filialnamen).

Kann jemand wichtige Unterschiede zwischen den beiden für dezentrale Workflows erklären, die mir fehlen?

void.pointer
quelle
2
@ Trevor - das hat überhaupt nichts mit meiner Frage zu tun.
void.pointer

Antworten:

184

Der Unterschied besteht darin , dass mit simple, git push(ohne Refspec vorbei) fehl , wenn der Stromzweig nicht einen entfernten vorderen Schenkels (auch wenn ein Zweig mit dem gleichen Namen auf der Fernbedienung vorhanden) Tracking:

$ git checkout -b foo
Switched to a new branch 'foo'

$ git config push.default simple
$ git push
fatal: The current branch foo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin foo

Auf der anderen Seite ist currentes egal, ob der aktuelle Zweig einen Upstream verfolgt oder nicht, er möchte nur zu einem Zweig mit demselben Namen pushen:

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo

Die Dokumentation

Aus der Git-Konfigurationsdokumentation :

  • upstream - Schieben Sie den aktuellen Zweig in den vorgelagerten Zweig ...

  • simple - wie Upstream, weigert sich jedoch zu pushen, wenn sich der Name des Upstream-Zweigs vom lokalen unterscheidet ...

  • current - Schieben Sie den aktuellen Zweig auf einen gleichnamigen Zweig.


quelle
4
Ich denke, die einzige "Bonus" -Frage ist "warum". Ich denke, das Erzwingen eines Upstream-Tracking-Zweigs beseitigt Fehler (versehentliches Überschreiben dieses Zweigs auf der falschen Fernbedienung).
void.pointer
7
Einfach scheint die sicherere Option "Sicherheitsgurt".
Jonathan
2
Nach langer Zeit meine eigene Frage noch einmal durchgehen :-) Woher wusste currentich, welche Fernbedienung ich wählen sollte? Wenn Sie keinen Tracking-Zweig festgelegt haben, wohin wird er verschoben?
void.pointer
2
Es wird auf die Standardfernbedienung verschoben -> das bedeutet Ursprung. Von man git-push: Wenn die Befehlszeile mit dem Argument <repository> nicht angibt, wohin gepusht werden soll, wird die Remotekonfiguration für den aktuellen Zweig herangezogen, um zu bestimmen, wohin gepusht werden soll. Wenn die Konfiguration fehlt, wird standardmäßig der Ursprung verwendet.
Reegnz
2
Ich habe jahrelang 'current' immer ohne Probleme verwendet. In den meisten Fällen funktioniert es: Ziehen / Drücken zu einem Repo, Erstellen neuer Zweige oder Auschecken vorhandener Zweige, bei denen Namenskonflikte unwahrscheinlich sind. Funktioniert einfach, keine Probleme. Ich kann nicht sagen, dass es die Standardeinstellung sein sollte (da es unsicher ist), aber Gott sei Dank existiert es.
Trisweb
10

Der Unterschied besteht darin, dass simplebei gleichem Namen auf den Tracking-Zweig verschoben wird, während currentunabhängig vom Tracking-Zweig auf einen Zweig mit demselben Namen verschoben wird:

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
jthill
quelle