Git: "Attualmente non in alcun ramo". C'è un modo semplice per tornare su un ramo, mantenendo le modifiche?


202

Quindi ho fatto un po 'di lavoro nel repository e quando sto per impegnarmi mi rendo conto che non sono attualmente in alcun ramo.

Questo succede molto quando lavoro con i sottomoduli e sono in grado di risolverlo, ma il processo è noioso e ho pensato che ci doveva essere un modo più semplice per farlo.

C'è un modo semplice per tornare su un ramo, mantenendo le modifiche?

Risposte:


214

Se non hai commesso:

git stash
git checkout some-branch
git stash pop

Se hai commesso e non hai cambiato nulla da allora:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Se hai commesso e poi svolto un lavoro extra:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Questo non aiuta se lo hai già commesso. Nessun voto negativo, dato che non è stato specificato nella domanda.
Decano Piuttosto,

24
se hai già eseguito il commit: annota l'hash del commit che hai fatto (usa git showo git rev-parse HEAD), passa al ramo e quindi git cherry-pickseguito dall'hash del commit.
araqnid,

7
Se sottoposto a commit, ottiene l'hash dell'ultimo commit. Controlla la filiale in cui desideri essere egit merge _hash_
Daniel,

ESSERE VERAMENTE ATTENZIONE. SE HAI EFFETTUATO IL CAMBIAMENTO e segui questi passaggi ... Vedrai il messaggio ... "Il tuo ramo e origine / maestro sono divergenti".
thinkanotherone,

1
@thinkanotherone Se hai già effettuato le modifiche non ci sarebbe nulla da nascondere e il check-out di un altro ramo non è la fine del mondo. Il commit appena fatto è ancora lì e puoi unirlo a quel ramo usando git merge <hash-of-the-commit-you-just-made>.
Erik B,

160

questo mi ha aiutato

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Se hai già effettuato più commit, questo è ciò che devi fare.
Benjamin Oakes,

Non l'ho provato, ma sembra che funzionerebbe. Comunque penso che sia uno scenario improbabile. Credo che la maggior parte delle persone si renderà conto che non si trovano in alcun ramo prima di impegnarsi e utilizzare la risposta accettata per risolverlo.
Erik B

49
Saresti sorpreso.
Eric,

@ErikB Non sapevo nemmeno che esistesse qualcosa come non essere su un ramo. Questa risposta mi è stata molto utile.
Konstantin Schubert,

2
bella risposta, in realtà l'ha appena digitata e ha funzionato, a differenza di quasi tutto il resto incontrato come un principiante GIT - potresti sottolineare che newbranch è un nome arbritrario e non intende essere sostituito con un hash di commit
Toni Leigh

22
git checkout master

Il risultato è qualcosa del genere:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Facciamolo:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Non l'ho provato, ma sembra che funzionerebbe bene. Immagino che se corressi git gctra l'esecuzione di quei due comandi perderesti quei commit, ma a meno che tu non stia eseguendo git gcautomaticamente questo dovrebbe essere un approccio abbastanza privo di rischi. Continuerei con la risposta di Babay, ma se vuoi salvarti dalla scrittura di due comandi extra, immagino che questa sia la strada da percorrere.
Erik B,

Avevo lasciato il ramo principale ad un certo punto, di cui non sono del tutto sicuro. Avevo commesso i miei cambiamenti, non c'erano cambiamenti sul master. Queste istruzioni hanno portato le mie modifiche al ramo principale e tutto bene.
Matti Jokipii,

+1 Ero nervoso per il check-out di un altro ramo mentre lasciavo gli impegni alle spalle, vedendo questo messaggio ha aggiunto fiducia per andare avanti.
J-Dizzle,

11

Lasciando un altro modo qui

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Potrebbe aver eseguito più commit. In tal caso, vedi la risposta di Babay.
Benjamin Oakes,

@BenjaminOakes Potrebbe essere così, ma questi comandi git non sono nemmeno validi.
Erik B

@ErikB Sicuramente vero. :) La risposta di Babay è la forma valida di ciò che Alex sembra aver cercato di fare.
Benjamin Oakes,

9

