Quindi ho fatto un grosso errore. Ho fatto un commit, ho tirato, unito (ma ho incasinato il codice mentre lo facevo) e poi ho spinto. Vorrei rifare quell'unione e ottenere il codice giusto. C'è un modo per fare questo?
Uso bitbucket.
Quindi ho fatto un grosso errore. Ho fatto un commit, ho tirato, unito (ma ho incasinato il codice mentre lo facevo) e poi ho spinto. Vorrei rifare quell'unione e ottenere il codice giusto. C'è un modo per fare questo?
Uso bitbucket.
Risposte:
Non sono sicuro che questo sia il modo "benedetto" per farlo, ma ecco cosa ho fatto per risolvere lo stesso problema senza "forzare la spinta" o qualcosa di grave.
Supponiamo che la tua storia assomigli a questa (e M è l'unione flubbed):
-A--B--C--M (master points here)
\ /
D----E
La corsa git checkout -b merge_fix <commit ID E>
crea un ramo prima di commettere errori:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Ora, rifacciamo l'unione sulla nostra nuova filiale. Non possiamo semplicemente unirci master
, quindi dobbiamo scegliere manualmente il commit prima della nostra brutta unione: git merge <commit ID C>
non fare gli stessi errori che hai fatto l'ultima volta!
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
Supponendo che il commit G
appaia buono, ora vogliamo sincronizzarci con la parte superiore del master
ramo. Questo comando dice a git di ignorare le modifiche apportate al master e forzare le nostre modifiche a diventare il risultato dell'unione:git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
Infine, (sempre supponendo che il commit H
appaia buono, vogliamo avanzare rapidamente master
per includere la nostra unione fissa:
git checkout master
git merge merge_fix
Questo sposta semplicemente il master
puntatore del ramo su H
, ma ne approfitterò per ripulire un po 'la mia arte ASCII:
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
E il gioco è fatto! hai rieseguito con successo l'unione senza invalidare la cronologia!
Puoi farlo, in questo modo:
Questo è:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Tieni presente che git push --force
riscriverà tutto ciò che avevi nel ramo remoto e anche altre persone che usano quel ramo potrebbero esserne interessate. (Normalmente non dovresti farlo.)
git push --force
non è sicuro
git merge --abort
e quindi puoi unire nuovamente
Controlla questa speranza, è utile per te
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html