/ / Confusione di git rebase / flusso di lavoro: qual è il flusso di lavoro corretto per un ramo che deve eseguire il commit dei commit upstream? - git, git-rebase

Confusione di rebase / flusso di lavoro di Git - qual è il flusso di lavoro corretto per un ramo che deve eseguire il commit di upstream? - git, git-rebase

Ecco il mio setup: ho "ramificato" il "master", e non vi è alcuna intenzione di fondere "my_branch" nel master. Tuttavia, voglio continuare a ottenere tutti gli aggiornamenti da padroneggiare.

Se I branch master su MC1 (master commit # 1) e aggiungi nuovi commit a my_branch (BC1 e BC2) e qualcuno aggiunge un nuovo commit to master (MC2) nel frattempo, vorrei che la cronologia fosse:

MC1<-MC2<-BC1<-BC2

In passato ho usato:

git fetch origin
git rebase origin/master

Fin qui tutto bene. Riproduce BC1 e BC2, risolvo i conflitti di fusione e rebase --continua fino al completamento. Tuttavia, il commit finale comporta l'unione di "unire ramo" my-branch "di github .... in my-branch (forse quello è il punto in cui questo inizia ad andare storto?)

Ma poi aggiungo altri commit al mio ramo (BC4, BC5). Nel frattempo, MC3 viene aggiunto al master. Quindi provo di nuovo a rebase ...

Riproduce BC1. Devo ricominciare a fondere i conflitti che ho già gestito (ad esempio, il codice che ho modificato in BC1 da MC1 non è cambiato da MC1 a MC3). Mi trovo a dover scegliere conflitti di unione che successivamente le patch si modificheranno E la cronologia di my_branch ora include copie multiple di BC1 sparse per ogni rebase aggiuntivo.

C'è un modo migliore per gestire la ramificazione e la fusione delle modifiche a monte?

risposte:

1 per risposta № 1

Consiglio vivamente di riconsiderare se è assolutamente necessario rebase. L'unione a monte del tuo ramo potrebbe essere l'opzione migliore:

git fetch origin
git merge origin/master

Questo sarà:

  1. Non emettere gli stessi conflitti di fusione due volte
  2. Non duplicare commit

Il rebasing ricrea intrinsecamente tutti i commit che si stanno ridefinendo, quindi è normale / previsto, che la cronologia contiene più versioni dello stesso commit.

Con il flusso di lavoro di fusione, la tua cronologia sarà simile a questa:

MC1     <-     MC2        <-        MC3
^              ^                    ^
                                  
BC1 <- BC2 <- BC3 <- BC4 <- BC5 <- BC6

Dove BC3 e BC6 l'unione si impegna a risolvere potenziali conflitti.

IMHO, ribadire è una buona idea solo per:

  1. Succursali di breve durata (ad esempio rami di monitoraggio remoto)
  2. Rami con un piccolo numero di commit (ad esempio valori di impostazione in un file di configurazione)

Un'altra opzione sarebbe quella di schiacciare tutti i tuoisi impegna in uno solo, praticamente proteggendoti dal dover risolvere i conflitti di fusione ogni volta. Ma dal momento che questo ti fa perdere la storia, probabilmente non è un'opzione.