In alternativa, è possibile impostare i sottomoduli in modo che, anziché trovarsi nel loro stato head distaccato predefinito, si verifichi un ramo.

Modificato per aggiungere:

Un modo è di fare il checkout di un particolare ramo del sottomodulo quando lo aggiungi con il flag -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Un altro modo è semplicemente andare nella directory del sottomodulo e provarlo

git checkout master

1
Potresti dirmi come farlo?
Erik B,

c'è un modo per aggiornare un sottomodulo esistente in questa modalità di diramazione predefinita? aggiornare gitmodulesforse?
Hertzel Guinness

@HertzelGuinness Non proprio. Il sottomodulo viene estratto in un commit sha specifico. Un ramo è solo un puntatore allo sha e lo sha a cui punta può cambiare. Questo non è utile perché non congela lo stato del sottomodulo estratto. Il check-out di un ramo è solo una comodità se si stanno apportando modifiche al sottomodulo.
Abizern,

5

Un modo per finire in questa situazione è dopo aver effettuato un rebase da un ramo remoto. In questo caso, i nuovi commit sono indicati da HEADma masternon puntati su di essi - sta puntando ovunque fosse prima che tu riformassi l'altro ramo.

Puoi rendere questo impegno il tuo nuovo masterfacendo:

git branch -f master HEAD
git checkout master

Questo si aggiorna forzatamente masterper indicare HEAD(senza metterti master) quindi passa a master.


Ha funzionato perfettamente come richiesto. Avevo già messo in scena i file e eseguito il commit, ma non ero in grado di inviare a causa dell'errore precedente. Sopra due righe di codice ha funzionato perfettamente e ha spinto il mio codice come previsto.
invinciblemuffi

4

Di recente ho riscontrato di nuovo questo problema. È passato un po 'di tempo dall'ultima volta che ho lavorato con i sottomoduli e dopo aver imparato di più su Git ho capito che è sufficiente controllare semplicemente il ramo su cui vuoi impegnarti. Git manterrà l'albero di lavoro anche se non lo riponi.

git checkout existing_branch_name

Se vuoi lavorare su una nuova filiale, questo dovrebbe funzionare per te:

git checkout -b new_branch_name

Il checkout fallirà se ci sono conflitti nell'albero di lavoro, ma ciò dovrebbe essere abbastanza insolito e se succede puoi semplicemente nasconderlo, pop e risolverlo.

Rispetto alla risposta accettata, questa risposta ti farà risparmiare l'esecuzione di due comandi, che comunque non richiedono molto tempo per essere eseguiti. Pertanto non accetterò questa risposta, a meno che non ottenga miracolosamente più voti (o almeno vicino) rispetto alla risposta attualmente accettata.


2

Il seguente metodo può funzionare:

git rebase HEAD master
git checkout master

In questo modo, le modifiche HEAD attuali verranno modificate in cima al master. Quindi puoi cambiare il ramo.


Un modo alternativo è quello di verificare prima la filiale:

git checkout master

Quindi Git dovrebbe visualizzare SHA1 dei tuoi commit distaccati, quindi puoi selezionarli, ad es

git cherry-pick YOURSHA1

Oppure puoi anche unire l'ultimo:

git merge YOURSHA1

Per vedere tutti i commit provenienti da diversi settori (per assicurarsi che li hai), eseguire: git reflog.


0

So di aver detto a Babay nel 2012 che pensavo fosse improbabile che qualcuno non si rendesse conto che non erano su una filiale e si sarebbero impegnati. Mi è appena successo, quindi immagino di dover ammettere di aver sbagliato, ma considerando che ci è voluto fino al 2016 perché ciò accadesse a me, si potrebbe sostenere che in realtà è improbabile.

Ad ogni modo, creare una nuova filiale è eccessivo secondo me. Tutto quello che devi fare è:

git checkout some-branch
git merge commit-sha

Se non hai copiato commit-sha prima di controllare l'altro ramo, puoi facilmente trovarlo eseguendo:

git reflog

è un problema raro (improbabile) per un uomo. Non mi è successo dal 2012. Ma se moltiplichi la possibilità di un numero di utenti git ... Sarà molto probabile. Potrebbe succedere ogni giorno a qualcuno. :)
babay
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.