Perché queste fusioni apparentemente non necessarie si verificano in git?

0

Considera questo screenshot dal nostro repository di sviluppo:

Siamo relativamente nuovi a git, quindi le cose sono ancora un po 'confuse. La domanda a portata di mano: se dai un'occhiata ai commit da parte mia in cima; ci confondono. Perché devo unire qualcosa se non mi diressi nulla?

Ho eseguito il commit di adjust buildpath , dopodiché git mi ha fatto immediatamente unire. ma con cosa? Il ramo invitation non è interessante per me e non l'ho mai toccato in alcun modo.

Da dove viene questo anonymous blue branch e perché? Il mio collega (avatar blu) funziona solo nel ramo invitation al momento.

Qualcuno può spiegarmi perché questo sta accadendo in termini git-layman (come ho detto, siamo nuovi a questo)?

    
posta Florian Peschka 15.08.2014 - 12:54
fonte

2 risposte

3

Trovo molto utile il sito Visualizzazione di Git Concepts con D3 per vedere come apparirà l'albero quando vari git i comandi sono eseguiti da vari stati.

Consente di tornare alla traccia Disabled mail delivery... commit.

Il prossimo commit era sul ramo dell'invito fatto da Red come origine / master è stato fuso in quello.

Purtroppo teal era ancora sul ramo principale e ha fatto due commit sul master - Removed duplicate imports... e Moved user routes... che sono stati poi uniti di nuovo in invito da rosso.

Ora stavi anche lavorando su ciò che tu aveva localmente come master e ha fatto il adjust buildpath commit. Tuttavia, quando provate a spingere questo in un punto in cui diceva che il vostro master non era sincronizzato con il telecomando - e lo era. Master on remote era a Moved user routes e quindi hai dovuto unire il telecomando a quello che avevi.

git merge fa anche un commit quando fa la sua fusione.

Dal link D3 in alto, la git merge è molto vicina allo stato che avevi al adjust buildpath commit. Fare git merge master nel tuo albero è come fare un git merge dev nella sandbox D3:

Equindigitmergedevciportaa:

Commit e065536... è esattamente come Merge branch 'master' of https://... in questo caso.

Ma cosa succede se non vuoi per avere quei commit. Ad alcune persone non piacciono (personalmente, io ... ma questa è la mia preferenza)

Quindi stai guardando git rebase

Questo riapplicherà i commit da un ramo all'altro.

Notadinuovolastrutturamoltosimilecomeesempiodiunione(nota:hocontrollatomasterinvecedilasciarlosudev).Epoiungitrebasedevriportatuttoinsenzailcommitaggiuntivo.

Notare che il commit bb92e0e che era il vecchio capo principale è ora disattivato e il nuovo master head è decfd13 perché la cronologia è riapplicata in cima di quello che hai fatto.

C'è un trucco lì. Stai riscrivendo la tua cronologia locale quando esegui un rebase. Se hai condiviso lo stato del tuo repository (spingendolo da qualche altra parte) dove è impegnato bb92e0e , il rebasing confonderà tutti. Se devi fare un git push --force , probabilmente stai sbagliando.

Nota che quando fai un git pull , stai facendo i comandi git fetch e git merge - quindi il commit aggiuntivo. Puoi fare un git pull --rebase che sarà un rebase piuttosto che un'unione per il secondo passo (puoi anche modificare la tua git config per farlo di default). Puoi giocare un po 'con questo esempio' git pull 'nel sito D3.

Si noti che la convenzione sul proprio albero sembra essere pull e merge piuttosto che rebase - potrebbe essere meglio continuare a seguire tale convenzione e solo capire (e accettare) da dove provengono i commit.

    
risposta data 16.08.2014 - 06:10
fonte
0

Breve risposta in termini gly layman: il tuo collega di tè verde si sbaglia se pensa che stessero lavorando solo sul ramo "invito". Stavano commettendo + spingendo per padroneggiare, e solo dopo si fondevano di nuovo su invito.

    
risposta data 16.08.2014 - 11:36
fonte

Leggi altre domande sui tag