Merge git://github.com/damianmichna/gitmagic
[gitmagic.git] / pt_br / multiplayer.txt
blob1c8af7b51b29875ea4efda235673ff3259cdb24f
1 == Git Multiplayer ==
3 Inicialmente, utilizei o Git em um projeto particular onde era o único desenvolvedor. Entre os comandos relacionados a natureza distribuída do Git, eu precisava somente do *pull* e *clone*, de modo a manter o mesmo projeto em vários lugares.
5 Mais tarde, quis publicar meu código com o Git, e incluir as alterações dos contribuidores. Tive que aprender como gerenciar projetos com vários desenvolvedores de todas as partes do mundo. Felizmente, esse é o forte do Git, e indiscutivelmente sua razão de existir.
7 === Quem sou eu? ===
9 Cada commit tem um nome de autor e e-mail, que pode ser mostrado pelo *git log*. O Git utiliza as configurações do sistema para preencher esses campos. Para fazer o preenchimento explícito, digite:
11   $ git config --global user.name "John Doe"
12   $ git config --global user.email johndoe@example.com
14 Omita o flag global para configurar essas opções somente para o repositório atual.
16 === Git sob SSH, HTTP ===
18 Suponha que você tenha acesso SSH a um servidor web, mas que o Git não esteja instalado. Embora não tão eficiente quanto seu protocolo nativo, o Git pode se comunicar via HTTP.
20 Baixe, compile e instale o Git em sua conta, e crie um repositório no seu diretório web:
22  $ GIT_DIR=proj.git git init
23  $ cd proj.git
24  $ git --bare update-server-info
25  $ cp hooks/post-update.sample hooks/post-update
27 Para versões mais antigas do Git, o comando copy falha e você deve executar:
29  $ chmod a+x hooks/post-update
31 Agora você pode publicar suas últimas edições via SSH de qualquer clone:
33  $ git push web.server:/path/to/proj.git master
35 E qualquer um pode obter seu projeto com:
37  $ git clone http://web.server/proj.git
39 === Git sobre qualquer coisa ===
41 Deseja sincronizar os repositórios sem servidores, ou mesmo sem uma conexão de rede? Precisa improvisar durante uma emergência? Vimos que <<makinghistory, *git fast-export* e *git fast-import* podem converter repositórios para um único arquivo e vice-versa>>. Podemos enviar esses arquivos para outros lugares fazendo o transporte de repositórios git sob qualquer meio, mas uma ferramenta mais eficiente é o *git bundle*.
43 O emissor cria um 'bundle':
45  $ git bundle create somefile HEAD
47 E então transporta o pacote, +somefile+, para outro lugar: por e-mail, pen-drive (ou mesmo uma saida impressa *xxd* e um scanner com ocr, sinais binários pelo telefone, sinais de fumaça, etc). O receptor recupera os commits do pacote executando:
49  $ git pull somefile
51 O receptor pode inclusive fazer isso em um diretório vazio. Apesar do seu tamanho, +somefile+ contém todo o repositório git original.
53 Em grandes projetos, podemos eliminar o desperdício fazendo o empacotamento somente das mudanças que o outro repositório necessita. Por exemplo, suponha que o commit ``1b6d...'' é o commit mais recente compartilhado por ambas as partes:
55  $ git bundle create somefile HEAD ^1b6d
57 Se executado frequentemente, podemos esquecer que commit foi feito por último. A página de ajuda sugere utilizar tags para resolver esse problema. Isto é, após enviar um pacote, digite:
59  $ git tag -f lastbundle HEAD
61 e crie um novo pacote de atualização com:
63  $ git bundle create newbundle HEAD ^lastbundle
65 === Patches: A moeda Universal ===
67 Patches são representações textuais das suas mudanças que podem ser facilmente entendidas pelos computadores e pelos seres humanos. Isso tem um forte apelo. Você pode mandar um patch por e-mail para os desenvolvedores não importando que sistema de versão eles estão utilizando. Como os desenvolvedores podem ler o e-mail, eles podem ver o que você editou.
69 Da mesma maneira, do seu lado, tudo o que você precisa é de uma conta de e-mail: não é necessário configurar um repositório online do Git.
71 Lembrando do primeiro capítulo:
73  $ git diff 1b6d > my.patch
75 produz um patch que pode ser colado em um e-mail para discussão. Em um repositório Git, digite:
77  $ git apply < my.patch
79 para aplicar o patch.
81 Em configurações mais formais, quando o nome do autor e talvez sua assinatura precisem ser armazenadas, podemos gerar os patches correspondentes a partir de um certo ponto com o comando:
83  $ git format-patch 1b6d
85 Os arquivos resultantes podem ser fornecidos ao *git-send-email*, ou enviados manualmente. Você também pode especificar uma faixa de commits:
87  $ git format-patch 1b6d..HEAD^^
89 No lado do receptor, salve o e-mail como um arquivo, e entre com:
91  $ git am < email.txt
93 Isso aplica o patch de entrada e também cria um commit, incluindo as informações tais como o autor.
95 Com um navegador cliente de e-mail, pode ser necessário clicar o botão para ver o e-mail em seu formato original antes de salvar o patch para um arquivo.
97 Existem pequenas diferenças para os clientes de e-mail baseados em mbox, mas se você utiliza algum desses, provavelmente é o tipo de pessoa que pode resolver os problemas sem ler o manual.
99 === Sinto muito, mas mudamos ===
101 Após fazer o clone de um repositório, executar o *git push* ou *git pull* irá automaticamente fazer o push ou pull da URL original. Como o Git faz isso? O segredo reside nas opções de configuração criadas com o clone. Vamos dar uma olhada:
103  $ git config --list
105 A opção +remote.origin.url+ controla a URL de origem; ``origin'' é um apelido dados ao repositório fonte. Da mesma maneira que a convenção do branch ``master'', podemos mudar ou deletar esse apelido mas geralmente não existe um motivo para fazê-lo.
107 Se o repositório original for movido, podemos atualizar a URL via:
109  $ git config remote.origin.url git://new.url/proj.git
111 A opção +branch.master.merge+ especifica o branch remoto default em um *git pull*. Durante a clonagem inicial, ele é configurado para o branch atual do repositório fonte, mesmo que o HEAD do repositório fonte subsequentemente mova para um branch diferente, um pull posterior irá seguir fielmente o branch original.
113 Essa opção somente aplica ao repositório que fizemos a clonagem em primeiro lugar, que é armazenado na opção +branch.master.remote+. Se fizermos um pull de outro repositório devemos estabelecer explicitamente que branch desejamos:
115  $ git pull git://example.com/other.git master
117 Isso explica por que alguns de nossos exemplos de pull e push não possuem argumentos.
119 === Branches Remotos ===
121 Quando clonamos um repositório, clonamos também todos os seus branches. Voce pode não ter notado isso porque o Git sempre esconde os branches: mas podemos solicitá-los especificamente. Isso previne os branches no repositório remoto de interferir com seus branches, e também torna o Git mais fácil para os iniciantes.
123 Liste os branches remotos com:
125  $ git branch -r
127 Voce deve obter uma saída como:
129  origin/HEAD
130  origin/master
131  origin/experimental
133 Eles representam branches e a HEAD de um repositório remoto, e pode ser utilizado em comandos normais do Git. Por exemplo, suponha que você fez vários commits, e gostaria de comparar contra a última versão buscada (fetched). Você pode buscar nos logs pelo hash apropriado SHA1, mas é muito mais fácil digitar:
135  $ git diff origin/HEAD
137 Ou você pode ver o que o branch ``experimental'' contém:
139  $ git log origin/experimental
141 === Remotos Múltiplos ===
143 Suponha que dois desenvolvedores estão trabalhando em nosso projeto, e que queremos manter o controle de ambos. Podemos seguir mais de um repositório a qualquer hora com:
145  $ git remote add other git://example.com/some_repo.git
146  $ git pull other some_branch
148 Agora temos merged em um branch a partir do segundo repositório, e temos fácil acesso a todos os branches de todos os repositórios:
150  $ git diff origin/experimental^ other/some_branch~5
152 Mas e se só queremos comparar as suas alterações sem afetar o trabalho de ambos? Em outras palavras, queremos examinar seus branches sem ter que suas alterações invadam nosso diretório de trabalho. Então ao invés de pull, execute:
154  $ git fetch        # Fetch from origin, the default.
155  $ git fetch other  # Fetch from the second programmer.
157 Isso faz com que somente busque os históricos. Embora o diretório de trabalho continue intocado, podemos fazer referencia a qualquer branch de qualquer repositório em um comando Git pois agora possuímos uma copia local.
159 Lembre-se de nos bastidores, um pull é simplesmente um *fetch* e um *merge*. Geralmente fazemos um *pull* pois queremos fazer um merge do ultimo commit após o fetch; essa situação é uma exceção notável.
161 Veja *git help remote* para saber como remover repositórios remotos, ignorar certos branches e outras informações.
163 === Minhas preferencias ===
165 Para meus projetos, eu gosto que contribuidores para preparar os repositórios a partir dos quais eu possa fazer um pull. Alguns serviços hospedeiros de Git permite que você hospede seu próprio fork de um projeto com o clique de um botão.
167 Após ter buscado (fetch) uma árvore, eu executo comandos Git para navegar e examinar as alterações, que idealmente estão bem organizadas e bem descritas. Faço merge de minhas próprias alterações, e talvez faça edições posteriores. Uma vez satisfeito, eu faço um push para o repositório principal.
169 Embora eu receba infrequentes contribuições, eu acredito que essa abordagem funciona bem. Veja http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[esse post do blog do Linus Torvalds].
171 Continuar no mundo Git é mais conveniente do que fazer patch de arquivos, já que ele me salva de convertê-los para commits Git. Além disso, o Git trata dos detalhes tais como registrar o nome do autor e seu endereço de e-mail, bem como o dia e hora, alem de pedir ao autor para descrever sua própria alteração.