Domanda Perché devo spingere esplicitamente un nuovo ramo?


Sono nuovo dentro git e sto praticando. Ho creato una filiale locale ma l'ho visto quando l'ho fatto git push il mio ramo non è stato caricato nel repository. Dovevo effettivamente fare: git push -u origin --all.
Perchè è questo? Non è un ramo un nuovo cambiamento da spingere di default? Perché devo eseguire il secondo comando?


135
2018-06-13 20:21


origine


risposte:


Il vero motivo è che, in un nuovo repository (git init), lì non è un ramo (no master, nessun ramo, zero rami)

Quindi quando stai spingendo per la prima volta a un vuoto  repository upstream (generalmente a nuda), il repository upstream non ha alcuna filiale con lo stesso nome.

E:

In entrambi i casi, poiché il repository vuoto upstream non ha branch:

  • non c'è ancora un ramo con nome corrispondente
  • non esiste alcun ramo a monte (con o senza lo stesso nome! Tracciabilità o meno)

Ciò significa il tuo locale primo push non ha idea:

  • dove spingere
  • cosa spingere (poiché non riesce a trovare alcun ramo upstream che sia registrato come ramo di monitoraggio remoto e / o che abbia lo stesso nome)

Quindi è necessario almeno fare un:

git push origin master

Ma se fai solo questo, tu:

  • creerà un upstream master ramo sul monte (ora repo non vuoto): buono.
  • non lo farà disco che il ramo locale 'master'deve essere spinto a monte (origin) 'master'(ramo a monte): cattivo.

Questo è il motivo per cui è consigliabile, per la prima spinta, fare un:

git push -u origin master

Questo registrerà origin/master come un ramo di monitoraggio remotoe consentirà alla spinta successiva di spingere automaticamente master a origin/master.

git checkout master
git push

E funzionerà anche con le politiche push 'current' o 'upstream'.
In ogni caso, dopo l'iniziale git push -u origin master, una semplice spinta Git sarà sufficiente per continuare a spingere il master verso il ramo destro a monte.


169
2018-06-13 20:52



Non lo fai, vedi sotto

Trovo questa 'caratteristica' piuttosto fastidiosa dal momento che non sto provando a lanciare razzi sulla luna, ma spingo il mio dannato ramo. Probabilmente lo fai anche tu altrimenti non saresti qui!

Ecco la correzione: se si desidera che implicitamente spinga per il ramo corrente indipendentemente dal fatto che quel ramo esiste all'origine, emettere questo comando una volta e si mai devo di nuovo dovunque:

git config --global push.default current

Quindi se fai rami come questo:

git checkout -b my-new-branch

e poi fare qualche commit e poi fare a

git push -u

per farli uscire all'origine (essendo su quel ramo) e creerà detto ramo per te se non esiste.

Si noti che -u bit si assicura che siano collegati se si dovesse prelevare successivamente da detto ramo. Se non hai in programma di tirare il ramo più tardi (o se stai bene con un altro rivestimento se lo fai) -u non è necessario.


87
2017-08-13 22:22



Uscita di git push quando si spinge un nuovo ramo

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

Un semplice git push si presuppone che esista già un ramo remoto che il ramo locale corrente sta monitorando. Se non esiste un ramo remoto di questo tipo e si desidera crearlo, è necessario specificarlo utilizzando il comando -u (forma abbreviata di --set-upstream) bandiera.

Perché è così? Immagino che gli implementatori abbiano pensato che creare un ramo sul telecomando sia un'azione così importante che dovrebbe essere difficile farlo per errore. git push è qualcosa che fai sempre.

"Non è un ramo un nuovo cambiamento da spingere di default?" Direi che "un cambiamento" in Git è un impegno. Un ramo è un puntatore a un commit. Per me ha più senso pensare a una spinta come qualcosa che spinge il commit verso gli altri repository. I commit sono determinati dal ramo in cui ci si trova e dalla relazione di tracciamento di quel ramo ai rami sul telecomando.

Puoi leggere ulteriori informazioni sul tracciamento dei rami nel Capitolo Rami remoti del libro Pro Git.


31
2018-06-13 20:25



Non sono riuscito a trovare una spiegazione razionale dagli sviluppatori originali in questo modo, ma posso darti un'ipotesi basata su alcuni anni di esperienza Git.

No, non ogni ramo è qualcosa che vuoi spingere al mondo esterno. Potrebbe rappresentare un esperimento privato.

Inoltre, dove dovrebbe git push inviare tutti i rami? Git può funzionare con più telecomandi e potresti voler avere diversi gruppi di rami su ciascuno. Per esempio. un progetto centrale GitHub repo può avere filiali di rilascio; una forcella GitHub può avere filiali di argomenti da revisionare; e un server Git locale potrebbe avere filiali contenenti configurazione locale. Se git push spingerebbe tutti i rami verso il remoto che il ramo attuale tiene traccia, questo tipo di schema sarebbe facile da rovinare.


4
2018-06-13 20:39



HEAD è l'abbreviazione per il ramo attuale quindi git push -u origine HEAD funziona. Ora per evitare questo digitando ogni volta che uso alias:

git config - global alias.pp 'push -u origine HEAD'

Dopo questo, ogni volta che voglio spingere ramo creato tramite git -b ramo posso spingerlo usando:

git pp

Spero che questo faccia risparmiare tempo a qualcuno!


2
2017-09-29 06:34



Al primo controllo

Passo 1: git remote -v
// se viene trovato git initialize, rimuovere o saltare il passaggio 2

Passo 2: git remote rm origin
// Quindi configura il tuo indirizzo email globalmente git

Passo-3: git config --global user.email "youremail@example.com"

Step-4: git initial

Step-5: git commit -m "Initial Project"
// Se già aggiungi un repository di progetto, salta il passaggio 6

Step-6: git remote add origin %repo link from bitbucket.org% 

Step-7: git push -u origin master


1
2017-12-18 08:42