„Prosty” kontra „bieżący” push.default w git dla zdecentralizowanego przepływu pracy

122

Mówiąc funkcjonalnie, w zdecentralizowanym przepływie pracy nie widzę różnicy między opcjami konfiguracji simplea currentopcjami push.default.

currentprzeniesie bieżącą gałąź do gałęzi o identycznej nazwie na określonym pilocie. simpleskutecznie zrobi to samo zarówno dla śledzonych, jak i nieśledzonych pilotów dla bieżącej gałęzi (wymusza identyczne nazwy gałęzi w obu przypadkach).

Czy ktoś może wyjaśnić jakieś istotne różnice między nimi w przypadku zdecentralizowanych przepływów pracy, których mi brakuje?

void.pointer
źródło
2
@Trevor - to wcale nie jest związane z moim pytaniem.
void.pointer

Odpowiedzi:

185

Różnica polega na tym simple, że with , git push(bez przekazywania refspec) zakończy się niepowodzeniem, jeśli bieżąca gałąź nie śledzi zdalnej gałęzi upstream (nawet jeśli gałąź o tej samej nazwie istnieje na zdalnym):

$ 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

Z drugiej strony, currentnie dba o to, czy aktualna gałąź śledzi upstream, po prostu chce wypchnąć do dowolnej gałęzi o tej samej nazwie:

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

Dokumentacja

Z dokumentacji konfiguracji Git :

  • upstream - wypchnij bieżącą gałąź do gałęzi upstream ...

  • simple - podobnie jak upstream, ale odmawia pchania, jeśli nazwa gałęzi upstream różni się od lokalnej ...

  • current - wypchnij bieżącą gałąź do gałęzi o tej samej nazwie.


źródło
4
Wydaje mi się, że jedynym pytaniem „bonusowym” jest „dlaczego”. Wydaje mi się, że wymuszenie gałęzi śledzenia w górę eliminuje błędy (przypadkowe nadpisanie tej gałęzi na niewłaściwym pilocie).
void.pointer
7
Proste wydaje się bezpieczniejszą opcją „pasów bezpieczeństwa”.
Jonathan
2
Wracam do własnego pytania po dłuższym czasie :-) Skąd currentwiedziałem, który pilot wybrać? Jeśli nie masz ustawionej gałęzi śledzenia, gdzie to się dzieje?
void.pointer
2
Przesuwa do domyślnego pilota -> to oznacza pochodzenie. Z man git-push: Gdy wiersz poleceń nie określa, gdzie należy wypchnąć z argumentem <repozytorium>, następuje konsultacja zdalnej konfiguracji branch. *. Dla bieżącej gałęzi w celu określenia, gdzie należy przekazać. Jeśli brakuje konfiguracji, domyślnie jest to origin.
reegnz
2
Od lat zawsze używałem „prądu” bez żadnych problemów. W większości przypadków to działa: ściąganie / wypychanie do jednego repozytorium, tworzenie nowych gałęzi lub sprawdzanie istniejących gałęzi, gdzie konflikty nazw są mało prawdopodobne. Po prostu działa, żadnych problemów. Nie mogę powiedzieć, że to powinno być domyślne (ponieważ jest niebezpieczne), ale dzięki Bogu istnieje.
trisweb
10

Różnica polega na tym, że simplewypycha do gałęzi śledzącej, jeśli ma taką samą nazwę, podczas gdy currentwypycha do gałęzi o tej samej nazwie, niezależnie od gałęzi śledzenia:

$ 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
źródło