2010-10-10 20 views
531

Ho iniziato a lavorare sul mio ramo principale pensando che il mio compito sarebbe stato facile. Dopo un po 'ho capito che ci sarebbe voluto più lavoro e voglio fare tutto questo lavoro in una nuova filiale. Come posso creare un nuovo ramo e prendere tutte queste modifiche con me senza padrone sporco?Creazione ramo Git con modifiche correnti

+8

possibile duplicato di [Spostare il lavoro esistente non impegnato in un nuovo ramo in Git] (http://stackoverflow.com/questions/1394797/move-existing-uncommited-work-to-a-new-branch-in -git) – Marijn

+0

dup di http://stackoverflow.com/questions/2569459/git-create-a-branch-from-unstaged-uncommited-changes-on-master – andrej

+1

grazie! anch'io! – Jonah

risposta

448

Se non avessi ancora effettuato alcun commit, basterebbe solo (1: branch) e (3: checkout).
O, in un solo comando: git checkout -b newBranch

Come menzionato nel git reset man page:

$ git branch topic/wip  # (1) 
$ git reset --hard HEAD~3 # (2) NOTE: use $git reset --soft HEAD~3 (explanation bellow) 
$ git checkout topic/wip # (3) 
  1. Hai fatto qualche commit, ma rendersi conto che erano prematuri per essere nel "master" ramo. Si desidera continuare a lucidarli in un ramo dell'argomento, quindi creare il ramo "topic/wip" fuori dallo HEAD corrente.
  2. Riavvolgere il ramo master per sbarazzarsi di quei tre commit.
  3. Passare al ramo "topic/wip" e continuare a lavorare.

Nota: per l'effetto "distruttivo" di un comando git reset --hard (. Lo fa azzera l'indice e l'albero di impiego tutte le modifiche apportate ai file rilevate nella struttura opera dal <commit> vengono scartati), avrei preferito andare con un:

$ git reset --soft HEAD~3 # (2) 

, per assicurarsi che non sto perdendo alcun file privato (non aggiunto all'indice).
L'opzione --soft non tocca affatto il file indice né l'albero di lavoro (ma reimposta la testina su <commit>, come tutte le modalità).

+5

Probabilmente vale anche la pena notare che questa non sarebbe una buona idea se si è impegnato materiale argomento per il proprio ramo master in un repository da cui provengono altre persone. O almeno, se hai bisogno di fare un reset devi dire alla gente che è quello che stai facendo in modo che gli avvertimenti del loro prossimo tiro non siano troppo di uno shock. –

+0

In realtà non avevo ancora commesso alcun commit. Quindi, davvero facile, grazie amico – willcodejavaforfood

+19

Nota per i futuri lettori: leggere dal basso verso l'alto (o essere sicuri di leggere l'intera cosa). 'git reset --hard' cancellerà le modifiche e se non sono state ancora eseguite sono irrecuperabili! Potresti aver bisogno di 'git checkout -b ...' –

15

Dal momento che non si è fatto alcun commette ancora, è possibile salvare tutte le modifiche apportate al nascondiglio, creare e passare a un nuovo ramo, poi pop questi cambiamenti nel vostro albero di lavoro:

git stash # save local modifications to new stash 
git checkout -b topic/newbranch 
git stash pop # apply stash and remove it from the stash list 
+7

o come VonC ha sottolineato 'git checkout -b newbranch' e salta lo stash – willcodejavaforfood

+0

@will: stavo pensando che la creazione di un nuovo ramo avrebbe sovrascritto tutte le modifiche non salvate che avevi, ma se questo non è il caso, sì puoi saltare il riporre. – Ether

+1

L'ho provato e ha funzionato bene, git è molto premuroso e non sovrascrive eventuali modifiche locali – willcodejavaforfood

162

Come dichiarato in questa domanda: Git: Create a branch from unstagged/uncommited changes on master: lo stash non è necessario.

Basta usare:

git checkout -b topic/newbranch

Qualsiasi lavoro non impegnati sarà presa insieme alla nuova filiale.

Se si tenta di spingere si otterrà il seguente messaggio

fatale: L'attuale funzione di ramo/NEWBRANCH non ha ramo a monte.Per spingere il ramo corrente e impostare il telecomando come monte, utilizzare

git push --set-upstream origin feature/feature/NEWBRANCH 

Basta fare come suggerito per creare il ramo remoto:

git push --set-upstream origin feature/feature/NEWBRANCH

+5

l'ho già fatto due volte. funziona alla grande!!! – simgineer

+1

Si otterrà l'errore "nessun ramo upstream" solo se si preme il nuovo ramo, non quando si esegue il commit del nuovo lavoro. – sam

+1

@sam Ho modificato la risposta di conseguenza –

51

procedere come segue:

  1. Creare una nuova filiale:

    git branch newfeature 
    
  2. Checkout nuova filiale: (questo non ripristinerà il vostro lavoro.)

    git checkout newfeature 
    
  3. Ora commettere il vostro lavoro su questo nuovo ramo:

    git commit -s 
    

Utilizzando i passaggi precedenti manterrà pulito il tuo ramo originale e non dovrai fare alcun 'reset git --hard'.

+1

Cosa fa il "-s" nel passaggio 3? –

+7

@ScottBiggs Non è necessario, ma è una pratica seguita da alcune persone. È [abbreviazione di "--signoff"] (https://git-scm.com/docs/git-commit) e aggiunge il tuo nome utente al commit per le persone future che guardano i log per sapere che hai autorizzato questo commit . –

+2

Risposta piacevole, ma non c'è bisogno di '-s' nel passaggio 3. –

2

Per aggiungere nuove modifiche ad un nuovo ramo e spingere a distanza:

git branch branch/name 
git checkout branch/name 
git push origin branch/name 

Spesso mi dimentico di aggiungere la parte all'origine di spingere e ottenere confuso perché non vedo la nuova filiale/impegno in bitbucket

Problemi correlati