Diciamo che avete questi repository Git:
- tuo repo privata, seduto sul tuo computer di lavoro;
- il tuo deposito pubblico,
you
, ospitato da qualche parte;
- un repository principale,
origin
, che è l'albero di sviluppo principale.
Stai lavorando su qualcosa e hai fatto due commit A e B. Li hai pubblicati al tuo repo pubblico. Nello stesso tempo, ha un altro origin
commettere Z.
/-A-B master, you/master
o-o-o
\-Z origin/master
Ora diciamo che un collega ha bisogno dei vostri due commit per iniziare una nuova funzionalità. Tira il tuo ramo dal tuo repo pubblico e fa qualche commit su quello.
/-C-D-E colleague/master
/-A-B master, you/master
o-o-o
\-Z origin/master
ora si desidera aggiungere la due, completamente testato, commette in cima origin/master
. Recupera da origin
e crea un rebase (che equivale a git pull --rebase
o git pull
con l'opzione di opzione pull.rebase). Ciò crea due commit nuovi. Li spinge al tuo repo pubblico e al origin
. Per complicare ulteriormente le cose, diciamo che un nuovo commit F viene inviato a origin
dopo.
/-A-B-C-D-E colleague/master
o-o-o
\-Z-A'-B'-F master, you/master, origin/master
Ora il problema è che il vostro collega ha qualche lavoro basato su due "deprecato" si impegna, e per evitare ulteriori complicazioni (conflitti quando si uniscono, rovinare la storia) deve rebase suo ramo in cima B'(diciamo che non vuole F). Devi dirglielo, altrimenti forse non si accorgerà di quello che hai fatto.
/-C-D-E colleague/master
o-o-o-Z-A'-B'-F master, you/master, origin/master
Se non lo hai detto, poi sarebbe fondere la sua filiale di nuovo in origine e la storia sarebbe simile a questa:
/-A-B-C-D-E
o-o-o \
\-Z-A'-B'-F-M colleague/master, origin/master
Lei ha il doppio della A e B si impegna, anche se con nomi diversi. La cronologia diventa più difficile da leggere, e tu esegui conflitti di fusione. E ricorda questo esempio è abbastanza semplice. Se ci sono decine di persone che lavorano al progetto e origin
si sta muovendo velocemente, la cronologia diventerà presto un casino completo.
Se è solo un collega, probabilmente sta bene. Ma se non sai esattamente chi ti ha strappato, non puoi sapere chi devi avvisare. È particolarmente vero nello sviluppo open source.
La regola principale è: non rebase i commit che hai già pubblicato. Se A e B fossero solo nel tuo repository privato, la rebasing è soddisfacente ed è probabilmente la cosa migliore da fare, perché rende la storia più semplice e significativa. Una storia divergente è significativa solo quando il ramo ha una buona ragione per esistere (ad esempio un ramo di una caratteristica).
Qualcuno nel tuo team sta tirando le modifiche direttamente dalla tua copia del repository (al contrario di una copia centrale a cui tutti spingono)? – Gareth
Gareth, stiamo utilizzando il processo in azienda quando abbiamo un solo repository e non supportiamo qualcosa come "fork" in GitHub. – erkfel