Quindi immagina quanto segue (e che stiamo usando SourceTree):
- Stiamo lavorando tutti all'origine / sviluppo.
- Vado in vacanza per una settimana.
- Il mio collega ha lavorato a livello locale negli ultimi giorni senza fondere l'origine / sviluppare di nuovo la sua filiale di sviluppo locale.
- Prova a fare una spinta, gli viene detto che prima deve unirsi e poi fa un tiro.
- Ottiene un conflitto, interrompendo il commit automatico dopo la fusione.
- Supponendo che Git sia come SVN, il mio collega scarta i "nuovi" file nella sua copia di lavoro e poi commette l'unione - cancellando quei "nuovi" file dal capo di origine / sviluppo.
- Una settimana di lavoro di sviluppo continua su quella revisione.
- Torno dalle vacanze e scopro che mancano diversi giorni del mio lavoro.
Siamo tutti molto nuovi a Git (questo è il nostro primo progetto che lo utilizza), ma quello che ho fatto per risolverlo è stato:
- Rinomina "sviluppa" su "develop_old".
- Unisci develop_old in un nuovo ramo "develop_new".
- Reimposta il ramo develop_new sull'ultimo commit prima della brutta unione.
- Ciliegia sceglie ogni commit da allora, uno per uno, risolvendo i conflitti a mano.
- Sposta develop_old e develop_new fino all'origine.
A questo punto, develop_new è, spero, una copia "buona" di tutti i nostri cambiamenti con le settimane di lavoro successive riapplicate. Suppongo anche che il "reverse commit" faccia cose strane in un'unione, specialmente dal momento che le prossime settimane di lavoro si basano su di esso - e dato che quell'unione contiene molte cose che noi facciamo voglio insieme a cose che non facciamo.
Spero che questo non accada mai più, ma se dovesse succedere di nuovo, mi piacerebbe sapere un modo più semplice / migliore per aggiustare le cose. C'è un modo migliore per annullare un'unione "cattiva", quando nel repository si è lavorato molto sul repository basato su tale unione?