Come posso indolore unione divergenti funzionalità dei rami?

0

Domanda

Ho aperto PR su un ramo chiamato feature-b che presto saranno unite per main. Tuttavia, l'ho scritto per sostenere la mia feature-a filiale, che è in corso. Voglio continuare a lavorare su feature-a e sfruttare il lavoro che ho fatto in feature-b prima è stata la fusione per main.

Qual è il modo migliore per me di fare questo? Il nostro unioni main sono schiacciato, in modo che tutti commit feature-b viene riscritto come un unico commettere quando si è unito a main. Pertanto, la riassegnazione feature-a su feature-b ora si tradurrà in futuro conflitto dolore quando faccio il merge feature-a per main perché le stesse modifiche sono state fatte in diverse commette.

Qual è il modo migliore per me per includere le modifiche apportate in feature-b nel mio feature-a ramo, riducendo al minimo il dolore futuro quando alla fine unire feature-a per main?

AGGIORNAMENTO

Sono andato avanti e:

  1. Ribasato feature-a su feature-b
  2. Fatto ulteriori modifiche (solo 1 commit) per feature-a mentre feature-b è in fase di revisione
  3. Squash-unito feature-b una volta che è stato approvato (senza ulteriori modifiche, in modo feature-a ha già il codice esatto che è stato fuso)
  4. Tirato ultima main e ribasato feature-a su di esso

Come si temeva, git si lamenta del fatto che più di un file "sia modificato" o "aggiunta". Questo da solo sarebbe un po ' fastidioso, ma semplice da risolvere. Ciò che lo rende incredibilmente confuso, soprattutto se il passaggio di tempo è passato - è l'unione di commenti nel file.

Anche se entrambi main e feature-a i rami sono l' esatto stesso codice in tutti i file, ho super fastidioso problema:

  1. Per la "aggiunta" di file, unire aggiunta di commenti per "la TESTA (Variazione di Corrente)" e "genitore di #HASH (messaggio di commit)". Io sono costretto a scegliere l'uno o l'altro, anche se non sono esattamente la stessa cosa!
  2. Per il "sia modificato" file, è anche peggio. La "TESTA (Variazione di Corrente)" mostra il codice corretto. Tuttavia, il "padre dell' #HASH (messaggio di commit)" sezione mostra la metà del codice. Di nuovo, anche se in entrambi i rami hanno tutte il codice!! Non sto scherzando, accettando il "segnale di cambiamento" (come definite da VS Codice), rimuovere il codice che è in entrambi i rami!

Se non avessi fatto queste modifiche, in rapida successione, sarei irrimediabilmente perso e confuso su ciò che git è che mi mostra. Che ha davvero accaduto diverse volte in passato, ma non riuscivo a mettere un dito su ciò che non andava. Ora che ho riprodotto questo e verificato il comportamento, io sono completamente sconcertati per quello che git sta facendo e di come le persone a che fare con questo scenario.

AGGIORNA 2

OK, ho un po ' perché era intenzione di rimuovere il codice ora. È perché le modifiche che ho fatto in feature-b erano in più si impegna e chi si impegna finì con l'essere schiacciato quando la fusione per main si è verificato. Questo è senza dubbio la fonte del dolore e il motivo per cui sto cercando di capire un sano flusso di lavoro.

git
2021-11-23 23:26:24
1

Migliore risposta

0

Io non sono convinto che l'unione finale/squash sarà disordinato. Se la stessa modifica è stata effettuata in diversi impegna, forse Git, in grado di rilevare e di essere felice con esso.

Se si pensa che sarà disordinato, però, ciò che si potrebbe fare è:

  1. Il Rebase feature-a ramo con feature-b ora, in modo che il vostro feature-a filiale include ora completato funzione di B e il progresso funzione di A, che è ciò di cui avete bisogno per il vostro lavoro.
  2. Dopo feature-b ottiene unito nel main ramo, rebase feature-a sulla impegnarsi immediatamente prima della schiacciata di commit che hanno fatto per la funzionalità di B. Questo dovrebbe andare senza problemi.
  3. Sul tuo feature-a ramo, utilizzare git reset --soft X dove X è il commit di hash per la schiacciata di commit hanno fatto per la funzionalità di B. Quindi utilizzare git commit per fare un commit. Ora avete una schiacciata a commettere il cui contenuto è uguale per lo stato attuale del lavoro in funzione di A. Ma questo commit del genitore è il commettere quella caratteristica aggiunta B al ramo principale, in modo che questo commit del diff del genitore non affidatario sarà solo contengono A. è bene continuare a lavorare in funzione di Una a questo punto, o a richiesta di una fusione.

A proposito, io sono abbastanza fiducioso che le cose non avrebbero bisogno di essere in questo disordinato se la vostra organizzazione unisce invece di rebases di aggiungere cose al ramo principale. E poi ci sarebbe il vantaggio di preservare la vera storia del codice a cui si lavora, invece di preservare questo artificiale della storia.

2021-11-23 23:52:54

Per essere chiari, noi non rebases - abbiamo schiacciato il commit. E io sono al 99% sicuro che le cose potranno essere disordinato come ho provato in passato. Git diventa terribilmente confuso dalle distinte di impegna a rendere le stesse modifiche. Io sono disposto a provare di nuovo e il rapporto di nuovo :)
me--

@me, io sono abbastanza sicuro schiacciato commette è un rebase
evolutionxbox

La riassegnazione significa muovere il ramo inizia così un punto diverso, che riscrive la storia di come è stato sviluppato. Schiacciamento significa cambiare tutto il ramo in un commit, scartando la storia di come è stato sviluppato, tranne per il risultato finale.
David Grayson

@DavidGrayson si Prega di vedere il mio aggiornati domanda per una spiegazione del comportamento vedo da git.
me--

OK. Il punto 4 ("Tirato ultima e riassegnate caratteristica-una su di esso") è ciò che ha causato il dolore quindi non è una cosa mi sento di raccomandare facendo. Invece di fare quel passo 4 nella tua domanda, prova i passaggi 2 e 3 dalla mia risposta.
David Grayson

Grazie @DavidGrayson. Sembra così . . . laborioso
me--

Come ho detto nella mia risposta, il problema è causato dalla persona che fa tutto questo, la lettura e lo schiacciamento invece di semplicemente la fusione.
David Grayson

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................