Git push to wrong branch


99

Lavorando con git, dopo un po 'di "commit" e un paio di "push", mi sono reso conto che sto usando il ramo sbagliato!

Ora devo rimuovere in qualche modo le mie modifiche in wrong_branch e eseguire il commit e spingere le modifiche in right_branch

Qual è il modo migliore (e semplice) per farlo?

grazie



Bella domanda @tokland: il 99% degli sviluppatori di ruby ​​usa git, e il progetto a cui sto lavorando è in RoR ... ma so che questa non potrebbe essere una buona motivazione
Alessandro De Simone

3
Dal mio punto di vista, questo non è un duplicato di ciò che halfdan ha osservato, poiché si tratta anche di spostare i commit in un altro ramo, non solo di rimuoverli.
olenz

Risposte:


142

passare a quel ramo, controllare individualmente git loge git revertquei commit. Una volta fatto ciò, torna al ramo desiderato e lì puoi quindi utilizzare git cherry-pickper selezionare commit specifici dai ref git e unirli nel ramo destro.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Se i commit sono raggruppati e non ci sono commit inviati dopo i tuoi sporchi commit, puoi anche usare git resetper portare quel ramo sbagliato in uno stato appena prima dei tuoi commit e poi seguirlo di nuovo usando git cherry-pickper portare i tuoi commit nel ramo giusto.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Revert + cherry-pick sembra molto più semplice di altri metodi possibili che comportano il ripristino della testina e / o il ribasamento.
ChrisV

2
Per git cherry-pick puoi mettere più sha in una singola riga, ad es git cherry-pick commitsha1 commitsha2.
ThomasW

Salvavita! E non complicato. Grazie!
Craig Silver

cosa succede quando si desidera unire wrong_branch (ad es. sviluppo) in right_branch (ad es. feature / X), quindi si ottengono i ripristini annullando le modifiche selezionate.
timB33

revertè molto più pulito e meno drammatico che a resetmeno che tu non voglia davvero eliminare qualcosa di sensibile (credenziali?)
Qumber

3

Il modo più semplice è usare git rebase. Supponi di avere quell'impostazione:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Vuoi spostare la modifica C3, C4 nel ramo destro.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Ora l'impostazione è

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Quindi devi spingere i tuoi risultati con forza (SE nessuno si è ancora sincronizzato con il tuo repository remoto):

git push -f remote:right_branch

Non ho provato questa soluzione, stavo già lavorando nella prima risposta (e ha funzionato). Non ci ho pensato al rebase, sembra una buona alternativa, grazie
Alessandro De Simone

1
Piuttosto che git push -f, un uso migliore git push --force-with-lease. Almeno, assicura che ref remoto verrà aggiornato solo se nessuno ha spinto altri commit in cima ai tuoi commit.
Pierre-Olivier Vares

2

Un po 'di scorciatoia che si aggiunge alla risposta di Dhruva

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
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.