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 № 1Consiglio 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à:
- Non emettere gli stessi conflitti di fusione due volte
- 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:
- Succursali di breve durata (ad esempio rami di monitoraggio remoto)
- 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.