Push.default "semplice" vs "attuale" in git per un flusso di lavoro decentralizzato


122

Funzionalmente parlando, in un flusso di lavoro decentralizzato, non vedo la differenza tra simplee le currentopzioni per l' push.defaultimpostazione della configurazione.

current spingerà il ramo corrente a un ramo con lo stesso nome sul telecomando specificato. simplefarà effettivamente la stessa cosa anche per i telecomandi tracciati e non tracciati per il ramo corrente (applica nomi di ramo identici in entrambi i casi).

Qualcuno può spiegare eventuali differenze importanti tra i due per i flussi di lavoro decentralizzati che mi mancano?



2
@Trevor - questo non è affatto correlato alla mia domanda.
void

Risposte:


185

La differenza è che con simple, git push(senza passare un refspec) fallirà se il ramo corrente non sta monitorando un ramo upstream remoto (anche se esiste un ramo con lo stesso nome sul telecomando):

$ 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

D'altra parte, currentnon si preoccupa se il ramo corrente traccia o meno un upstream, vuole solo eseguire il push a qualsiasi ramo che ha lo stesso nome:

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

La documentazione

Dalla documentazione di configurazione di Git :

  • upstream - spingere il ramo corrente al suo ramo a monte ...

  • simple - come a monte, ma si rifiuta di spingere se il nome del ramo a monte è diverso da quello locale ...

  • current - spinge il ramo corrente a un ramo con lo stesso nome.


4
Immagino che l'unica domanda "bonus" sia "perché". Immagino che forzare un ramo di tracciamento a monte elimini gli errori (sovrascrivendo accidentalmente quel ramo sul telecomando sbagliato).
void

7
Semplice sembra l'opzione "cintura di sicurezza" più sicura.
Jonathan

2
Rivisitando la mia stessa domanda dopo tanto tempo :-) Come facevo a currentsapere quale telecomando scegliere? Se non disponi di un set di rami di tracciamento, dove viene inviato?
void.pointer

2
Spinge al telecomando predefinito -> che significa origine. Da man git-push: Quando la riga di comando non specifica dove eseguire il push con l'argomento <repository>, viene consultata la configurazione remota branch. *. Per il ramo corrente per determinare dove eseguire il push. Se la configurazione è mancante, il valore predefinito è origin.
reegnz

2
Ho sempre usato "corrente" per anni senza alcun problema. Per la maggior parte dei casi funziona: tirare / spingere a un repository, creare nuovi rami o estrarre rami esistenti in cui sono improbabili conflitti di denominazione. Funziona e basta, nessun problema. Non posso dire che dovrebbe essere l'impostazione predefinita (poiché non è sicuro) ma per fortuna esiste.
trisweb

10

La differenza è che simplespinge al suo ramo di tracciamento se ha lo stesso nome, mentre currentesegue il push a un ramo con lo stesso nome indipendentemente da qualsiasi ramo di tracciamento:

$ 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` 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.