Backing a backwards si fondono su Mercurial


Answers

In un pizzico, è possibile esportare il repository in un mazzo diff, modificare la cronologia e quindi incollare di nuovo insieme ciò che si desidera - in un nuovo repository, quindi nessun rischio di danni. Probabilmente non è male per il tuo esempio, ma non so come sia la vera storia.

Ho fatto riferimento a questa pagina mentre eseguivo un'operazione più semplice:

http://strongdynamic.blogspot.com/2007/08/expunging-problem-file-from-mercurial.html

Question

Come si inverte l'effetto di una fusione su rami polarizzati senza morire di agonia?

Questo problema mi ha tormentato per mesi e alla fine mi sono arreso.

Hai 1 deposito, con 2 rami nominati . A e B.

Le modifiche che si verificano in A si verificano inevitabilmente su B.

Le modifiche che si verificano direttamente su B NON devono MAI verificarsi su A.

In tale configurazione, la fusione di "B" in "A" produce un problema terribile nel repository, poiché tutte le modifiche a B vengono visualizzate in A come se fossero state create in A.

L'unico modo "normale" per recuperare da questa situazione sembra essere il "back out" dell'unione, ovvero:

 hg up -r A 
 hg backout -r BadMergeRev --parent BadMergerevBeforeOnA 

Che sembra tutto bello e dandy, fino a quando non deciderai di unirmi più avanti nella direzione corretta, e finirai con tutti i tipi di cose brutte che accadono e il codice che è stato cancellato / commentato nello specifico ramo B improvvisamente diventa non registrato o non commentato.

Non c'è stata finora una soluzione praticabile al di fuori di questo "lascia che faccia la sua cosa, e poi risolva tutti i problemi" e che per essere onesti è un po 'furbo.

Ecco un'immagine che chiarisce il problema:

[Immagine originale persa]

I file C & E (o cambia C & E) devono apparire solo sul ramo b, e non sul ramo a. La revisione A9 qui (branch a, revno 9) è l'inizio del problema.

Le revisioni A10 e A11 sono le fasi di "Backout merge" e "unisci il backout".

E la revisione B12 è mercuriale, erroneamente facendo cadere ripetutamente un cambiamento che non intendeva essere abbandonato.

Questo dilemma ha causato molta frustrazione e fumo blu e vorrei porre fine a questo.

Nota

Potrebbe essere la risposta ovvia per provare a proibire l'inversione inversa, sia con i ganci che con le politiche, ho scoperto che la possibilità di far saltare tutto questo è piuttosto alta e la possibilità che accada così verosimilmente che anche con le contromisure, devi comunque supponiamo che, inevitabilmente, accadrà in modo che tu possa risolverlo quando lo fa.

Elaborare

Nel modello ho usato i file separati. Questi rendono il problema semplice. Questi rappresentano semplicemente cambiamenti arbitrari che potrebbero essere una linea separata.

Inoltre, per aggiungere la beffa al danno, ci sono stati cambiamenti sostanziali sul ramo A che lascia il problema permanente "fai i cambiamenti nel ramo A in conflitto con i cambiamenti nel ramo B che si sono appena alzati (e si sono ritirati) che sembra un cambiamento sul ramo A invece "

Su Trucchi di riscrittura della storia:

Il problema con tutte queste soluzioni retroattive è il seguente:

  1. Abbiamo 9000 commit.
  2. La clonazione di recente richiede così mezz'ora
  3. Se esiste un solo clone difettoso del repository da qualche parte , c'è una probabilità che ritorni in contatto con il repository originale, e sbagli tutto di nuovo.
  4. Tutti hanno già clonato questo repository e ora sono passati diversi giorni con i commit in corso.
  5. Uno di questi cloni, sembra essere un sito dal vivo, quindi "cancellandolo e iniziando da zero" = "big nono"

(Lo ammetto, molti di questi sono un po 'stupidi, ma sono fuori dal mio controllo).

Le uniche soluzioni che sono valide sono quelle che presumono che le persone possano e faranno tutto ciò che non va, e che ci sia un modo per "annullare" questo errore.




Quindi vuoi unire solo alcuni changeset da B a A? Eseguire il backup di changeset come quello che hai fatto è una pessima idea, come hai già sofferto.

Dovresti utilizzare l'estensione di trapianto o disporre di un terzo ramo in cui apportare modifiche comuni per l'unione in A e B.






Links