git: cambia ramo senza staccare la testa


102

Ho un repository su GitHub con un ramo principale (master) e un ramo per alcuni lavori sperimentali. Ho fatto alcuni commit e sono passato al ramo sperimentale e tutto è andato bene.

Ora, su una macchina diversa, provo a clonare il mio repository (git clone repository ) e poi passare al ramo sperimentale (git checkout branchname ) ma ogni volta che lo faccio la mia testa si stacca e non posso inviare le mie modifiche. Che cosa sto facendo di sbagliato? Ho la sensazione che mi manchi un concetto fondamentale di git da qualche parte, ma leggere pagine man casuali di git non mi dà alcun indizio.

Sono nuovo su Git quindi mi dispiace se sono un idiota ma non riesco a trovare nulla nei documenti che mi aiuti a riattaccare la testa.

MODIFICARE

Il concetto di un ramo di monitoraggio è quello che mi mancava. Ora che ho capito questo concetto è tutto chiaro. Personalmente, trovo che la git branch --tracksintassi sia molto più intuitiva di git checkout -b branch-name origin/branch-name.

Grazie per l'aiuto!


Per cambiare ramo senza staccare la testa, con Git 2.23 (agosto 2019), usa git switch: vedi la mia risposta sotto .
VonC

Risposte:


115
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Per comodità, puoi usare la stessa stringa per localname e branchname
Quando hai estratto origin/branchnamenon stavi realmente verificando un ramo. origin/branchnameè un nome "remoto" e puoi ottenerne un elenco con

branch -a 

Se hai i colori abilitati, i rami locali saranno un colore e un altro remoto.

Devi prima creare un ramo remoto tracciato localmente per poterlo passare e lavorarci.


9
Cavolo, perché "git checkout origin / branchname" non inizia a tracciare automaticamente il ramo se non è ancora tracciato?
Martin Konicek

4
perché hai ancora bisogno di un nome locale per la filiale estera.
Kent Fredric,

Ecco cosa sto facendo e il messaggio di errore: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: l'aggiornamento dei percorsi è incompatibile con il cambio di rami. Avevi intenzione di effettuare il checkout "upstream / topic / fetch" che non può essere risolto come commit?
ulu

2
Grazie per il suggerimento sui colori. Per abilitare i colori:git config --global --add color.ui true
PonyEars

1
Vale la pena notare che "origin / branchname" può letteralmente essere qualsiasi cosa che si risolva in SHA1, o SHA1 in sé =). Lo uso regolarmente per creare rami arbitrari con radici arbitrarie.
Kent Fredric

16
git clone git@github.com:abc/def.git
cd def

Ora crea un ramo di monitoraggio:

git branch --track experimental origin/experimental
git checkout experimental

Quindi, dopo aver lavorato lì, è sufficiente eseguire il push su github di

git push

3
git branch -t origin / sperimentale # non è necessario digitare così tanto :)
Dustin

Il ramo che voglio monitorare si chiama topic / fetch. Quando provo a fare $ git branch --track topic / fetch upstream / topic / fetch si dice, fatale: Non è un nome oggetto valido: 'upstream / topic / fetch'.
ulu

1
@Dustin, quel comando crea un ramo locale "origin / experiment" che tiene traccia del master locale. Immagino sia un errore abbastanza comune.
PDug

1
@PDug% git checkout -t origin / sperimentale Branch sperimentale impostato per tracciare il ramo remoto sperimentale dall'origine tramite rebase. Passato a un nuovo ramo "sperimentale"
Dustin

11

Per espandere la risposta di Kent, dopo aver clonato l'unico ramo che avrai (i telecomandi non contano) è quello che era attivo nel repository da cui hai clonato - master nel tuo caso.

Quindi, prima ti consigliamo di creare un nuovo ramo per tracciare il ramo sperimentale remoto:

$ git branch experimental origin/experimental

e poi dai un'occhiata:

$ git checkout experimental

Tuttavia, Kent ha ragione: questi due comandi possono essere combinati

$ git checkout -b experimental origin/experimental

3

Con Git 2.23 (agosto 2019), useresti il git switchcomando

Se hai un ramo remoto con lo stesso nome, verrà automaticamente tracciato:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
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.