le modifiche git stash si applicano al nuovo ramo?


349

Stavo lavorando sul ramo principale, ho apportato alcune modifiche e poi le ho nascoste. Ora, il mio maestro è a HEAD.

Ma ora, voglio recuperare questi cambiamenti, ma in un nuovo ramo che si ramifica dalla versione HEAD del ramo principale.

Come faccio a fare questo ?


3
Penso che tu stia cercando questo? stackoverflow.com/questions/556923/...
zx1986

Risposte:


506

La procedura standard non funziona?

  • Fare cambiamenti
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

Più breve:

  • Fare cambiamenti
  • git stash
  • git checkout -b xxx
  • git stash pop

8
@sfletche se vuoi nominare il tuo stash devi fare git stash save <name>, altrimenti, come dici tu, è lo stesso di git stash.
SgtPooki,

5
Dopo aver usato questo approccio, sembra che se torni al ramo precedente, le modifiche nascoste sono tornate. È possibile avere solo le modifiche nascoste sul nuovo ramo?
Thomas Higginbotham,

È sufficiente eseguire il commit delle modifiche nella nuova filiale.
Chris R

2
@ThomasHigginbotham no la Directory di lavoro è comune tra i rami e viene copiata da uno all'altro quando si passa da un ramo all'altro. Per "ottenere" quello che vuoi di solito faccio diversi stash, aggiungendo una descrizione utile con il git stash save "description"comando menzionato in precedenza; e poi io git clearil ramo (per eliminare la directory di lavoro effettiva) e quindi git stash apply stash@{my_desired_stash}nel ramo desiderato (dopo essere passato a quello congit checkout <branch> ovviamente). So che non è una vera soluzione, ma è il massimo che puoi fare con Git .
Kamafeather,

L'ho anche finalizzato con git stash dropuna volta che mi ero impegnato
oddmeter il

221

Dal momento che hai già nascosto le modifiche, tutto ciò che serve è questo one-liner:

  • git stash branch <branchname> [<stash>]

Dai documenti ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

Crea e verifica un nuovo ramo denominato < branchname > a partire dal commit in cui è stato originariamente creato < stash >, applica le modifiche registrate in < stash > al nuovo albero di lavoro e al nuovo indice. Se ciò ha esito positivo e < stash > è un riferimento del modulo stash @ {< revisione >}, quindi rilascia < stash >. Quando nessuna < scorta >, applica l'ultimo.

Questo è utile se il ramo su cui hai eseguito git stash save è cambiato abbastanza da far sì che l'applicazione di git stash fallisca a causa di conflitti. Poiché lo stash viene applicato in cima al commit che era HEAD al momento dell'esecuzione di git stash, ripristina lo stato originariamente stash senza conflitti.


3
Per i single stash questa è la strada da percorrere. Il riferimento al nome dello stash non è richiesto in quanto Git applica lo stash più recente, passa al nuovo ramo e applica lo stash in 1 comando.
SinisterOrange

@RodneyGolpe Questo sembra applicare anche lo stash a 'master'? Quello che voglio fare è, da 'master', git stash, quindi mi sarei aspettato 'git stash branch [nome ramo] per applicare lo stash a un nuovo ramo, lasciando master senza le modifiche?
David Doria,

2
@DavidDoria Devi eseguire il commit delle modifiche al tuo nuovo ramo prima di tornare al master.
Rodney Golpe,

Ora anche questo ha impegnato le modifiche a padroneggiare ... Sono davvero in perdita ... ovviamente ancora non capisco davvero git. Dopo il soft reset del master, quindi estraendo dal repository remoto ora sono dove volevo essere. Il master è nello stato prima delle modifiche. Il nuovo ramo contiene le modifiche.
Ekkstein,

1

Se hai delle modifiche nell'area di lavoro e vuoi inserirle in un nuovo ramo, usa questo comando:

git stash branch branchName

Farà:

  1. una nuova filiale
  2. sposta le modifiche in questo ramo
  3. e rimuovi l'ultima scorta (come: git stash pop)
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.