Questo sembrerà controintuitivo, ma ascoltami:
Incoraggiali a iniziare a sperimentare con git
Una delle cose interessanti di Git è che è sorprendentemente facile rendere qualsiasi operazione locale completamente sicura. Quando ho iniziato a usare git, una delle cose che mi sono ritrovato a fare è stata zippare l'intera directory come backup nel caso avessi rovinato qualcosa. In seguito ho scoperto che si tratta di un kludge enorme e quasi mai realmente necessario per proteggere il tuo lavoro, ma ha la virtù di essere molto sicuro e molto semplice, anche se non sai cosa diavolo stai facendo e come il comando che si desidera provare verrà visualizzato. L'unica cosa che devi evitare quando lo fai è push
. Se non spingi nulla, questo è un modo sicuro al 100% per provare tutto quello che vuoi.
La paura di provare cose è uno dei maggiori ostacoli all'apprendimento del git. Ti dà così tanto controllo su tutto ciò che è un po 'scoraggiante. La realtà è che puoi seguire alcune operazioni molto sicure per la maggior parte del tuo uso quotidiano, ma scoprire quali comandi sono quelli richiede un po 'di esplorazione.
Dando loro un senso di sicurezza , saranno molto più disposti a cercare di capire come fare le cose da soli. E saranno molto più autorizzati a trovare un flusso di lavoro personale sulla propria macchina locale che funzioni per loro. E se non tutti fanno la stessa cosa localmente , va bene, purché aderiscano agli standard con ciò che spingono . Se è necessario comprimere l'intero repository prima di eseguire un'operazione per farli sentire in quel modo, va bene; possono imparare modi migliori di fare le cose mentre vanno e mentre provano cose. Qualsiasi cosa per farti iniziare a provare cose e vedere cosa fa.
Questo non significa che l'allenamento sia inutile. Al contrario, la formazione può aiutarti a presentarti a caratteristiche, modelli e norme. Ma non è un sostituto per sedersi e fare effettivamente cose nel lavoro quotidiano. Né git né SVN sono cose di cui puoi semplicemente andare a una lezione e poi sai tutto. Bisogna usare loro per risolvere i vostri problemi di familiarizzare con loro e quali caratteristiche sono adatti per cui i problemi.
Smetti di scoraggiarli dall'apprendere i dettagli di Git
Ho detto di non spingere nulla, il che va contro una delle cose che hai insegnato loro: "Impegnarsi e spingere" sempre. Credo che dovresti smettere di dire loro di fare questo e dire loro di iniziare a fare il contrario. Git ha sostanzialmente 5 "posti" in cui le tue modifiche possono essere:
- Sul disco, senza commit
- Messa in scena ma non impegnata
- In un commit locale
- In una scorta locale
- Repository remoti (solo i commit e i tag vengono mai inseriti e rimossi tra repository diversi)
Invece di incoraggiarli a tirare e spingere tutto in un unico passaggio, incoraggiali a sfruttare questi 5 posti diversi. Incoraggiali a:
Questo li incoraggerà a controllare il loro lavoro prima che sia reso pubblicamente disponibile a tutti, il che significa che colpiranno i loro errori prima. Vedranno il commit e penseranno "Aspetta, non è quello che volevo" e, diversamente da SVN, possono tornare indietro e riprovare prima di spingere.
Una volta che si abituano all'idea di capire dove sono le loro modifiche, possono iniziare a decidere quando saltare i passaggi e combinare determinate operazioni (quando estrarre perché sai già che vuoi recuperare + unire o quando fare clic sull'opzione Commit & Push) .
Questo è in realtà uno degli enormi vantaggi di git su SVN e git è progettato tenendo presente questo modello di utilizzo. SVN, al contrario, assume un repository centrale, quindi non sorprende se gli strumenti per git non sono ottimizzati per lo stesso flusso di lavoro. In SVN, se il tuo commit è sbagliato, l'unica vera risorsa è un nuovo commit per annullare l'errore.
In questo modo in realtà porterà naturalmente alla prossima strategia:
Incoraggiali a usare le filiali locali
Le filiali locali in realtà alleggeriscono molti dei punti deboli del lavoro sui file condivisi. Posso apportare tutte le modifiche che desidero nel mio ramo e non influenzerà mai nessuno poiché non le sto spingendo. Quindi, quando verrà il momento, posso usare tutte le stesse strategie di unione e rebase, solo più facilmente:
- Posso riformulare il mio ramo locale, il che rende banale la fusione in maestro.
- Potrei usare una semplice unione (creare un nuovo commit) nel master per inserire le modifiche del mio ramo locale.
- Posso schiacciare unire il mio intero ramo locale in un unico commit sul master se penso che il mio ramo sia troppo disordinato per essere salvato.
L'uso delle filiali locali è anche un buon inizio per capire una strategia di ramificazione sistematica. Aiuta i tuoi utenti a comprendere meglio le proprie esigenze di ramificazione, in modo da poter scegliere una strategia in base alle esigenze e al livello attuale di comprensione / abilità del team e non solo abbandonare Gitflow perché tutti ne hanno sentito parlare.
Sommario
In breve, git non è SVN e non può essere trattato allo stesso modo. Devi:
- Elimina la paura incoraggiando la sperimentazione sicura.
- Aiutali a capire come Git è diverso in modo che possano vedere come questo cambia il loro normale flusso di lavoro.
- Aiutali a comprendere le funzionalità disponibili per aiutarli a risolvere i loro problemi più facilmente.
Tutto ciò ti aiuterà ad adottare gradualmente un migliore utilizzo di git, fino a quando non raggiungerai il punto in cui puoi iniziare a implementare una serie di standard.
Caratteristiche specifiche
A breve termine, le seguenti idee potrebbero essere di aiuto.
rebase
Hai citato rebase e che non lo capisci davvero nella tua domanda. Quindi, ecco il mio consiglio: prova quello che ho appena descritto. Apporta alcune modifiche localmente mentre qualcun altro le invia. Commetti le modifiche localmente . Comprimere la directory del repository come backup. Scarica le modifiche dell'altra persona. Ora prova a eseguire un comando rebase e guarda cosa succede ai tuoi commit! Puoi leggere infiniti post sul blog o ricevere formazione su rebase e su come dovresti o non dovresti usarlo, ma nulla di tutto ciò è un sostituto per vederlo dal vivo in azione. Quindi provalo .
merge.ff=only
Questo sarà una questione di gusti personali, ma lo consiglierò almeno temporaneamente poiché hai già detto che hai già problemi con la gestione dei conflitti. Consiglio di impostare merge.ff
suonly
:
git config --global merge.ff only
"ff" sta per "avanzamento rapido". Una fusione in avanti veloce è quando git non ha bisogno di combinare le modifiche da diversi commit. Sposta semplicemente il puntatore del ramo verso un nuovo commit lungo una linea retta nel grafico.
In pratica, ciò impedisce a git di provare automaticamente a creare commit di unione. Quindi, se commetto qualcosa localmente e poi tiro le modifiche di qualcun altro, invece di provare a creare un commit di unione (e potenzialmente forzando l'utente a gestire i conflitti), l'unione fallirà. In effetti, git avrà eseguito solo a fetch
. Quando non ci sono commit locali, l'unione procede normalmente.
Ciò offre agli utenti gli utenti la possibilità di rivedere i diversi commit prima di tentare di unirli e li costringe a prendere una decisione su come gestire al meglio la loro combinazione. Posso rifare, andare avanti con l'unione (usando git merge --no-ff
per bypassare la configurazione), o posso anche solo rimandare unendo le mie modifiche per ora e gestirle in seguito. Penso che questo piccolo dosso di velocità aiuterà la tua squadra a evitare di prendere decisioni sbagliate sulle fusioni. Puoi lasciare che il tuo team lo spenga una volta che riescono a gestire meglio le fusioni.