Skip to content
Snippets Groups Projects
Commit ba7bd5b0 authored by Walmes Marques Zeviani's avatar Walmes Marques Zeviani
Browse files

Merge branch 'issue#63' into 'devel'

Issue#63

últimas correções do capítulo

See merge request !52
parents cb9dd46b 14691486
No related branches found
No related tags found
No related merge requests found
...@@ -23,56 +23,49 @@ opts_chunk$set(comment = NA) ...@@ -23,56 +23,49 @@ opts_chunk$set(comment = NA)
\chapter{Ferramentas gráficas} \chapter{Ferramentas gráficas}
No GIT, como vimos até agora, todo o gerenciamento do projeto é No Git, todo o gerenciamento do projeto é realizado via
realizado via *CLI (Command line interface)*, linhas de comando *CLI (Command line interface)*, linhas de comando interpretadas, geralmente
interpretadas, geralmente pelo *bash*. Isso confere um maior controle e pelo *bash*. Isso confere um maior controle e segurança nas ações realizadas,
segurança nas ações realizadas, mas em muitas situações os comandos e mas em muitas situações os comandos e *outputs* Git não se apresentam de
*outpus* GIT não se apresentam de forma tão amigável seja pela difícil forma tão amigável, seja pela difícil memorização ou pela interatividade
memorização ou pela interatividade limitada. limitada.
Os comandos mais usuais como `git add`, `git commit` se tornam simples, Os comandos mais usuais como `git add`e `git commit` se tornam simples,
pois, mesmo para um usuário iniciante eles fazem parte do cotidiano em pois mesmo para um usuário iniciante eles fazem parte do cotidiano em
um projeto sob versionamento GIT. Mas algumas situações que não ocorrem um projeto sob versionamento Git. Porém, algumas situações não ocorrem
com frequência, como por exemplo voltar a versão de um arquivo ou do com frequência, como por exemplo voltar a versão de um arquivo ou do
repositório, requerem comandos que são pouco utilizados e para realizá-las repositório requerem comandos que são pouco utilizados e para realizá-las
é necessário a consulta de algum material sobre GIT. Outra situação onde é necessário a consulta de algum material. Outra situação em que
a utilização dos comandos é dificultada, ocorre para projetos maiores, onde a utilização dos comandos é dificultada, ocorre em projetos grandes, uma vez que
muitos arquivos são alterados simultaneamente e o procedimento de *commit* muitos arquivos são alterados simultaneamente. Neste caso o procedimento de *commit*
se torna trabalhoso, pois é necessário listar todos os arquivos que fazem se torna trabalhoso, pois é necessário listar todos os arquivos que fazem
parte de um *commit* no commando `git add`. Uma última situação exemplo parte de um *commit* no commando `git add`. Uma última situação exemplo
em que o uso de *CLI* não parece satisfatório é na comparação de arquivos, em que o uso de *CLI* não parece satisfatório é na comparação de arquivos,
já usamos o comando `git diff` no capítulo 3 e o *output* deste comando já usamos o comando `git diff` no capítulo 3 e o *output* deste comando
foi de simples visualização, mas em arquivos maiores (com muitas linhas) foi de simples visualização, mas em arquivos grandes (com muitas linhas)
a navegação para verificar as alterações do arquivo não é tão amigável. Para a navegação para verificar as alterações do arquivo não é tão amigável. Para
facilitar essas e outras situações surgem as *GUI's (Graphical User facilitar essas e outras situações surgem as *GUI's (Graphical User
Interfaces)*, interfaces gráficas para o usuário que incorporam comandos Interfaces)*, interfaces gráficas para o usuário incorporar comandos
GIT em *widgets*(botões, caixas de texto etc.) dispostos em uma janela Git em *widgets*(botões, caixas de texto etc.) dispostos em uma janela
gráfica de seu sistema operacional. gráfica de seu sistema operacional.
Neste capítulo apresentamos as principais *GUI's* para projetos GIT em Neste capítulo apresentamos as principais *GUI's* para projetos Git em
diferentes plataformas, sistemas UNIX, Mac OS X e Windows. Seccionamos diferentes plataformas, sistemas UNIX, Mac OS X e Windows. Seccionamos
em dois conjuntos de interfaces. O primeiro chamado de **Interfaces em dois conjuntos de interfaces. O primeiro chamado de **Interfaces
GIT** refere-se às ferramentes para alterações e visualizações de Git** refere-se às ferramentas para alterações e visualizações de
arquivos no repositório a fim de facilitar as atividades cotidianas já o arquivos no repositório a fim de facilitar as atividades cotidianas. Já o
segundo, **Interfaces de comparação** representam as que objetivam segundo, **Interfaces de comparação**, representam as que objetivam
facilitar a visualização e edição de arquivos com base em suas facilitar a visualização e edição de arquivos com base em suas
diferentes versões. Detalhes de download, instalação e exemplos da diferentes versões. Detalhes de download, instalação e exemplos da
utilização destas interfaces no fluxo de trabalho de um projeto com utilização destas interfaces no fluxo de trabalho de um projeto são descritos.
versionamento **GIT** são descritos.
# Interfaces GIT # # Interfaces Git #
Neste material chamaremos de **Interfaces GIT** as *GUI's* para gestão Neste material chamaremos de **Interfaces GIT** as *GUI's* para gestão
de um repositório. Estas facilitam a utilização das principais de um repositório. Estas facilitam a utilização das principais
instruções **GIT** (`git add`, `git commit`, `git push`, `git pull`), instruções **Git** (`git add`, `git commit`, `git push`, `git pull`),
visualização dos arquivos e alterações no repositório. visualização dos arquivos e alterações no repositório.
Desde o surgimento do GIT diversas *GUI's* foram propostas. Neste
capítulo apresentamos as principais *GUI's* disponíveis para as
diferentes plataformas, sistemas UNIX, Mac OS X e Windows. São
destacados os comandos implementados pela interface e exemplos de sua
utilidade em um projeto versionado.
## git-gui ## ## git-gui ##
\begin{wrapfigure}{r}{0.3\textwidth} \begin{wrapfigure}{r}{0.3\textwidth}
...@@ -84,8 +77,8 @@ utilidade em um projeto versionado. ...@@ -84,8 +77,8 @@ utilidade em um projeto versionado.
próprio GIT} próprio GIT}
\end{wrapfigure} \end{wrapfigure}
Baseada em *Tcl/Tk* a *GUI* chamada `git gui` é mantida como projeto Baseada em *Tcl/Tk*, a *GUI* chamada `git gui` é mantida como projeto
independente do GIT, mas as versões estáveis são distribuídas junto com independente do Git, mas as versões estáveis são distribuídas junto com
o programa principal, portanto não é necessário o download e o programa principal, portanto não é necessário o download e
instalação. A interface é voltada para realizar alterações no instalação. A interface é voltada para realizar alterações no
repositório, desde as mais simples como *commitar* arquivos até as mais repositório, desde as mais simples como *commitar* arquivos até as mais
...@@ -93,9 +86,9 @@ específicas como voltar estágios ou reescrever o último *commit* (muito ...@@ -93,9 +86,9 @@ específicas como voltar estágios ou reescrever o último *commit* (muito
útil quando notamos erros de gramática logo após a submissão). Nesta útil quando notamos erros de gramática logo após a submissão). Nesta
seção abordaremos apenas as alterações mais comuns no repositório. seção abordaremos apenas as alterações mais comuns no repositório.
`git gui`, no Windows, pode ser aberto pelo menu iniciar. Nesta A `git gui` no Windows, pode ser aberta pelo menu iniciar. Nesta
plataforma, ao instalar o GIT (conforme visto no capítulo 2), optamos plataforma, ao instalar o Git (conforme visto no capítulo 2), optamos
pelos componentes **git BASH** e **git GUI** assim estas duas aplicações pelos componentes **git BASH** e **git GUI**. Assim estas aplicações
ficam disponíveis para uso. Em sistemas UNIX, a interface pode ser ficam disponíveis para uso. Em sistemas UNIX, a interface pode ser
instalada via terminal, também apresentada no capítulo 2: instalada via terminal, também apresentada no capítulo 2:
...@@ -107,7 +100,7 @@ sudo apt-get install git-gui ...@@ -107,7 +100,7 @@ sudo apt-get install git-gui
Ainda em sistemas Unix podemos criar um *alias* (criar ou editar Ainda em sistemas Unix podemos criar um *alias* (criar ou editar
adequadamente um arquivo em */usr/share/applications*) para que a `git adequadamente um arquivo em */usr/share/applications*) para que a `git
gui` fique listada junto as aplicações do sistema. Porém, de forma geral, gui` fique listada junto às aplicações do sistema. Porém, de forma geral,
independente da plataforma de trabalho, a `git gui` pode ser iniciada a independente da plataforma de trabalho, a `git gui` pode ser iniciada a
partir de um terminal `bash`, com o comando: partir de um terminal `bash`, com o comando:
...@@ -116,12 +109,11 @@ git gui ...@@ -116,12 +109,11 @@ git gui
``` ```
Para exemplificar a utilização desta interface vamos alterar alguns Para exemplificar a utilização desta interface vamos alterar alguns
arquivos do repositório `meu1repo`, criado no capítulo 3. arquivos do repositório `meu1repo` criado no capítulo 3.
```{r, include=FALSE} ```{r, include=FALSE}
## Temporariamente usando o meu1repo do arquivo git_tuto ## Temporariamente usando o meu1repo do arquivo git_tuto
rmarkdown::render("git_tuto.Rmd") rmarkdown::render("git_tuto.Rmd")
``` ```
```{r, engine="bash", echo=-c(1,2)} ```{r, engine="bash", echo=-c(1,2)}
...@@ -178,7 +170,7 @@ compreendem a interface. Na primeira porção temos listados os arquivos ...@@ -178,7 +170,7 @@ compreendem a interface. Na primeira porção temos listados os arquivos
presentes no *working directory*, os arquivos criados aparecem com ícone presentes no *working directory*, os arquivos criados aparecem com ícone
em branco e os modificados com linhas em azul, aqui a interface em branco e os modificados com linhas em azul, aqui a interface
implementa interativamente o comando `git add`, pois ao clicar no ícone implementa interativamente o comando `git add`, pois ao clicar no ícone
de um arquivo ele é automaticamente adicionado à *staging area*. Na de um arquivo ele é automaticamente adicionado a *staging area*. Na
segunda parte são listados os arquivos na *staging area* com ícone de segunda parte são listados os arquivos na *staging area* com ícone de
*check mark*. Na terceira parte temos a implementação do comando `git *check mark*. Na terceira parte temos a implementação do comando `git
diff` para qualquer arquivo selecionado. Com destaque de cores, a diff` para qualquer arquivo selecionado. Com destaque de cores, a
...@@ -187,9 +179,9 @@ fim temos no canto inferior direito a área para escrever *commits* com ...@@ -187,9 +179,9 @@ fim temos no canto inferior direito a área para escrever *commits* com
botões para submissão de ação. Um detalhe importante do `git gui` é que botões para submissão de ação. Um detalhe importante do `git gui` é que
o idioma do sistema operacional é verificado para sua construção, ou o idioma do sistema operacional é verificado para sua construção, ou
seja, os botões da interface na figura \ref{fig:gitgui} são *push*, seja, os botões da interface na figura \ref{fig:gitgui} são *push*,
*commit*, *sign off*, etc pois o idioma do sistema operacional em que *commit*, *sign off*, etc, pois o idioma do sistema operacional em que
essa interface foi executada é o inglês. Para outros idiomas as essa interface foi executada é o inglês. Para outros idiomas as
mensagens podem sofrem alterações. mensagens podem sofrer alterações.
Além das quatro áreas principais da interface, que facilitam Além das quatro áreas principais da interface, que facilitam
interativamente atividades como `git status`, `git diff`, `git add`, interativamente atividades como `git status`, `git diff`, `git add`,
...@@ -211,23 +203,23 @@ ser acessadas com um simples clique e são auto-explicativas. ...@@ -211,23 +203,23 @@ ser acessadas com um simples clique e são auto-explicativas.
Pioneira dentre as interfaces gráficas, `gitk` foi a primeira Pioneira dentre as interfaces gráficas, `gitk` foi a primeira
*GUI* implementada. Também escrita em *Tcl/Tk*, esta *GUI* *GUI* implementada. Também escrita em *Tcl/Tk*, esta *GUI*
tem como objetivo a apresentação do histórico de um projeto. A `gitk` tem como objetivo a apresentação do histórico de um projeto. A `gitk`
é incorporada ao principal repositório do GIT, portanto nas instalações é incorporada ao principal repositório do Git, portanto nas instalações
completas do GIT esta interface fica disponível sem ser necessário completas, esta interface fica disponível sem ser necessário
download e instalação. Nesta seção apresentamos a `gitk` detalhando a download e instalação. Nesta seção apresentamos a `gitk`, detalhando a
disposição dos elementos nesta interface que se mostra muito útil na disposição dos elementos nesta interface que se mostra muito útil na
visualização de projetos GIT. visualização de projetos.
A `gitk` trabalha em conjunto com a `git gui`. Em `git gui` podemos A `gitk` trabalha em conjunto com a `git gui`. Em `git gui` podemos
fazer alterações de forma rápida e visual nos arquivos que estão na fazer alterações de forma rápida e visual nos arquivos que estão na
*staging area* e *working directory*, porém para visualizar o histórico *staging area* e *working directory*, porém para visualizar o histórico
completo de *commits* com ramificações, marcações e demais detalhes, completo de *commits* com ramificações, marcações e demais detalhes,
recorremos à `gitk`, tanto é que no menu da `git gui` temos um atalho recorremos à `gitk`, uma prova disso é que no menu da `git gui` temos um atalho
para a `gitk` \menu{Repository > Visualize History}. Essa interface se para a `gitk` \menu{Repository > Visualize History}. Essa interface se
mostra muito útil também como ferramenta de aprendizagem GIT, uma vez mostra muito útil também como ferramenta de aprendizagem Git, uma vez
que visualizar de forma gráfica as alterações que os comandos realizados que visualizar de forma gráfica as alterações que os comandos realizados
causam no projeto, torna mais fácil a compreensão dos mesmos. causam no projeto, torna mais fácil a compreensão dos mesmos.
`gitk`, assim como a `git gui` pode ser chamada atráves de linha de `gitk`, assim como a `git gui` pode ser chamada atráves da linha de
comando: comando:
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
...@@ -237,7 +229,7 @@ gitk ...@@ -237,7 +229,7 @@ gitk
Para exemplificar a disposição dos elementos nesta interface, seguimos Para exemplificar a disposição dos elementos nesta interface, seguimos
com as alterações feitas na seção anterior, lembrando que temos todas as com as alterações feitas na seção anterior, lembrando que temos todas as
alterações já realizadas no capítulo 3 e ainda duas modificações e uma alterações já realizadas no capítulo 3 e ainda duas modificações e uma
inclusão de arquivo não *commitadas*. Visualizando a interface `gitk` inclusão de arquivo não *commitados*. Visualizando a interface `gitk`
chamada neste estado do repositório temos: chamada neste estado do repositório temos:
<!-- ![](./images/gitk1.png) --> <!-- ![](./images/gitk1.png) -->
...@@ -250,24 +242,24 @@ chamada neste estado do repositório temos: ...@@ -250,24 +242,24 @@ chamada neste estado do repositório temos:
\label{fig:gitk} \label{fig:gitk}
\end{figure} \end{figure}
Perceba na figura \ref{fig:gitk} que esta interface é bem mais completa Perceba na figura \ref{fig:gitk} que esta interface é mais completa
do que a `git gui` no que diz respeito à informação. Dividida em apenas do que a `git gui` no que diz respeito à informação. Dividida em apenas
duas partes, a `gitk` apresenta na primeira todo o histórico do projeto, duas partes, a `gitk` apresenta na primeira todo o histórico do projeto,
é uma implementação visual e agradável do comando `git log --graph`. No comtempla uma implementação visual e agradável do comando `git log --graph`. No
gráfico apresentado na parte superior, as bolinhas azuis representam gráfico apresentado na parte superior, as bolinhas em azul representam
*commits* passados, a de amarelo indica o estado atual do repositório e *commits* passados, a de amarelo indica o estado atual do repositório e
em vermelho são as modificações no *working directory*. Ao lado estão os em vermelho são as modificações no *working directory*. Ao lado estão os
autores dos respectivos *commits* e o momento em que foram feitos. Na autores dos respectivos *commits* e o momento em que foram feitos. Na
parte inferior da interface temos o detalhamento do *commit* selecionado parte inferior da interface temos o detalhamento do *commit* selecionado
na parte superior. As informações contidas aqui vão desde o na parte superior. As informações contidas aqui vão desde
identificador do *commit* (*SHA1 ID*), diferença das modificações identificador do *commit* (*SHA1 ID*), diferença das modificações
referenciadas por este *commit* com relação ao estado anterior do referenciadas com relação ao estado anterior do
repositório até a listagem dos arquivos atingidos pelo *commit* repositório até a listagem dos arquivos atingidos pelo *commit*
selecionado. selecionado.
Além da excelente apresentação visual do repositório GIT, a interface Além da excelente apresentação visual do repositório Git, a interface
`gitk` também permite algumas alterações. Clicando com o botão direito de `gitk` também permite algumas alterações. Clicando com o botão direito de
seu *mouse* em qualquer *commit* listado podemos criar *tags*, reverter o seu *mouse* em qualquer *commit* listado, podemos criar *tags*, reverter o
repositório neste estado, criar um ramo a partir do *commit* dentre outras repositório neste estado, criar um ramo a partir do *commit* dentre outras
opções possíveis atráves da interface. opções possíveis atráves da interface.
...@@ -277,7 +269,7 @@ opções possíveis atráves da interface. ...@@ -277,7 +269,7 @@ opções possíveis atráves da interface.
Estas duas interfaces tentam juntar em uma única as opções Estas duas interfaces tentam juntar em uma única as opções
proporcionadas pela `git gui` e pela `gitk`. Os layouts e as propostas proporcionadas pela `git gui` e pela `gitk`. Os layouts e as propostas
são bastante similares, a diferença está na portabilidade. A `gitg` é são similares, a diferença está na portabilidade. A `gitg` é
implementada em *GTk+* e está disponível para sistemas UNIX e a `gitx` implementada em *GTk+* e está disponível para sistemas UNIX e a `gitx`
foi implementada para Mac OS seguindo o estilo de aplicativos deste foi implementada para Mac OS seguindo o estilo de aplicativos deste
sistema operacional. De forma geral não há detalhes a serem repassados sistema operacional. De forma geral não há detalhes a serem repassados
...@@ -310,9 +302,9 @@ nas seções sobre `git gui` e `gitk` ...@@ -310,9 +302,9 @@ nas seções sobre `git gui` e `gitk`
*RabbitVCS* é uma coleção de ferramentas gráficas para navegadores de *RabbitVCS* é uma coleção de ferramentas gráficas para navegadores de
arquivos do sistema LINUX que permitem o acesso simples e direto aos arquivos do sistema LINUX que permitem o acesso simples e direto aos
sistemas de controle de versão GIT e/ou Subversion. Não se caracteriza sistemas de controle de versão Git e/ou Subversion. Não se caracteriza
como interface, porém altera a visualização no navegador de arquivos de como interface, porém altera a visualização no navegador de arquivos de
diretórios sob versionamento GIT além de dispor de ações implementadas diretórios sob versionamento, além de dispor de ações implementadas
nas opções do menu quando pressionado o botão direito do mouse. nas opções do menu quando pressionado o botão direito do mouse.
<!-- ![](./images/rabbitvcs.png) --> <!-- ![](./images/rabbitvcs.png) -->
...@@ -332,20 +324,19 @@ nas seções sobre `git gui` e `gitk` ...@@ -332,20 +324,19 @@ nas seções sobre `git gui` e `gitk`
Na figura \ref{fig:rabbit} temos o *screenshot* do repositório Na figura \ref{fig:rabbit} temos o *screenshot* do repositório
`meu1repo` no navegor de arquivos `nautilus` (padrão do sistema Ubuntu `meu1repo` no navegor de arquivos `nautilus` (padrão do sistema Ubuntu
14.04). Perceba que com essa interface os ícones de arquivos e pastas no 14.04). Perceba que com essa interface os ícones de arquivos e pastas no
navegador ganham destaque com um outro pequeno ícone na paste navegador ganham destaque com um outro pequeno ícone na parte
inferior. Estes pequenos ícones indicam o estado do arquivo sem precisar inferior. Estes pequenos ícones indicam o estado do arquivo sem precisar
recorrer ao terminal, ou seja, temos um `git status` no próprio recorrer ao terminal, ou seja, temos um `git status` no próprio
navegador de arquivos. Além disso `RabbitVCS` complementa o menu de navegador de arquivos. Além disso `RabbitVCS` complementa o menu de
opções acessados com o botão direito do mouse. As opções implementadas opções acessados com o botão direito do mouse. Essas opções são completas,
neste menu são completas, vão desde *commits*, criação de *branchs* e vão desde *commits*, criação de *branchs* e *tags*, reverter
*tags* até a ações de reverter o estado do repositório, atualizar com a o estado do repositório, até atualizar com a versão remota, entre outras.
versão remota, entre outras.
### git-cola ### ### git-cola ###
Esta também é uma interface alternativa que se destaca por ser completa Esta também é uma interface alternativa que se destaca por ser completa
e portável (disponível para sistema LINUX, Windows e Mac). Implementada e portável (disponível para sistema LINUX, Windows e Mac). Implementada
em *python*, `git-cola` é uma alternativa à `git gui` e contém em *python*, a `git-cola` é uma alternativa à `git gui` e contém
praticamente os mesmos elementos para alterações no repositório. Como a praticamente os mesmos elementos para alterações no repositório. Como a
`git gui` se auxilia da `gitk` para visualização, a `git-cola` também `git gui` se auxilia da `gitk` para visualização, a `git-cola` também
tem uma interface de apoio, chamada de `git-dag` que vem instalado junto tem uma interface de apoio, chamada de `git-dag` que vem instalado junto
...@@ -366,8 +357,8 @@ ao `git-cola`. ...@@ -366,8 +357,8 @@ ao `git-cola`.
Perceba pela figura \ref{fig:git-dag} que as opções das interfaces são Perceba pela figura \ref{fig:git-dag} que as opções das interfaces são
similares as apresentadas em `git gui` e `gitk`. As interfaces similares as apresentadas em `git gui` e `gitk`. As interfaces
`git-cola` e `git-dag` se destacam pela fácil manipulação do layout `git-cola` e `git-dag` se destacam pela fácil manipulação do layout
exibido, além de buscar deixar a interface o mais intuitiva exibido, além de deixar a interface mais intuitiva
possível. Como destaque em implementação de funcionalidade GIT, a possível. Como destaque em implementação de funcionalidade Git, a
`git-cola` se sobressai com relação à `git gui` na possibilidade de `git-cola` se sobressai com relação à `git gui` na possibilidade de
execução do comando `git rebase` via interface. execução do comando `git rebase` via interface.
...@@ -376,40 +367,40 @@ execução do comando `git rebase` via interface. ...@@ -376,40 +367,40 @@ execução do comando `git rebase` via interface.
Muitas vezes é inconveniente trabalhar com códigos fonte em um editor e Muitas vezes é inconveniente trabalhar com códigos fonte em um editor e
ter que abrir um terminal *bash* em outra janela do sistema operacional ter que abrir um terminal *bash* em outra janela do sistema operacional
para verificar o sistema de versionamento, realizar commits, para verificar o sistema de versionamento, realizar commits,
etc. Felizmente alguns editores possuem um sistema **GIT** integrado, etc. Felizmente alguns editores possuem um sistema **Git** integrado,
seja por meio de *plugins* adicionais instalados ou pela opção nativa do seja por meio de *plugins* adicionais instalados ou pela opção nativa do
editor. editor.
Destacamos aqui dois editores, comumente utilizados pela comunidade Destacamos aqui dois editores, comumente utilizados pela comunidade
estatística, que possuem os comandos **GIT** intergrado à sua estatística, que possuem os comandos **Git** intergrado à sua
interface. São eles, o `emacs`, o qual temos as opções de *buffers* no interface. São eles, o `emacs`, o qual temos as opções de *buffers* no
editor onde podemos abrir uma instância *shell* e executar os comandos editor onde podemos abrir uma instância *shell* e executar os comandos
**GIT** junto com o desenvolvimento do código fonte. Além disso uma **Git** junto com o desenvolvimento do código fonte. Além disso uma
extensão poderosa chamada `magit`\footnote{Informações em extensão poderosa chamada `magit`\footnote{Informações em
\url{http://magit.vc/}} está disponível e em desenvolvimento para o uso \url{http://magit.vc/}} está disponível e em desenvolvimento para o uso
do **GIT** no `emacs`, esta extensão proporciona opções de comandos e no `emacs`, esta extensão proporciona opções de comandos e
visualização em um *buffer* do editor que facilita o trabalho de visualização em um *buffer* do editor que facilita o trabalho de
versionamento. Outro editor também muito utilizado em Estatística, versionamento. Outro editor também muito utilizado em Estatística,
talvez o mais utilizado pela comunidade, é o RStudio que também talvez o mais utilizado pela comunidade, é o RStudio que também
implementa em sua interface vários comandos, assim como as interfaces implementa em sua interface vários comandos, assim como as interfaces
anteriormente descritas e para tarefas não triviais uma chamada do anteriormente descritas e tarefas não triviais, uma chamada do
terminal *Shell* é possível dentro do aplicativo. Devido ao seu grande terminal *Shell* é possível dentro do aplicativo. Devido ao seu grande
uso o aplicativo RStudio terá uma seção específica onde as diversas uso, o RStudio terá uma seção específica onde as diversas
ferramentas serão exploradas, com exemplos e ilustrações voltadas para a ferramentas serão exploradas, com exemplos e ilustrações voltadas para a
comunidade estatística. comunidade estatística.
# Interfaces de comparação # # Interfaces de comparação #
Uma das principais vantagens do **GIT** é a possibilidade de trabalho Uma das principais vantagens do **Git** é a possibilidade de trabalho
paralelo por dois ou mais usuários ou por ramos de desenvolvimento. E paralelo por dois ou mais usuários ou por ramos de desenvolvimento. E
como qualquer desenvolvimento paralelo, desejamos ao final do trabalho, como qualquer desenvolvimento paralelo, desejamos ao final do trabalho,
mesclar as contribuições realizadas lado a lado. Como vimos no capítulo mesclar as contribuições realizadas lado a lado. Como vimos no capítulo
3 isso é feito através do comando `git merge ramo_desenvolvimento` para 3 isso é feito através do comando `git merge ramo_desenvolvimento` para
ramos locais e com o comando `git push origin` quando estamos ramos locais e `git push origin` quando estamos
trabalhando em equipe e as contribuições são enviadas para um servidor trabalhando em equipe e as contribuições são enviadas para um servidor
remoto, capítulo 4. Porém, quando a mesma porção de um mesmo arquivo é remoto, capítulo 4. Porém, quando a mesma porção de um mesmo arquivo é
alterada em duas instâncias distintas (ramos diferentes, usuários alterada em duas instâncias distintas (ramos diferentes, usuários
diferentes etc.) ocorrem conflitos e vimos como o **GIT** os sinaliza diferentes etc.) ocorrem conflitos e vimos como o **Git** os sinaliza
para que possamos resolvê-los. Nesta seção mostraremos como as para que possamos resolvê-los. Nesta seção mostraremos como as
interfaces gráficas dedicadas à resolução de conflitos na mesclagem e à interfaces gráficas dedicadas à resolução de conflitos na mesclagem e à
visualização da diferença de arquivos em estados diferentes do visualização da diferença de arquivos em estados diferentes do
...@@ -425,20 +416,20 @@ repositório podem nos auxiliar. ...@@ -425,20 +416,20 @@ repositório podem nos auxiliar.
arquivos} arquivos}
\end{wrapfigure} \end{wrapfigure}
Há vários programas que objetivam a comparação visualmente agradável de Há vários programas que objetiva a comparação visualmente agradável de
arquivos. Aqui iremos abordar o programa `meld`, que é multiplataforma, arquivos. Aqui iremos abordar o programa `meld`, que é multiplataforma
*open source* e tem várias facilidades implementadas, porém outras *open source* e tem várias facilidades implementadas, porém outras
alternativas serão indicadas, e devido à equidade de objetivos todos os alternativas serão indicadas, e devido à equidade de objetivos todos os
comentários feitos para o `meld` podem ser adotadas para os demais. comentários feitos para o `meld` podem ser adotadas para os demais.
O programa `meld` é implementado em *python* e se denomina como "uma O programa `meld` é implementado em *python* e se denomina como "uma
ferramenta de diferenciação e mesclagem voltada para desenvolvedores", o ferramenta de diferenciação e mesclagem voltada para desenvolvedores", o
programa pode ser baixado para as plataformas sistemas UNIX, Mac OS X e programa pode ser baixado para as plataformas UNIX, Mac OS X e
Windows atráves do endereço <http://meldmerge.org/>. `meld` não é uma Windows atráves do endereço <http://meldmerge.org/>. O `meld` não é uma
ferramenta específica para o GIT, como as apresentadas na seção ferramenta específica para o Git, como as apresentadas na seção
\ref{interfaces-git}, porém pode e será usado para comparar versões de \ref{interfaces-git}, porém é permitido e será usado para comparar versões de
arquivos ou repositórios no **GIT**, mas vamos começar apresentando o arquivos ou repositórios, mas vamos começar apresentando o `meld` como
`meld` como programa independente. programa independente.
Inicializando o programa, sua tela inicial deverá ser similar a Inicializando o programa, sua tela inicial deverá ser similar a
apresentada na figura \ref{fig:meld1}, aqui estamos utilizando um apresentada na figura \ref{fig:meld1}, aqui estamos utilizando um
...@@ -458,7 +449,7 @@ A partir da escolha, o `meld` apresenta os arquivos ou diretórios lado a ...@@ -458,7 +449,7 @@ A partir da escolha, o `meld` apresenta os arquivos ou diretórios lado a
lado para comparação e destaca as porções dentro dos arquivos que estão lado para comparação e destaca as porções dentro dos arquivos que estão
discordantes. A figura \ref{fig:meld2} apresenta a comparação de dois discordantes. A figura \ref{fig:meld2} apresenta a comparação de dois
arquivos, que salvamos como `README_v1` e `README_v2` (relembrando os arquivos, que salvamos como `README_v1` e `README_v2` (relembrando os
velhos tempos antes de conhecermos o **GIT**). velhos tempos antes de conhecermos o **Git**).
\begin{figure} \begin{figure}
\begin{center} \begin{center}
...@@ -473,25 +464,48 @@ velhos tempos antes de conhecermos o **GIT**). ...@@ -473,25 +464,48 @@ velhos tempos antes de conhecermos o **GIT**).
Com isso já podemos notar onde utilizar esta ferramenta no fluxo de Com isso já podemos notar onde utilizar esta ferramenta no fluxo de
trabalho de um projeto sob versionamento. Vamos então voltar ao nosso trabalho de um projeto sob versionamento. Vamos então voltar ao nosso
projeto `meu1repo`, iniciado no capítulo 3 e alterado na seção projeto `meu1repo`, iniciado no capítulo 3 e alterado na seção
\ref{interfaces-git} (Interfaces GIT). As alterações realizadas não \ref{interfaces-git} (Interfaces Git). As alterações realizadas não
foram salvas, então podemos visualizá-las no `meld`. A inicialização do foram salvas, então podemos visualizá-las no `meld`. A inicialização do
programa pode ser feita via linha de comando atráves do comando **GIT** programa pode ser feita via linha de comando `git difftool`, só temos
chamado `git difftool`, só temos que lembrar onde está o arquivo binário que informar o programa a ser utilizado com a opção
baixado e o informar com a opção `-t` (abreviação de `--tool`). Nos `-t` (abreviação de `--tool`). Nos sistemas UNIX, o programa pode ser
sistemas UNIX isto não é necessário, pois o programa pode ser lançado lançado apenas atráves do nome `meld`.
somente atráves do nome `meld`, já no Windows deve-se indicar o caminho
para o executável (normalmente `C:\\Program Files
(x86)\\Meld\\meld\\meld.exe`).
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
## Compara o arquivo README (Windows)
git difftool -t "C:\\Program Files (x86)\\Meld\\meld\\meld.exe" README.md
## Verificar se funciona.
## Compara o arquivo README (UNIX) ## Compara o arquivo README (UNIX)
git difftool -t meld README.md git difftool -t meld README.md
``` ```
Para utilização em sistemas Windows, programas externos ao Git devem
ser informados no arquivo de configuração (`.gitconfig`). Abaixo
configuramos, via linha de comando, este arquivo para usarmos o `meld`
como ferramenta de comparação - `difftool`, tanto para usuários Unix
como usuários Windows:
```{r, engine="bash", eval=FALSE}
## Define localmente o meld como ferramenta padrão de diff
##-------------------------------------------
## Unix.
git config diff.tool meld
##-------------------------------------------
### Windows.
git config diff.tool meld
git config difftool.meld.cmd '"path/Meld.exe" $LOCAL $REMOTE'
```
\noindent
onde `path` é o caminho para o arquivo executável do programa `meld`.
`$LOCAL` representa o arquivo na sua versão local e `$REMOTE` na sua
versão remota. Assim o programa pode ser lançado apenas com o
comando:
```{r, engine="bash", eval=FALSE}
## Compara o arquivo README (WINDOWS)
git difftool README.md
```
\begin{figure} \begin{figure}
\begin{center} \begin{center}
\includegraphics{./images/meld3} \includegraphics{./images/meld3}
...@@ -502,23 +516,24 @@ git difftool -t meld README.md ...@@ -502,23 +516,24 @@ git difftool -t meld README.md
\label{fig:meld3} \label{fig:meld3}
\end{figure} \end{figure}
Na figura \ref{fig:meld3} temos a mesma informação trazida pelas Na figura \ref{fig:meld3} temos o _screenshot_ do programa após executado
interfaces **GIT**, onde implementam o comando `git diff`, porém aqui o `difftool`. Nesta figura temos a mesma informação trazida pelas
podemos alterar os arquivos exibidos, atráves das flechas nas bordas interfaces onde implementam o comando `git diff`, porém aqui podemos
(levando ou trazendo as contribuições) ou mesmo editando pela alterar os arquivos exibidos atráves das flechas nas bordas (levando ou
interface. Isso pode ser útil caso necessite desfazer parcialmente um trazendo as contribuições) ou mesmo editando pela interface. Isso pode
*commit*, ou seja, parte das alterações de uma versão anterior seria ser útil caso necessite desfazer parcialmente um *commit*, ou seja,
mantida e parte alterada. parte das alterações de uma versão anterior seria mantida e parte
alterada.
Contudo a maior necessidade das ferramentas de comparação não está no Contudo, a maior necessidade das ferramentas de comparação não está no
seu uso como `difftools`, mas sim como `mergetools`. Já vimos no seu uso como `difftools`, mas sim como `mergetools`. Já vimos no
capítulo 3 que há momentos em que a mesclagem de ramos gera conflitos e capítulo 3 que há momentos em que a mesclagem de ramos gera conflitos e
estes eram resolvidos abrindo e editando os arquivos conflitantes. Porém estes eram resolvidos abrindo e editando os arquivos conflitantes. Porém
com `meld`, ou outras interfaces de comparação, podemos realizar a com o `meld` ou outras interfaces de comparação, podemos realizar a
resolução de conflitos via interface. resolução de conflitos via interface.
Para exemplificar a utilidade na resolução de conflitos na mesclagem, Para exemplificar a utilidade na resolução de conflitos na mesclagem,
vamos marcar as alterações já feita no `meu1repo` e criar um novo vamos marcar as alterações já feitas no `meu1repo` e criar um novo
*branch* alterando os mesmos arquivos a fim de gerar conflito. *branch* alterando os mesmos arquivos a fim de gerar conflito.
```{r, engine="bash", echo=-c(1,2)} ```{r, engine="bash", echo=-c(1,2)}
...@@ -571,8 +586,8 @@ cat(paste(x, collapse="\n")) ...@@ -571,8 +586,8 @@ cat(paste(x, collapse="\n"))
``` ```
E agora, ao invés de editarmos o arquivo em conflito, vamos utilizar a E agora, ao invés de editarmos o arquivo em conflito, vamos utilizar a
ferramenta `meld` para resolver os conflitos induzidos. Executamos no ferramenta `meld` para resolver os conflitos. Para isso, execute o
terminal: seguinte comando no terminal:
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
## Lançando a interface `meld` para resolução de conflitos ## Lançando a interface `meld` para resolução de conflitos
...@@ -600,15 +615,15 @@ esquerda o `REMOTE`, que representa a versão com as alterações a serem ...@@ -600,15 +615,15 @@ esquerda o `REMOTE`, que representa a versão com as alterações a serem
mescladas e; finalmente na porção central temos o `BASE`, com o conteúdo mescladas e; finalmente na porção central temos o `BASE`, com o conteúdo
de uma versão anterior comum a ambos. Assim como apresentado na figura de uma versão anterior comum a ambos. Assim como apresentado na figura
\ref{fig:meld3}, em que o `meld` foi utilizado como `difftool`, podemos \ref{fig:meld3}, em que o `meld` foi utilizado como `difftool`, podemos
(e neste caso devemos) editar um arquivo, o `BASE` exibido na porção (e neste caso devemos) editar um arquivo o `BASE`, exibido na porção
central do aplicativo. Este arquivo será o definitivo ao fim da central do aplicativo. Este arquivo será o definitivo ao fim da
mesclagem, nele podemos incluir as contribuições apresentadas no que mesclagem, nele podemos incluir as contribuições apresentadas no que
batizamos de `LOCAL` e `REMOTE`. Isso facilita a resolução de conflitos, batizamos de `LOCAL` e `REMOTE`. Isso facilita a resolução de conflitos,
pois podemos ver as contribuições lado a lado e decidir como deverá pois podemos ver as contribuições lado a lado e decidir como deverá
ficar o arquivo definitivo. ficar o arquivo definitivo.
Após a edição do arquivo o processo de mesclagem pode continuar Após a edição do arquivo, o processo de mesclagem pode continuar
normalmente, abaixo concluímos o processo via linha de comando: normalmente. Abaixo concluímos o processo via linha de comando:
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
## Verificando o estado do repositório ## Verificando o estado do repositório
...@@ -640,17 +655,16 @@ git add README.txt ...@@ -640,17 +655,16 @@ git add README.txt
git commit -m "Resolve conflito via meld" git commit -m "Resolve conflito via meld"
``` ```
Para resolucão de conflitos via alguma ferramenta gráfica, com o comando Para resolucão de conflitos via alguma ferramenta gráfica com o comando
`git mergetool`, o **GIT** gera arquivos de _backup_ com extensão `git mergetool`, o **Git** gera arquivos de _backup_ com extensão
`.orig`, perceba no _output_ gerado pelo `git status`, estes armazenam o `.orig`. Perceba no _output_ gerado pelo `git status` que estes armazenam o
conteúdo de cada arquivo em conflito com as porções conflitantes conteúdo de cada arquivo em conflito com as porções conflitantes.
sinalizadas pelo **GIT**. É recomendável não versionar estes arquivos de É recomendável não versionar estes arquivos de _backup_. Podemos
_backup_. Podemos então simplesmente exluí-los após a mesclagem ou então simplesmente exluí-los ou ignorá-los após a mesclagem adicionando
ignorá-los, adicionando arquivos com esta extensão no arquivos com esta extensão no `.gitignore`. Outra forma de manter seu
`.gitignore`. Outra forma manter seu repositório sem os arquivos repositório sem os arquivos _backup_ é configurando sua `mergetool` para
_backup_ é configurando sua `mergetool` para não aramzená-los, ou seja, não armazená-los, ou seja, que a própria ferramenta os descarte quando a
que a própria ferramenta os descarte quando a mescagem for bem mesclagem for bem sucedida. Isso pode ser configurado com:
sucedida. Isso pode ser configurado com:
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
## Configura a ferramenta de merge para não criar os backups ## Configura a ferramenta de merge para não criar os backups
...@@ -658,36 +672,42 @@ git config --global mergetool.keepBackup false ...@@ -658,36 +672,42 @@ git config --global mergetool.keepBackup false
``` ```
Até agora utilizamos o programa `meld` definindo-o na chamada dos O procedimento de conflito simulado acima foi resolvido utilizando o
comandos `difftool` e `mergetool`, com a opção `-t` (ou `--tool`), mas programa `meld`, com os comandos definidos para os sistemas baseados no
podemos também definir globalmente, qual será nossa ferramenta de `merge` kernel LINUX. Ainda a chamada do programa foi realizada através da opção `-t` (ou `--tool`). Porém podemos definir o `meld` como
e de `diff`. Para usuários de sistemas Unix, essa configuração pode ser ferramenta padrão para resolução de `merge`, assim como foi feito para
feita simplesmente com: a ferramenta de comparação (`difftool`). Abaixo configuramos o `meld`
também como `mergetool`, para sistemas Unix e Windows.
```{r, engine="bash", eval=FALSE} ```{r, engine="bash", eval=FALSE}
## Configura meld como ferramenta padrão de merge e diff
git config --global merge.tool meld ## Configura localmente meld como ferramenta padrão de merge
git config --global diff.tool meld ##-------------------------------------------
## Unix
git config merge.tool meld
##-------------------------------------------
## Windows
git config merge.tool meld
git config merge.meld.cmd '"path/Meld.exe" $LOCAL $BASE $REMOTE --output=$MERGED'
``` ```
<!-- Já para usuários de Windowns deve-se descrever o caminho para os --> Para Windows deve-se informar o caminho para o arquivo executável,
<!-- arquivos binários. --> `path`, além de definir as três versões que serão exibidas `$LOCAL`,
<!-- --> `$BASE` e `$REMOTE` conforme vimos na figura \ref{fig:meld4}. Ainda a
<!-- --> opção `--output=$MERGED`, para informar que o arquivo a ser editado será
<!-- ```{r, engine="bash", eval=FALSE} --> sobrescrito sob a versão `$MERGED`, que é criada automaticamente
<!-- ## Configura a ferramenta padrão de merge e diff --> pelo Git quando há conflitos.
<!-- ## No Windows -->
<!-- -->
<!-- ``` -->
Alternativamente pode-se editar o arquivo `.gitconfig` com as mesmas Alternativamente pode-se editar o arquivo `.gitconfig` com as mesmas
informações passadas ao comando `git config --global`. Para verificar informações passadas ao comando `git config`. Para verificar como
como altera-se esse arquivo com essas informações, abra-o após avaliar os altera-se esse arquivo, abra-o após avaliar os comandos descritos. Ainda,
comandos descritos. Agora quando avaliados os comandos `git mergetool` e se desejado que essas opções sejam válidas para todos os projetos Git de
`git difftool` o programa `meld` será lançado automaticamente. seu computador, a opção `--global` em `git config` pode ser
utilizada. Assim, quando avaliados os comandos `git mergetool` e `git difftool`, o programa `meld` será lançado automaticamente.
Com isso já temos nosso **GIT** devidamente configurado para utilizar o Com isso, já temos nosso **Git** devidamente configurado para utilizar o
programada `meld` e já observamos sua relevância quando se trabalha com programada `meld` e já observamos sua relevância quando se trabalha com
arquivos versionados. Mas ainda, apresentamos somente uma das várias arquivos versionados. Mas ainda, apresentamos somente uma das várias
interfaces que se dispõem a facilitar a visualização de diferenças e interfaces que se dispõem a facilitar a visualização de diferenças e
...@@ -697,14 +717,14 @@ mesclagem de arquivos. Podemos citar as interfaces ...@@ -697,14 +717,14 @@ mesclagem de arquivos. Podemos citar as interfaces
`P4Merge`\footnote{Disponível para \textit{download} em `P4Merge`\footnote{Disponível para \textit{download} em
\url{https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools}}, \url{https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools}},
como outras interfaces de comparação bastante utilizadas em projetos como outras interfaces de comparação bastante utilizadas em projetos
versionados. Em geral, todas estes programas seguem o mesmo estilo de versionados. Em geral, todos estes programas seguem o mesmo estilo de
exbição de arquivos que o `meld` e as configuração para torná-los exbição de arquivos que o `meld` e as configurações para torná-los
programas de `mergetool` e `difftoll` padrão são as mesmas. programas de `mergetool` e `difftoll` padrão são as mesmas.
É importante salientar que as ferramentas gráficas apresentadas neste É importante salientar que as ferramentas gráficas apresentadas neste
capítulo não substituem totalmente os comandos via terminal, mas seu uso capítulo não substituem totalmente os comandos via terminal, mas seu uso
em conjunto com estes facilitam o fluxo de trabalho adotado em um em conjunto com estes facilitam o fluxo de trabalho adotado em um
projeto sob versionamento **GIT**. projeto sob versionamento.
<!-- Exclui o repositório criado para exemplicação --> <!-- Exclui o repositório criado para exemplicação -->
```{r, engine = "bash", include = FALSE, eval = FALSE} ```{r, engine = "bash", include = FALSE, eval = FALSE}
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment