C'è un modo per rifare un'unione in git?


17

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.

git 

10
Solo una nota: questo è in realtà un argomento su SO e non avrebbe dovuto essere migrato. Prova a leggere le tue pagine di aiuto qualche volta e nota gli strumenti software comunemente usati dalla linea dei programmatori . Detto questo, è anche un argomento qui - SwiftCore, non sentirti male che è stato migrato, non è stata colpa tua.
Bob,

Risposte:


13

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 Gappaia buono, ora vogliamo sincronizzarci con la parte superiore del masterramo. 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 Happaia buono, vogliamo avanzare rapidamente masterper includere la nostra unione fissa:

git checkout master
git merge merge_fix

Questo sposta semplicemente il masterpuntatore 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!


6

Puoi farlo, in questo modo:

  1. Ripristina il commit prima della tua unione.
  2. Eseguire nuovamente l'unione
  3. Forza di spinta

Questo è:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Tieni presente che git push --forceriscriverà tutto ciò che avevi nel ramo remoto e anche altre persone che usano quel ramo potrebbero esserne interessate. (Normalmente non dovresti farlo.)


6
Ricorda solo che git push --forcenon è sicuro
Zepplock il

1

git merge --abort e quindi puoi unire nuovamente


Ho appena ricevuto il messaggio "Non c'è unione da interrompere"

3
Questo può essere fatto solo in presenza di conflitti di unione.
chanchal118,

perché quello meno? questo mi ha aiutato.
swdev,

Perché la domanda riguarda quando hai già finito (in modo errato) l'unione e hai spinto.
Robin Green,

-1

Controlla questa speranza, è utile per te

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Mentre questo può rispondere alla domanda OP, solo le risposte di link non sono ben accettate su SO. Puoi comunque citare nella tua risposta estratti più rilevanti dal link.

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia.
Pranav 웃
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.