cf7e35f8b9ac016d4ff7ebba859c01244159704a
[cursogit.git] / Colaborando_com_Git.mdwn
1 # Colaborando com Git
2
3 Git funciona localmente. Commits, branches, logs estão gravados no
4 repositório local. Para colaborar com outros projetos, precisamos
5 publicar e ter acesso a repositórios públicos.
6
7 É possível publicar através de vários protocolos. Além de um diretório
8 local, uma das formas mais simples é utilizar SSH, já que independe de
9 outra configuração e permite escrita. HTTP é uma boa opção somente
10 leitura para repositórios públicos, já que não exige credenciais para
11 acesso. A outra opção é o protocolo próprio do Git, através do git
12 daemon.
13
14 ## Clonando Repositórios
15
16 Para criar um novo repositório a partir de um repositório publicado,
17 usamos o comando git clone.
18
19         ~/$ git clone /home/user2/project
20         Cloning into 'project'...
21         done.
22         ~/$ cd project
23         ~/project$ ls -a
24         .  ..  .git  README
25         ~/project$ 
26
27 Quando um repositório é clonado, temos uma cópia local das referências
28 deste repositório. O repositório é registrado com um nome, sendo origin
29 o nome padrão, e as referências a seus branches são prefixadas com este
30 nome e uma barra. Para visualizar estes branches remotos, utilizamos a
31 opção -r do comando git branch.
32
33         ~/project$ git branch -r
34           origin/HEAD -> origin/master
35           origin/master
36         ~/project$ 
37
38 Note que o HEAD do repositório remoto aponta para o branch remoto
39 chamado master. O HEAD remoto é utilizado para criar um novo branch
40 local quando o repositório é clonado.
41
42         ~/project$ git branch
43         * master
44         ~/project$ 
45
46 ## Remotes
47
48 Com Git, é possível colaborar com mais de um repositório remoto. A lista
49 de repositórios rastreados, com seus nomes e URLs fica no arquivo de
50 configuração do repositório, ou seja, $REPODIR/.git/config.
51
52 Para manipular esta lista, o comando git remote pode ser útil. É
53 possível listar, adicionar, remover, renomear repositórios remotos.
54
55 Ao clonar um repositório, o remoto origin já é criado. Este é o nome
56 padrão para comandos que aceitam um remoto como parâmetro, mas permitem
57 que seja omitido, assumindo o remoto origin.
58
59         ~/project$ git remote
60         origin
61         ~/project$ 
62
63 Para adicionar um novo remoto, usamos o subcomando add, passando um nome
64 e uma URL como parâmetros.
65
66         ~/project$ git remote add git://alice.example.com/project.git/
67         ~/project$ git remote show
68         alice
69         origin
70         ~/project$ git remote show -n alice
71         * remote alice
72           Fetch URL: git://alice.example.com/project.git/
73           Push  URL: git://alice.example.com/project.git/
74           HEAD branch: (not queried)
75           Local ref configured for 'git push' (status not queried):
76             (matching) pushes to (matching)
77         ~/project$ 
78
79 Ao adicionar um novo repositório remoto, apenas acrescentamos este
80 repositório ao nosso arquivo de configuração. Não fazemos nenhum
81 download dos seus branches e commits remotos. A opção -n do subcomando
82 show evita buscar dados remotamente, que utilizaria a rede.
83
84 Note que temos duas URLs, uma para fetch e outra para push, que veremos
85 logo a seguir o que significam. Também temos o branch para qual o HEAD
86 do remoto aponta. Neste caso, como o repositório não foi acessado, não
87 temos esta informação. E a configuração para o push, que veremos logo a
88 seguir, fará atualização de branches que se casem.
89
90 Para remover um repositório remoto, utilizamos o subcomando rm, e pare
91 renomear, o subcomando rename.
92
93         ~/project$ git remote rename alice aliceS
94         ~/project$ git remote show
95         aliceS
96         origin
97         ~/project$ git remote rm aliceS
98         ~/project$ 
99
100 ## Fazendo atualizações
101
102 Após adicionar um remoto, queremos fazer o download dos branches e
103 commits remotos. Um dos comandos que pode ser utilizado é git fetch.
104
105         ~/project$ git fetch alice
106         From git://alice.example.com/project.git/
107          * [new branch]      master     -> alice/master
108          * [new branch]      shell      -> alice/shell
109         ~/project$ git branch -r
110           alice/master
111           alice/shell
112           origin/HEAD -> origin/master
113           origin/devel
114           origin/master
115         ~/project$ 
116
117 Note que ao realizar o fetch, diferente do clone, não é criada uma
118 referência ao HEAD do repositório remoto. Tampouco, é criado um branch
119 local, ou feito um checkout. As referências, no entanto, são escritas
120 localmente, de tal forma que é possível investigar os commits dos
121 branches remotos sem novo acesso à rede.
122
123 Como o acesso à rede não é feito a cada comando, novas atualizações
124 precisam ser feitas quando o repositório remoto é atualizado e deseja-se
125 investigar novos branches ou novos commits. Além de git fetch, pode ser
126 utilizado git remote update.
127
128         ~/project$ git remote update
129         Fetching origin
130         Fetching alice
131         From /home/cascardo/git/ff/project
132          * [new branch]      devel      -> alice/devel
133         ~/project$ 
134
135 Veja que um novo branch foi atualizado.
136
137 ## Publicando um repositório