Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
apostila-git
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pet-estatistica
apostila-git
Commits
e7ddaf2c
Commit
e7ddaf2c
authored
9 years ago
by
Walmes Marques Zeviani
Browse files
Options
Downloads
Patches
Plain Diff
Termina correções no macanísmos de colaboração.
parent
3f522677
No related branches found
No related tags found
1 merge request
!51
Issue#24
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
cap05.Rmd
+87
-80
87 additions, 80 deletions
cap05.Rmd
with
87 additions
and
80 deletions
cap05.Rmd
+
87
−
80
View file @
e7ddaf2c
...
@@ -808,10 +808,10 @@ git branch -vv
...
@@ -808,10 +808,10 @@ git branch -vv
# Macanísmos de colaboração #
# Macanísmos de colaboração #
Os serviços web para Git, mesmo que você trabalhe sozinho, já são
Os serviços web para Git, mesmo que você trabalhe sozinho, já são
interessantes para
que você tenha
uma cópia (backup) do seu projeto e
interessantes para
ter
uma cópia (
*
backup
*
) do seu projeto e
disponibiliz
e
seu trabalho. No entanto, um dos principais objetivos dos
disponibiliz
ar
seu trabalho. No entanto, um dos principais objetivos dos
serviços web é permitir a colaboração entre pessoas. Já mencionamos o
serviços web é permitir a colaboração entre pessoas. Já mencionamos o
básico sobre
iss
o quando falamos
dos recursos
de *issue*, *fork* e
básico sobre
recursos de colaboraçã
o quando falamos de *issue*, *fork* e
*merge request*. Nas sessões a seguir, vamos nos aprofundar nesses três
*merge request*. Nas sessões a seguir, vamos nos aprofundar nesses três
mecanísmos chaves para a colaboração via serviços web para Git.
mecanísmos chaves para a colaboração via serviços web para Git.
...
@@ -828,15 +828,14 @@ falha a ser corrigida - ou sugerem que o projeto incorpore determinada
...
@@ -828,15 +828,14 @@ falha a ser corrigida - ou sugerem que o projeto incorpore determinada
característica desejável. O dono do projeto avalia a proposta e pode
característica desejável. O dono do projeto avalia a proposta e pode
discutí-la logo em seguida, mantendo as mensagens reunidas e disponíveis
discutí-la logo em seguida, mantendo as mensagens reunidas e disponíveis
para outros usuários que acompanham o projeto. Quando a proposta do
para outros usuários que acompanham o projeto. Quando a proposta do
*issue* for implementada, o *issue* pode ser fechado embora continua
*issue* for implementada, o *issue* é fechado. Mesmo assim, o *issue*
disponível e possa ser referenciado no, tanto para usuários que
continua disponível e pode ser referenciado no futuro, tanto para novos
reportarem o problema já solucionado (usuários que não estão usando a
usuários quanto para incluir no *change log* do projeto (essa versão
versão mais recente) quanto para incluir no *change log* do projeto
corrige o bug descrito no *issue#43*, por exemplo).
(essa versão corrige o bug descrito no *issue#43*, por exemplo).
Quando um projeto é coletivo, como são alguns dos projetos no PET
Quando um projeto é coletivo, como são a maioria dos projetos no PET
Estatística\footnote{\url{https://gitlab.c3sl.ufpr.br/groups/pet-estatistica}},
Estatística (<https://gitlab.c3sl.ufpr.br/groups/pet-estatistica>), o
o recurso de *issue* pode ser usado de outra forma: como gerenciador de
recurso de *issue* pode ser usado de outra forma: como gerenciador de
tarefas. Combinado com as *milestones*, cada membro cria um *issue*
tarefas. Combinado com as *milestones*, cada membro cria um *issue*
correspondente ao que vai fazer no projeto no período de uma semana. Com
correspondente ao que vai fazer no projeto no período de uma semana. Com
isso, todos os demais membros são notificados de que alguém já vai
isso, todos os demais membros são notificados de que alguém já vai
...
@@ -848,7 +847,7 @@ As *milestones* são uma espécie de coleção de *issues* que tenham algo
...
@@ -848,7 +847,7 @@ As *milestones* são uma espécie de coleção de *issues* que tenham algo
em comum. Considere por exemplo o projeto de um livro. As *milestones*
em comum. Considere por exemplo o projeto de um livro. As *milestones*
podem ser os capítulos a serem escritos e os *issues* podem ser as
podem ser os capítulos a serem escritos e os *issues* podem ser as
seções. Se for um projeto de software, as *milestones* podem separar os
seções. Se for um projeto de software, as *milestones* podem separar os
*issues* referentes ao aperfeiçoamento da documentação
do software
e ao
*issues* referentes ao aperfeiçoamento da documentação e ao
desenvolvimento do mesmo (escrita de código fonte).
desenvolvimento do mesmo (escrita de código fonte).
Criar um issue é muito simples. Tanto no GitHub quanto no GitLab, existe
Criar um issue é muito simples. Tanto no GitHub quanto no GitLab, existe
...
@@ -857,54 +856,56 @@ criar um novo *issue*, comentar em um já existente e até reabrir um
...
@@ -857,54 +856,56 @@ criar um novo *issue*, comentar em um já existente e até reabrir um
*issue* que já foi fechado (comum quando acredita-se ter resolvido um
*issue* que já foi fechado (comum quando acredita-se ter resolvido um
*bug* mas que ainda não foi). Os *issues* são numerados sequencialmente
*bug* mas que ainda não foi). Os *issues* são numerados sequencialmente
e isso faz com que cada *issue* seja único dentro do projeto. Os
e isso faz com que cada *issue* seja único dentro do projeto. Os
serviços web até tem formas de fazer *hiperlinks* facilmente para os
serviços web até tem formas de fazer *hyperlinks* para os *issues*
*issues*. No GitLab, usa-se um hash seguido do número identificador
dentro das mensagens e *commits*. No GitLab, usa-se um hash seguido do
(e.g. `#45`) para indicar um *issue*.
número identificador (e.g. `#45`) para fazer um *hyperlink* para um
*issue*.
## Fork ##
## Fork ##
A palavra *fork*, como substantivo, representa forquilha,
A palavra *fork*, como substantivo, representa forquilha,
bifurcação.
Como verbo, representa bifurcar. Esse recurso está presente
bifurcação.
Esse recurso está presente nas interfaces web para permitir
nas interfaces web para permitir
que usuários façam cópias livres de
que usuários façam cópias livres de
projetos de outras pessoas. Como
projetos de outras pessoas. Como
essa cópia é do projeto em determinado
essa cópia é do projeto em determinado
instante, há grande chance de
instante, há grande chance de
divergência entre cópia e original a
divergência entre cópia e original a
partir desse instante, por isso é
partir desse instante, por isso é
apropriado a palavra bifurca
ment
o.
apropriado a palavra bifurca
çã
o.
As finalidades de um *fork* são duas: 1) ter uma cópia na qual se possa
As finalidades de um *fork* são duas: 1) ter uma cópia na qual se possa
acrescentar modificações e enviar para o dono
e assim
contribui
r
no
acrescentar modificações e enviar para o dono
as
contribui
ções
no
projeto original ou 2) usar a cópia como ponto de partida para outro
projeto original ou 2) usar a cópia como ponto de partida para
um
outro
projeto, sem intenção de voltar ao projeto original.
projeto, sem intenção de voltar ao projeto original.
Com o *fork*, você pode colaborar como um terceiro em um projeto, ou
No GitHub, o acesso ao *fork* é por um botão que fica mais à direita na
seja, sem ser colaborador adicionado pelo dono ao projeto. Nessa cópia
você tem permissões de *owner* pois na realidade, embora seja uma cópia,
ela é toda sua. Você faz sua cópia livre, trabalha como quiser e no
prazo que quiser, e submete ao projeto original o desenvido na sua
cópia. O dono do projeto não tem como saber por que você fez o *fork*
(mas você pode criar um *issue*) nem quando irá concluir o que
almeja. No entanto, quando concluir, para que seu trabalho seja
incorporado ao original, você terá que fazer um *merge request* (isso só
é possível entre usuários de um mesmo serviço web).
No GitHub, o acesso ao *fork* é por um botão que fica mais a direita na
linha de título do projeto. No GitLab, o botão de *fork* fica na página
linha de título do projeto. No GitLab, o botão de *fork* fica na página
inicial do projeto logo acima do endereço para clonar. Em qualquer um
inicial do projeto logo acima do endereço para clonar. Em qualquer um
desses serviços, uma vez logado, ao pedir um *fork*, uma cópia do
desses serviços, uma vez logado, ao pedir um *fork*, uma cópia do
projeto é criada no seu perfil.
projeto é criada no seu perfil.
Com o *fork* você pode colaborar como um terceiro em um projeto, ou
seja, sem ser colaborador adicionado pelo dono. Nessa cópia você tem
permissões de *owner* pois na realidade, embora seja uma cópia, ela é
toda sua. Você faz sua cópia livre, trabalha como quiser e no prazo que
quiser, e submete ao projeto original o desenvido na sua cópia. O dono
do projeto não tem como saber por que você fez o *fork* (mas você pode
criar um *issue*) nem quando irá concluir o que almeja. No entanto,
quando concluir, para que seu trabalho seja incorporado ao original,
você terá que fazer um *merge request* (isso só é possível entre
usuários de um mesmo serviço web).
Uma vez com a cópia, você pode fazer um clone e começar a desenvolver os
Uma vez com a cópia, você pode fazer um clone e começar a desenvolver os
projetos. Se a sua intenção é submeter modificações ao original, seja
projetos. Se a sua intenção é submeter modificações ao original, seja
ainda mais cuidadoso com as mensagens de *issue*. Escreva sempre no
ainda mais cuidadoso com as mensagens de *issue*. Escreva sempre no
idioma original do projeto. Muitas vezes, antecipando esse tipo de
idioma original do projeto. Muitas vezes, antecipando esse tipo de
colaboração, os usuários disponibilizam guias de contribuição
colaboração, os usuários disponibilizam guias de contribuição
(*contribution guide*) com instruções de como proceder.
(*contribution guide*) com instruções de como proceder para maior
agilidade.
Os *branchs* que criar serão na sua cópia os *pushs* que fizer irão para
Os *branchs* que criar serão na sua cópia os *pushs* que fizer irão para
o seu perfil. Quando o seu trabalho tiver concluído, você pode fazer
um
o seu perfil. Quando o seu trabalho
es
tiver concluído, você pode fazer
*merge request* que descreveremos a seguir. Se a sua intenção foi
usar o
um
*merge request* que descreveremos a seguir. Se a sua intenção foi
*fork* como
semente
para um projeto independente, não se
esqueça de dar
usar o
*fork* como
ponto de partida
para um projeto independente, não se
os devidos créditos ao dono da cópia, mesmo que lá no
futuro, o seu
esqueça de dar
os devidos créditos ao dono da cópia, mesmo que lá no
projeto e o original sejam completamente diferentes.
futuro, o seu
projeto e o original sejam completamente diferentes.
## Merge Request ##
## Merge Request ##
...
@@ -935,52 +936,58 @@ git push origin issue#33
...
@@ -935,52 +936,58 @@ git push origin issue#33
```
```
Na interface web, o membro faz um *merge request* desse ramo para um
Na interface web, o membro faz um *merge request* desse ramo para um
ramo permamente, no qual em projetos simples é o *master* mas em projetos
ramo permamente, no qual em projetos simples é o *master* mas em
maiores é usualmente o *devel*.
projetos maiores é usualmente o *devel*. Ao fazer no *merge request*,
uma caixa de diálogo abre para que você liste as colaborações que o
*branch* leva.
Em ambos os serviços, o *merge resquest* leva para um página na qual
Em ambos os serviços, o *merge resquest* leva para um página na qual
você escolhe que ramo de demanda (doador) será incorporado a um ramo
você escolhe que ramo de demanda (doador) será incorporado a um ramo
permamente (receptor). Ao confirmar os ramos envolvidos, tem-se uma
permamente (receptor). Ao confirmar os ramos envolvidos, tem-se uma
caixa de texto destinada as informações sobre quais as modificações devem
caixa de texto destinada as informações sobre quais as modificações
ser incorporadas. Elas servem para justificar, esclarecer e informar o
devem ser incorporadas. Elas servem para justificar, esclarecer e
responsável pelo *merge* sobre a incorporação. Quando o projeto é
informar o responsável pelo *merge* sobre a incorporação. Quando o
coletivo e não individual, um membro pode ser indicado como responsável
projeto é coletivo e não individual, um membro pode ser indicado como
pelo *merge*.
responsável pelo *merge*. O responsável pelo merge avalia as
contribuições, se sentir necessidade vê os *diffs* nos arquivos, e pode
Na situação de um *fork*, o processo ocorre de forma semelhante. A
colocar uma mensagem embaixo da sua com questionamentos e até adequações
que precisarem ser feitas para aceitar o *merge request*.
Quando trata-se de *fork*, o processo ocorre de forma semelhante. A
sequência de etapas é: fazer o *fork* do projeto para a sua conta, 2)
sequência de etapas é: fazer o *fork* do projeto para a sua conta, 2)
clonar o projeto para sua máquina, 3) criar um *branch* e fazer o
clonar o projeto para sua máquina, 3) criar um *branch* e fazer o
desenvolvimento nele, 4) subir o *branch* (*push*) para a sua conta e 5)
desenvolvimento nele, 4) subir o *branch* (*push*) para a sua conta e 5)
fazer um *merge request* para incorporar as modificações.
fazer um *merge request* para incorporar as modificações. Na hora de
escolher o ramo permanente (receptor) tem-se duas opções: 1) incorporar
Quando o projeto é um *fork*, na hora de escolher o ramo permanente
ao *master* (ou outro) da sua cópia ou 2) incorporar ao *master* (ou
(receptor) tem-se duas opções: 1) incorporar ao *master* da sua cópia
outro) do original. Outra opção é incorporar ao *master* da sua cópia e
ou 2) incorporar ao *master* do original. Outra opção é incorporar ao
depois pedir um *merge request* do seu *master* para o *master* do
*master* da sua cópia e depois pedir um *merge request* do seu *master*
original. Essa última é útil quando a quantidade de modificações é maior
para o *master* do original. Essa última é útil quando a quantidade de
e portanto, o trabalho vai levar mais tempo.
modificações é maior e portanto, o trabalho vai levar mais tempo.
Os próprios serviços web fazem o *merge* diretamente quando não existe
O próprio serviço Web tem recurso para a aplicação do *merge* sem
conflito (merge do tipo *fast forward*). Isso facilita bastante o
precisar copiar os ramos envolvidos. Isso facilita bastante o
trabalho. Porém, não haver conflito de *merge* não significa que as
trabalho. Porém, não haver conflito de *merge* não significa que as
modificações incorparadas estão funcionais, ou seja, as modificações
modificações incorparadas estão funcionais, ou seja, as modificações
feitas precisam ser testadas localmente para verificar surgiram
feitas precisam ser testadas localmente para verificar surgiram
efeito. É possível habilitar o serviço Git para checar se o projeto é
efeito. É possível habilitar o serviço Git para checar se o projeto é
executável, em caso de softwares. Esse recurso se chama intergração
executável ou funcional. Esse recurso se chama intergração contínua e
contínua e veremos na próxima sessão.
veremos na próxima sessão.
Em caso de confito de *merge*, tem-se baixar os ramos. Localmente
Em caso de confito de *merge*, tem-se que baixar os ramos (`git
pode-se comparar as diferenças entre eles para entender as fontes de
fetch`). Localmente pode-se comparar as diferenças entre eles para
conflito. Para isso são recomendáveis as interfaces para Git que serão
entender as fontes de conflito. Para isso são recomendáveis as
discutidas no próximo Capítulo. Uma vez que o *merge* foi resolvido,
interfaces para Git que serão discutidas no próximo Capítulo. Uma vez
deve-se fazer o *push* o ramo permanente (receptor) para o serviço web
que o *merge* foi resolvido, deve-se fazer o *push* o ramo permanente
que já reconheçe que o *merge* foi feito e fecha a requisição.
(receptor) para o serviço web que já reconhece que o *merge* foi feito e
fecha a requisição automaticamente.
Recomenda-se que os ramos de demanda sejam removidos após a incorporação
nos ramos permanentes. Isso torna o projeto mais claro e concentrado em
Recomenda-se que os ramos de demanda sejam removidos após sua
ramos definitivos colhedores de desenvolvimento. Pode-se excluir o ramo
incorporação nos ramos permanentes. Isso torna o projeto mais claro e
de demanda incorporado direto pela interface. Por linha de comando
concentrado em ramos definitivos colhedores de desenvolvimento. Pode-se
também é possível.
excluir o ramo de demanda incorporado direto pela interface marcando uma
caixa de confirmação sobre remover o ramo apés o merge. Por linha de
comando também é possível.
```{r, engine="bash", eval=FALSE}
```{r, engine="bash", eval=FALSE}
## Deleta o branch issue#33 no servidor (origin).
## Deleta o branch issue#33 no servidor (origin).
...
@@ -993,15 +1000,15 @@ git branch -d issue#33
...
@@ -993,15 +1000,15 @@ git branch -d issue#33
git branch -dr origin/issue#33
git branch -dr origin/issue#33
```
```
Ao
concluir
incorporar uma contribuição grande, é interessante marcar o
Ao incorporar uma contribuição grande, é interessante marcar o
*commit*
*commit*
vinculado à esse *merge* de uma forma destacável, como por
vinculado à esse *merge* de uma forma destacável, como por
exemplo, com
exemplo, com
uma *tag*.
uma *tag*.
```{r, engine="bash", eval=FALSE}
```{r, engine="bash", eval=FALSE}
## Lista as tags existentes.
## Lista as tags existentes.
git tag
git tag
## Adiciona uma tag ao último commit.
## Adiciona uma tag
anotada
ao último commit.
git tag -a v1.0 -m "Versão 1.0 do software"
git tag -a v1.0 -m "Versão 1.0 do software"
```
```
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment