Spostare esistenti, uncommitted lavoro per una nuova filiale in Git
-
21-09-2019 - |
Domanda
Io avevo iniziato a lavorare su una nuova funzionalità, e dopo che codifica per un po', ho deciso che questa caratteristica dovrebbe essere sulla propria filiale.
Come faccio a spostare l'esistente, le modifiche non salvate in un nuovo ramo e il reset del mio attuale?
Voglio ripristinare il mio codice attuale, pur preservando gli attuali lavori alla nuova funzione.
Soluzione
Utilizza il seguente:
git checkout -b <new-branch>
Questo lascerà la vostra filiale corrente come è, creare e checkout un nuovo ramo e mantenere tutte le modifiche. È quindi possibile effettuare un commit con:
git add <files>
e impegnarsi per il vostro nuovo ramo con:
git commit -m "<Brief description of this commit>"
I cambiamenti nella directory di lavoro e le modifiche in scena dell'indice non appartengono ad alcun ramo ancora. Questo cambia se tali modifiche sarebbero finiti in.
Non ripristinare la filiale originale, rimane così com'è. L'ultima commit sul <old-branch>
sarà ancora lo stesso. Pertanto è checkout -b
e quindi eseguire il commit.
Altri suggerimenti
In alternativa:
Salvare le modifiche a un temp stash:
$ git stash
Creare un nuovo ramo basato su questa scorta, e passare al nuovo ramo:
$ git stash branch <new-branch> stash@{0}
Suggerimento:utilizzare il tasto tab per ridurre la digitazione stash nome.
Se sono state facendo commit sul ramo principale, mentre si codificati, ma ora si desidera spostare questi si impegna a un ramo diverso:
-
Copia la cronologia di corrente su un nuovo ramo, portando con sé eventuali modifiche non troppo:
git checkout -b <new-feature-branch>
-
Ora forzare il ramo originale "disordinato" eseguire il rollback: (senza passare ad esso)
git branch -f <previous-branch> <earlier-commit-id>
Ad esempio:
git branch -f master origin/master
o se si fosse effettuato 4 commit:
git branch -f master HEAD~4
Attenzione: Sembra che git branch -f master origin/master
sarà ripristinare le informazioni di verifica per quel ramo. Quindi, se si è configurato il ramo master
a spingere per un posto diverso da origin/master
allora tale configurazione sarà persa.
Un'alternativa è quella di utilizzare questo ripristino tecnica . Ma tali istruzioni saranno scartare le modifiche non si hanno. Se si desidera mantenere quelli, riporre loro in primo luogo e li unstash alla fine.
Lo scenario comune è il seguente: Ho dimenticato di creare la nuova filiale per la nuova funzione, e stavo facendo tutto il lavoro nel vecchio ramo di caratteristica. Ho commesso tutto il lavoro "vecchio" al ramo principale, e voglio che il mio nuovo ramo di crescere dal "maestro". Non ho fatto un unico commit del mio nuovo lavoro. Ecco la struttura delle filiali: "Master" -> "Old_feature"
git stash
git checkout master
git checkout -b "New_branch"
git stash apply
Se si impegnano, si potrebbe anche cherry-pick il singolo commit ID. Lo faccio spesso quando comincio a lavorare in master, e poi voglio creare una filiale locale prima di spingere fino alla mia origine /.
git cherry-pick <commitID>
C'è un sacco che si può fare con cherry-pick, come descritto qui , ma questo potrebbe essere un caso d'uso per voi.
@Robin risposta e messa in vendita di tutto ciò che ho fatto,
git status <-- review/list uncommitted changes
git stash <-- stash uncommitted changes
git stash branch <new-branch> stash@{1} <-- create a branch from stash
git add . <-- add local changes
git status <-- review the status; ready to commit
git commit -m "local changes ..." <-- commit the changes
git branch --list <-- see list of branches incl the one created above
git status <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch> <-- switch back
Se il pronti contro termine ha più di una scorta, vedere quale applicare al nuovo ramo:
git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ...
e ispezionare la scorta individuale,
git stash show stash@{1}
o ispezionare tutti i nascondigli in una volta:
git stash list -p
V'è in realtà un modo molto semplice per fare questo con GitHub Desktop ora che io non credo fosse una caratteristica prima.
Tutto quello che dovete fare è passare alla nuova filiale in GitHub Desktop, e vi verrà chiesto di lasciare le modifiche sul ramo corrente (che sarà messo da parte), o per portare le modifiche con voi per la nuova filiale. Basta scegliere la seconda opzione, per portare le modifiche al nuovo ramo. È quindi possibile impegnarsi come al solito.
Questo può essere utile per tutti che utilizzano strumenti per GIT
Comando
ramo Switch - si sposterà le modifiche al nuovo ramo. Poi si può commettere modifiche.
$ git checkout -b <new-branch>
TortoiseGit
tasto destro del mouse sul repository e quindi utilizzare TortoiseGit-> Switch / Checkout
SourceTree
Con il pulsante "Acquista" per passare ramo. Si vedrà il pulsante "cassa" in alto dopo aver fatto clic su un ramo. I cambiamenti dal ramo corrente verranno applicate automaticamente. Poi si possono commettere.