Esta resposta tenta abordar como interessar programadores seniores git
, não sobre como aprender git
da maneira mais rápida - para isso, o excelente livro git é ótimo ou qualquer quantidade de tutoriais (=> Google). Bons links para essa resposta são: Git é uma estrutura de dados puramente funcional ou, especialmente, o pequeno Como o git armazena seus dados .
Receio ter uma visão bastante sombria disso. Eu estive exatamente no seu lugar - sou um git
nerd e queria transformar uma equipe longe de svn
, vamos encarar, resultados minúsculos. No meu caso, isso me levou a mudar ativamente minha própria percepção e a aceitar essas pessoas, simplesmente não podem ser "forçadas à felicidade". As pessoas não são computadores, é incrivelmente difícil programá-las. Ainda estou feliz por ter tentado, isso me mostrou de maneira bastante suave o que faço e o que não quero fazer na minha vida profissional.
Há pessoas que começam a se motivar quando há coisas novas envolvidas e outras que são desmotivadas. Isso não tem nada a ver com isso git
, mas, git
especificamente, você sempre tem o efeito de "por que deveríamos usá-lo se tudo svn
está bem?", O que é uma enorme barreira psicológica.
Além disso, realmente grokking git
requer um interesse intenso em estruturas de dados abstratas. Pode parecer inacreditável, mas, na minha experiência, existem programadores que não têm interesse algum e que estão entediados e sobrecarregados por elementos mais complexos que as simples matrizes. Você pode argumentar de um lado para outro se aqueles deveriam fazer o trabalho que estão fazendo, mas é o que é.
Se as pessoas não estiverem interessadas, não entenderão. Claro e simples. Aposto que o desinteresse é a principal razão das notas ruins na escola, sem perder a inteligência.
Dito isto, aqui seria um currículo como eu o aplicaria, com base na acumulação de conhecimento de baixo para cima. Não funcionou para mim, mas você pode ter como inspiração fazer o seu próprio.
GUI
Embora a abordagem a seguir não precise necessariamente de suporte da GUI para as ações ( git add
em um repositório hello world ...), ajuda tremendamente ter uma GUI para visualizar o repositório, desde o início. Se você não pode decidir sobre qual usar, use gitk
como último recurso. Se vocês usam algum tipo de editor visual, encontre o git
componente da GUI.
A estrutura de dados (estática) é fundamental
Comece explicando os tipos de dados internos (existem apenas três mais um deles: blobs, árvores, confirmações, tags anotadas, a última das quais não interessa absolutamente nada neste estágio) e sua estrutura. Você pode fazer isso facilmente no quadro branco / com um lápis; a árvore é fácil de desenhar, pois nunca pode ser alterada; você pode literalmente adicionar coisas o tempo todo. Você pode fazer uma sessão de reprodução em um repositório local criado recentemente e usar git cat-file
os objetos reais para mostrar que eles são de fato tão triviais quanto os anunciados.
Se você pode ajudá-los a entender que
- ... existem literalmente apenas 3 tipos de objetos na história, todos eles muito simples, quase triviais e
- ... a maioria dos
git
subcomandos apenas "massageia" esses objetos de uma maneira ou de outra, com operações quase triviais (basicamente, existe apenas uma: adicione um novo commit em algum lugar) e ...
- ... tudo pode ser facilmente visto bem na sua frente
ls
e com git cat-file
...
então eles terão a tradução mental do que realmente está no repositório. Nesse ponto, os seniours podem se lembrar de que os elementos internos svn
são mágicos arcanos (já tiveram problemas com bloqueios dentro do repositório svn ou com ramificações "reintegrando" e tal?), E isso pode motivá-los um pouco.
Um problema, especificamente com as pessoas acostumadas svn
, é se acostumar com a idéia de que um commit (o objeto, não a ação) sempre é toda a árvore de diretórios. Em svn
, as pessoas são usadas para confirmar arquivos individuais. É uma abordagem radicalmente diferente. Ah, e o fato de o mesmo termo "confirmação" ser usado tanto para um objeto estático quanto para uma ação também não está ajudando.
O outro problema para os svn
caras é que svn
usa uma história linear, não uma árvore. Isso é, novamente, totalmente diferente. Então este é o momento para apontar dessas diferenças muito .
Ações explicadas em termos da estrutura
Quando eles entenderem de que partes um git
repositório é composto, é hora de mostrar exatamente o que os git
subcomandos individuais fazem em termos deles.
Estou falando sobre add
, commit
em conjunto com o diretório de trabalho local e o estágio (certifique-se de que eles entendam que o diretório de trabalho não é o mesmo que a área de preparação que não é o mesmo que o repositório).
Quando eles entenderem que esses comandos simplesmente crescem a árvore (que, novamente, neste estágio, consiste em 3 dos tipos - blobs, árvores, confirmações e não apenas confirmações), você pode fazer o primeiro git push
e git pull
(no modo de avanço rápido! ) para mostrar a eles que, git
literalmente, apenas está empurrando seus objetos, que os hashes são realmente apenas hashes de conteúdo, que você pode facilmente copiar essas coisas com um comando de cópia do sistema de arquivos e assim por diante.
Obviamente, fique longe de qualquer opção não essencial desses comandos, estamos falando git add hello.txt
aqui.
Ramos
Observe que a ramificação é especialmente difícil para as svn
pessoas, pois é totalmente diferente. O svn
modelo é muito mais fácil de visualizar, pois basicamente não há nada para visualizar - ele está à vista. O git
modelo nem tanto. Certifique-se de que eles estejam cientes desde o início de que ramificações e tags são apenas "notas adesivas" apontando para algum lugar e, na verdade, não "existem" em termos do histórico estático e imutável.
Em seguida, faça exemplo após exemplo fácil para mostrar o que você realmente pode fazer com eles. Como você parece estar acostumado git
, não deve ter dificuldade em encontrar motivação lá. Certifique-se de que eles sempre visualizem isso em termos de como a árvore cresce.
Se eles têm isso, você pode explicar como git pull
é realmente git fetch && git merge
; como todos os repositórios realmente contêm exatamente os mesmos objetos ( git fetch
é quase o mesmo que copiar coisas scp
dentro do diretório de objetos git) e assim por diante.
Provavelmente, se a essa altura você não tiver conseguido despertar o interesse deles, poderá desistir, mas se eles conseguirem chegar tão longe, terão todas as ferramentas mentais à sua disposição e deve haver pouco medo envolvido mais. O restante (fluxo de trabalho do git ...) deve estar em declive então.
Últimas palavras
Isso parece muito esforço, e realmente é. Não venda isso como "precisamos disso para este projeto", mas "isso ajuda você a se desenvolver pessoalmente e ajudará em todas as suas interações adicionais". Você precisa de muito tempo para isso, e tempo é dinheiro. Se você não tiver aceitação da gerência sobre isso, pode não valer a pena; talvez você deva conversar com seu chefe.
Se você decidir deixar de ensinar aos desenvolvedores que aparentemente não são capazes de entender, mas absolutamente deve usá-lo git
no futuro, considere substituir toda a interação por git
comandos por scripts elaborados ou alguma GUI que git
retire todos os detalhes. Coloque todo o controle de erros etc. nos scripts e tente fazê-lo funcionar.