Crea ramo Git con le modifiche correnti


851

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 un nuovo ramo.

Come posso creare un nuovo ramo e portare con me tutte queste modifiche senza sporcare il maestro ?




4
Sì, queste sono domande duplicate, ma la formulazione è così diversa che penso sia utile da conservare. Nota le parole chiave qui: branch current changesvs existing uncommited branch. Chiunque parli inglese vedrà immediatamente che sono uguali, ma i motori di ricerca probabilmente non lo faranno. Mantieni questa domanda.
Scott Biggs,

Risposte:


691

Se non hai ancora effettuato alcun commit, solo (1: branch) e (3: checkout) sarebbero sufficienti.
Oppure, in un comando:git checkout -b newBranch

Come menzionato nella git resetpagina man :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Hai fatto alcuni commit, ma ti rendi conto che erano prematuri nel " master" ramo. Vuoi continuare a lucidarli in un ramo argomento, quindi crea " topic/wip" ramo al di fuori della corrente HEAD.
  2. Riavvolgi il masterramo per sbarazzarti di questi tre commit.
  3. Passa al topic/wipramo " " e continua a lavorare.

Nota: a causa dell'effetto "distruttivo" di un git reset --hardcomando (reimposta l'indice e l'albero di lavoro. Eventuali modifiche ai file tracciati nell'albero di lavoro poiché <commit>vengono scartate), preferirei andare con:

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

Ciò assicurerebbe che non perdo alcun file privato (non aggiunto all'indice).
L' --softopzione non toccherà affatto il file indice né l'albero di lavoro (ma ripristina la testa <commit>, proprio come fanno tutte le modalità).


Con Git 2.23+ , il nuovo comandogit switch creerebbe il ramo in una riga (con lo stesso tipo di reset --hard, quindi fai attenzione ai suoi effetti):

git switch -f -c topic/wip HEAD~3

6
Probabilmente vale anche la pena notare che questa non sarebbe una buona idea se hai dedicato materiale tematico al tuo ramo principale in un repository da cui estraggono altre persone. O almeno, se hai bisogno di fare un reset, dovrai dire alle persone che è quello che stai facendo, quindi gli avvisi del loro prossimo pull non sono troppo scioccanti.
Andrew Walker,

39
Nota per i futuri lettori: leggi dal basso verso l'alto (o assicurati di leggere tutto). git reset --hardannuncerà le tue modifiche e, se non vengono ancora commesse, saranno irrecuperabili! Potresti aver solo bisogno digit checkout -b …
Conrad Meyer,

3
@ConradMeyer Ottimo punto. Ho modificato la risposta e messo il git checkout -bprimo.
VonC,

5
Perché argomento / ramo ?? perché non solo branchname, c'è un motivo speciale per questa denominazione? mi chiedo solo.
Sam Stoelinga,

1
@È solo una convenzione di denominazione degli spazi dei nomi (un modo per classificare facilmente i rami, usando i nomi dei rami gerarchici per definire gli spazi dei nomi): stackoverflow.com/a/2527436/6309 . Ad esempio, per problemi: randyfay.com/content/… . Non devi usare una gerarchia quando dai un nome ai tuoi rami. topic_wipfunzionerebbe anche;)
VonC

269

Come indicato in questa domanda: Git: crea un ramo da modifiche non contrassegnate / non confermate sul master : lo stash non è necessario.

Usa solo:

git checkout -b topic/newbranch

Qualsiasi lavoro non sottoposto a commit verrà portato insieme al nuovo ramo.

Se provi a spingere otterrai il seguente messaggio

fatale: la funzione di ramo corrente / NEWBRANCH non ha ramo a monte. Per spingere il ramo corrente e impostare il telecomando come a monte, usare

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

Fai come suggerito per creare il ramo in remoto:

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


3
Si otterrà l'errore "nessun ramo a monte" solo se si preme il nuovo ramo, non quando si commette il nuovo lavoro.
sam,

2
@sam Ho modificato la risposta di conseguenza
Nick Kennedy, l'

73

Segui questi passi:

  1. Crea una nuova filiale:

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

    git checkout newfeature
    
  3. Ora impegna il tuo lavoro su questa nuova filiale:

    git commit -s
    

Usando i passaggi precedenti manterrai pulito il tuo ramo originale e non dovrai fare alcun 'git reset --hard'.


3
Cosa fa il '-s' al punto 3?
Scott Biggs,

12
@ScottBiggs Non è necessario, ma alcune persone seguono una pratica. È l' abbreviazione di "--signoff" e aggiunge il tuo nome utente al commit per le persone future che guardano i registri per sapere che hai accettato questo commit.
Frank Bryce,

5
Bella risposta, ma non è necessario -snel passaggio 3.
Mohammed Ali,

Ho imparato qualcosa di nuovo dal commento, grazie a @FrankBryce
Kasparov92 il

30

Dato che non hai ancora effettuato alcun commit, puoi salvare tutte le modifiche nello stash, creare e passare a un nuovo ramo, quindi ripristinare quelle modifiche nel tuo 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

9
o come ha sottolineato VonC 'git checkout -b newbranch' e salta la scorta
willcodejavaforfood

@will: Stavo pensando che la creazione di un nuovo ramo avrebbe sovrascritto tutte le modifiche non confermate che hai avuto, ma se non è così, sì, puoi saltare la scorta.
Ether

1
L'ho provato e ha funzionato bene, git è molto premuroso e non sovrascriverà eventuali modifiche locali
willcodejavaforfood

2
Presumo che fosse un refuso ma solo un avvertimento che git stash pushnon è un comando. Probabilmente vorresti usare git stasho git stash save. Se si desidera includere file non tracciati nello stash, utilizzare l' --include-untrackedopzione. Allo stesso modo, se si desidera includere file non tracciati e ignorati nello stash, utilizzare --addinvece l' opzione.
Sei

nel caso abbiate già creato il ramo, questo è utile.
Sicuramente il

13

Per aggiungere nuove modifiche a un nuovo ramo e passare al telecomando:

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

Spesso dimentico di aggiungere la parte di origine per eseguire il push e confondermi perché non vedo il nuovo ramo / commit in bitbucket

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.