Cosa fare con il commit effettuato in una testa distaccata


280

Usando git ho fatto qualcosa del genere

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

Perché mi ha detto che posso ancora impegnarmi in uno stato di testa distaccato, l'ho fatto. Ma ora voglio unire il mio ramo di testa distaccato e il mio ramo principale locale, quindi spingere il mio gruppo di modifiche a origine / maestro.

Quindi la mia domanda è come potrei unire il ramo master con il mio stato attuale (testa staccata)



Se potessi aggiungere uno screenshot di un albero di commit in questo stato (come un commit su una testa staccata in realtà sembra in gitk o SourceTree), questo renderebbe questa domanda ancora migliore.
florisla,

Sfortunatamente al momento non posso, ma se puoi provvedere, sarò felice di vederlo qui. Anche se deve essere un pareggio, lo renderà più chiaro
benzen,

Risposte:


477

Crea un ramo dove ti trovi, quindi passa al master e uniscilo:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
come evitare di staccare le teste in futuro?
ycomp

L'ho fatto e mi sono trovato davanti alle origini di 5 commit. In tal caso, fai semplicemente git push origin?
Winnemucca,

5
strano, ottengo "Già aggiornato". quando fondo il mio lavoro temporaneo
Robert Sinclair,

10
Non dimenticare di eliminare my-temporary-work con "git branch -d my-temporary-work"
Captain Lepton,

5
@ycomp "testa staccata" si verifica quando si modificano i file di un vecchio commit e quindi si impegnano quelli senza ramo per fare riferimento a questo nuovo commit in un secondo momento. Per evitare la testa distaccata, non controllare i vecchi commit. Se vuoi ancora tutti i file da lì, ma come nuovo commit, puoi estrarre la directory dal commit, invece del commit stesso. Vedi questa risposta
lucidbrot il

96

Potresti fare qualcosa del genere.

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

Sarebbe ancora più semplice

git checkout master
git merge HEAD@{1}

ma questo ha il leggero pericolo che se si commette un errore, può essere un po 'più difficile recuperare gli commit fatti sulla testa staccata.


4
So che è anni dopo, ma grazie per questa risposta. Non mi sono preso in considerazione la ricerca con la risposta accettata qui perché non volevo lasciare un ramo temporaneo e questa risposta ha il comando di eliminarla.
Jeremy Pridemore,

8
Se decidi di usare il comando git merge HEAD@{1}probabilmente dovresti assicurarti che sia quello che vuoi usare usandogit reflog
Michael Stramel,

3
La possibilità di unire HEAD @ {1} mi ha salvato la vita da quando avevo già verificato il master in modo preventivo.
juil

strano, ottengo "Già aggiornato". quando si fondono tmp (ma i file sono diversi)
Robert Sinclair,

19

Questo è quello che ho fatto:

Fondamentalmente, pensa a detached HEADcome un nuovo ramo, senza nome. Puoi impegnarti in questo ramo come qualsiasi altro ramo. Una volta terminato il commit, si desidera inviarlo al telecomando.

Quindi la prima cosa che devi fare è dargli detached HEADun nome. Puoi facilmente farlo come, pur essendo su questo detached HEAD:

git checkout -b some-new-branch

Ora puoi spingerlo sul telecomando come qualsiasi altro ramo.

Nel mio caso, volevo anche far avanzare rapidamente questo ramo da padroneggiare insieme ai commit che ho fatto nel detached HEAD(ora some-new-branch). Tutto quello che ho fatto è stato

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

Certo, l'ho unito in seguito a master.

Questo è tutto.


1
Questa risposta ha funzionato per me, mentre gli altri no. git checkout -b new-branchha funzionato per me. Gli altri suggerimenti richiedevano git branch new-branch, ma questo mi ha lasciato ancora in testa staccata e il nuovo ramo non ha raccolto le mie modifiche.
Jesse Patel,

17

Puoi semplicemente fare git merge <commit-number>ogit cherry-pick <commit> <commit> ...

Come suggerito da Ryan Stewart, puoi anche creare un ramo dall'attuale HEAD:

git branch brand-name

O solo un tag:

git tag tag-name

Puoi trovare il tuo numero di commit sulla testa distaccata digit rev-parse HEAD
KOGI l'

6

In caso di HEAD distaccato, il commit funziona normalmente, tranne per il fatto che nessun ramo denominato viene aggiornato. Per ottenere il ramo principale aggiornato con le modifiche impegnate, crea un ramo temporaneo nel punto in cui ti trovi (in questo modo il ramo temporaneo avrà tutte le modifiche impegnate che hai effettuato in HEAD distaccato), quindi passa al ramo principale e unisci il ramo temporaneo con Il capo.

git branch  temp
git checkout master
git merge temp

3

Una soluzione semplice è quella di creare solo un nuovo ramo per che commettono e nella verifica ad esso: git checkout -b <branch-name> <commit-hash>.

In questo modo, tutte le modifiche apportate verranno salvate in quel ramo. Nel caso in cui sia necessario ripulire il ramo principale da commit rimanenti assicurarsi di eseguire git reset --hard master.

Con questo, riscriverai i tuoi rami, quindi assicurati di non disturbare nessuno con questi cambiamenti. Assicurati di dare un'occhiata a questo articolo per una migliore illustrazione dello stato HEAD distaccato .


1

Forse non è la soluzione migliore, (riscriverà la storia) ma potresti anche farlo git reset --hard <hash of detached head commit>.

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.