Git "unione dinamica" di più rami

3

Lavoro con un modello di ramo di feature in cui i rami vengono uniti in master quando sono pronti. Prima di un test più ampio (specifico per il mio campo di lavoro, che coinvolge un sacco di hardware pesante), diverse sezioni di feature (testate singolarmente mediante simulazioni) sono unite in un ramo "test".

Prima del test effettivo, il ramo "test" viene nuovamente testato usando simulazioni. Se, durante questo test, sorgono problemi a causa del modo in cui i singoli rami si comportano insieme (o sorgono altri bug che non erano stati visti prima), vorrei essere in grado di fare una correzione sul singolo ramo di funzionalità ma mantenendo il " prova "ramo unito.

Al momento, di solito elimino il ramo di test (il merge commit), eseguo le correzioni sul rispettivo ramo di funzione e quindi unisco tutti i rami rilevanti nel ramo "test" di nuovo. Questo è un po 'noioso. Certo, potrei fare alcuni piccoli script ecc. Ma nella mia situazione, ho più repository con rami "test" tutti con rami di caratteristiche diverse fuse insieme e script di scrittura per tutti quelli ... Preferirei cercare una soluzione migliore .

La mia domanda: c'è un modo per avere una sorta di unione "dinamica", in modo che, quando aggiungo un commit in un branch di feature unite, la fusione del ramo "test" venga aggiornata con quel commit proprio come se avesse stato unito con quel commit già sul ramo della funzione.

Spero che l'idea sia chiara. In caso contrario, faccelo sapere in modo che possa chiarire.

    
posta Bert 02.11.2018 - 20:43
fonte

1 risposta

1

Git non ha un supporto particolarmente buono per questo. Il problema concettuale è che ogni commit Git rappresenta uno stato di progetto, non una diff. L'unione di due rami significa combinare le differenze tra gli stati del progetto dei due rami. In genere questo è facile perché Git applica modifiche non in conflitto da entrambi i rami. Ma quando aggiungi un commit a un ramo di funzione e poi lo unisci di nuovo, sarà più difficile della prima unione e dovrai potenzialmente risolvere nuovamente molti degli stessi conflitti. Sebbene git-rerere possa essere abilitato localmente per riutilizzare una risoluzione di conflitto di unione registrata da una precedente unione:

Another application of rerere is where you merge a bunch of evolving topic branches together into a testable head occasionally, as the Git project itself often does. If the tests fail, you can rewind the merges and re-do them without the topic branch that made the tests fail without having to re-resolve the conflicts again.

To enable rerere functionality, you simply have to run this config setting:

$ git config --global rerere.enabled true

Git Book / Pro Git 2nd ed. by Scott Chacon, Ben Straub.

Considerare il motivo per cui sono necessari i rami di funzionalità e ciò che rappresenta il ramo di test. Se il ramo test diventerà qualcosa di simile a un candidato alla release, ci sarà un valore limitato nell'applicare ulteriori modifiche ai branch delle feature (e quindi dover unirle di nuovo). Invece, considerare di commutare la modifica come hot fix direttamente sul ramo di test. Se il ramo di prova non è la base per un rilascio, tieni presente che stai testando un sistema diverso da quello che stai rilasciando, soprattutto perché i conflitti di fusione potrebbero essere risolti in modo diverso.

Puoi anche selezionare o rebase la correzione dal ramo della funzione al ramo del test, o viceversa. Questo duplica le modifiche nel commit in cima ad un'altra cronologia. Potrebbero esserci conflitti, ma in genere più limitati di una fusione completa.

Né l'unione né la ridenominazione possono aggiornare automaticamente un commit di unione. È in linea di principio possibile modificare il commit di unione o lo schiacciamento di due commit di unione, ma questo è relativamente difficile da fare. L'approccio più semplice sarebbe quello di raggiungere prima e commettere lo stato del progetto che si desidera avere dopo l'unione, quindi registrare una nuova cronologia che produce questo stato: reimpostare il ramo di test prima di tale unione, avviare un'unione di polpo di tutti i rami ma --no-commit l'unione, quindi usa git-checkout per ripristinare l'albero di lavoro allo stato del progetto che desideri e commetti il risultato come unione.

Il modo migliore per evitare conflitti di fusione in Git è evitare rami di lunga durata. Capisco che questo non è sempre possibile, ma l'integrazione delle funzionalità in anticipo (e possibilmente la protezione con i pulsanti di selezione delle funzionalità) causerà la risoluzione e la risoluzione dei conflitti in anticipo, e solo una volta. Allo stesso modo, un'architettura in cui è possibile aggiungere nuove funzionalità senza modificare un sacco di codice esistente eviterà conflitti. In breve: lo spostamento della complessità dal modello di ramificazione al codice stesso.

    
risposta data 03.11.2018 - 16:38
fonte

Leggi altre domande sui tag