Git - lavorando su un ramo sbagliato - come copiare le modifiche al ramo di argomento esistente


333

Ho lavorato su un progetto, ma sfortunatamente, ho dimenticato di passare al mio ramo e come tale ho lavorato sul master

Come posso copiare il lavoro (3 file) che ho fatto qui dal master, al mio ramo (chiamato, ad esempio branch123 ) senza passare al master?

Risposte:


540

Sembra che tutto ciò di cui hai bisogno sia il seguente:

git stash
git checkout branch123
git stash apply

Quindi dovresti tornare sul tuo ramo senza toccare il ramo principale.


6
ok- l'ho eseguito, ma quando torno al master (git checkout master) ed eseguo lo stato git, gli stessi file sono ancora "modificati" - è previsto?
Alex,

5
Potrebbe non essere necessario stash, se le differenze tra il ramo corrente (master) e il ramo argomento (branch123) non si trovano in nessuno dei file modificati localmente. Git ti permetterà semplicemente di controllare il ramo argomento in quel caso.
Cascabel,

3
@Alex: Sì, è previsto. Questo non comporta impegni. stashsalva le modifiche locali, quindi le stash applyriporta.
Cascabel,

6
come posso "liberarmene" dal ramo principale ... per lasciarlo pulito?
Alex,

7
git reset --hard HEADe sei tornato all'ultimo commit che hai fatto alla tua filiale principale.
Gnab,

46

La risposta accettata è la più completa, ma esiste un caso speciale in cui è possibile semplificare. Se i file che hai modificato nella directory di lavoro sono identici in entrambi mastere branch123puoi semplicemente farlo

git checkout branch123

Non è necessario archiviare nulla, poiché il comportamento predefinito checkoutè NON sovrascrivere i file modificati nella directory di lavoro, in modo da non perdere nulla. (Questo è stato effettivamente menzionato nei commenti prima da Cascabel)

Come altre persone hanno menzionato nei commenti, se branch123non esiste ancora, puoi farlo

git checkout -b branch123

Sulla base di quello che ho trovato qui .


3
Oppure, se si desidera creare una nuova filiale,git checkout -b newbranch
Phil Mitchell,

2
Per me funziona meglio della scorta ed è molto più semplice. Grazie!
Matthias,

31
No, questo non funziona. Git ti mostrerà questo messaggio: "esegui il commit delle modifiche o nascondile prima di poter cambiare ramo".
dsharew il

1
@DegenSharew: Sì, hai ragione in alcuni casi, vale a dire se i file che hai modificato nella directory di lavoro non sono identici in mastere branch123. Vedi la mia risposta modificata.
Russel Dirks,

1
Questo ha funzionato alla grande per me. Non avevo ancora creato un ramo, quindi l'ho fatto: git checkout -b newbranchname. Le mie modifiche sono apparse in quel ramo per conto proprio.
Dex3703,


0

Poiché è possibile creare un nuovo ramo ma non è possibile effettuare il checkout di un ramo esistente mentre i file sono stati estratti, ho trovato il seguente trucco usando un ramo temporaneo per funzionare:

Questo scenario funziona almeno con il plugin Git VS 2015 ma molto probabilmente funzionerebbe con qualsiasi strumento git.

  1. verifica e apporta modifiche ai file nel master (ups !, ramo sbagliato)
  2. crea un nuovo ramo "temp" (o qualsiasi nome inutilizzato che scegli) dal master. I file estratti verranno ora estratti in temp e non in master.
  3. controlla le modifiche a temp (il master non è toccato)
  4. Ora tutto è archiviato ed è possibile estrarre un ramo esistente. Dai un'occhiata al ramo desiderato (il ramo con cui volevo apportare le modifiche) 3.5 Git Rebase
  5. unire la temp al ramo desiderato. Ora le modifiche sono nel ramo corretto.
  6. elimina il ramo temporaneo poiché non è più necessario

EDIT: ho scoperto che dovrai eseguire un rebase (git rebase --onto) del ramo temporaneo prima di eseguire l'unione. Altrimenti le modifiche nel master verranno incluse nell'unione. Un passaggio aggiuntivo 3.5 sopra. Vedi ulteriori informazioni su rebase qui: https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Potresti per favore elaborare di più la tua risposta aggiungendo un po 'più di descrizione della soluzione che offri?
Abarisone,

Grazie per il tuo feedback La soluzione è piuttosto semplice e segue lo stesso principio della soluzione "stash" tranne per il fatto che al posto dello stash viene utilizzato un ramo temporaneo. Questo è più conveniente almeno per gli utenti di Visual Studio poiché lo stash non è supportato dal plug-in GIT
Pasi
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.