diff --git a/.RData b/.RData new file mode 100644 index 0000000000000000000000000000000000000000..8926fe72d6c516a21c1b6a9cdb97341cc3a11d32 Binary files /dev/null and b/.RData differ diff --git a/cap03.Rmd b/cap03.Rmd index 549672b52127ccce48f31fa0b845bbde57a228ac..1f5611ced58a900e16d0ca0f7c65dc2e22f6b132 100644 --- a/cap03.Rmd +++ b/cap03.Rmd @@ -1,35 +1,50 @@ --- -title: "Repositório Local" -author: "Gabriel Sartori" -date: "29/10/2015" -output: - html_document: - highlight: pygments - theme: flatly - keep_md: yes +title: 'Capítulo 3: Repositório Local' +author: +date: "15/12/2015" +graphics: yes +output: + pdf_document: + template: template.tex + highlight: default + toc: true + toc_depth: 2 + keep_tex: true + number_sections: true --- -INCLUIR INTRODUÇÃO AO CAPÍTULO -## Instruções do Git +```{r, include=FALSE} +library(knitr) +opts_chunk$set(comment=NA) +``` + +\chapter{Repositório Local} + +### Instruções do Git Neste capítulo, as instruções serão todas feitas no terminal mesmo que existam alternativas gráficas para as mesmas. Isso enfatiza no que está sendo feito além do fato de que no terminal todos devem ter os mesmos recursos e os comandos irão produzir os mesmos resultados, o que faz -esse tutorial algo reproduzível. Algumas ferramentas gráficas para uso -do Git serão abordadas no capítulo 6. +esse tutorial algo reproduzível. Casos você queira usufruir das ferramentas gráficas vá para o capítulo 6. -Já temos o Git devidamente configurado, com credenciais (nome e e-mail) e +Sabendo que você executou os comandos de perfil que no capítulo anterior, temos o Git devidamente configurado, com credenciais (nome e e-mail) e configurações aplicadas. Vamos então ver como o sistema de controle de versão acontece. +```{r, engine = "bash"} +# Apenas verificando o cadastro +git config user.name "Knight Rider" +git config user.email "batman@justiceleague.org" +``` + Todas as instruções do Git são sinalizadas por começar com `git` seguido da instrução/comando e seus argumentos complementares, se existirem/necessários. -```{r, engine="sh", include=FALSE} -if [ -d meu1repo ] # Script para verificação da pasta meurepo1, retorna pasta limpa. +```{r, engine="bash", include=FALSE} +if [ -d meu1repo ] then echo "Diretório existe. Então apagar pasta .git" cd meu1repo @@ -45,37 +60,48 @@ else mkdir meu1repo fi -```{r, engine="sh"} -cd meu1repo ## Diretório de teste de comandos +## Tudo limpo tal como precisamos. +pwd +ls -a ``` ```{r, engine="bash", eval=FALSE} +## Padrão de instruções Git. +# git <instrução> <complementos...> + +``` + + +```{r, engine="bash"} +cd meu1repo ## Diretório de teste de comandos +``` + + +```{r, engine="bash", echo=-c(1:2), eval=FALSE} +cd meu1repo + ## Padrão de instruções Git. git <instrução> <complementos ...> ``` -Antes de iniciarmos o repositório, vamos só verificar o cadastro. Se -você já usa o Git ou fez os procedimento apresentados na primeira -sessão, o comando abaixo vai retornar o nome e e-mail usados e alguns -definições adicionais, caso existam. Em caso de ainda não ter -configurado o seu Git, informe o nome e e-mail conforme apresentado na -sessão anterior. +Os comandos abaixo revelam tudo o Git possui, embora dizer o que ele tem +não signifique nada diante do que ele pode fazer com o que tem. +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo -```{r, engine="sh", eval = FALSE} -## Mostra as informações/definições do usuário. -git config --list +## Ajuda resumida do Git, principais comandos com descrição. +git help -a ``` -Initialized empty Git repository in /home/gabriel/Suporte/PET/Projeto/Apostila/Git/.git/ +### Meu Primeiro Repositório -```sh -user.name=Knight Rider -user.email=batman@justiceleague.org +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo +## Inicia um repositório sob versionamento Git. +git init ``` -Temos um diretório destinado ao projeto que será mantido sobre -versionamento, então vamos iniciar um repositório Git nele. O Git retorna a mensagem de inicilização do repositório. Nesse momento ele cria um diretório oculto `.git/` com subdiretórios que são o coração do sistema de versionamento. Você não deve modificar nada nesse @@ -84,50 +110,14 @@ prejudicar ou interromper o funcionamento do Git. Se você quiser encerrar o processo de versionamento fazendo com que esse diretório seja como qualquer outro diretório, é só excluir a diretório `.git/`. Cada subdiretório do `.git/` tem um propósito mas deixaremos os -esclarecimentos para o futuro. -Por agora vamos apenas estrutur a minha primeira sessão. - +esclarecimentos para o futuro. Por agora vamos apenas conferir a sua +estrutura. ```{r, engine="bash", echo=-c(1:2)} -cd meu1repo/ - -## Inicia um repositório sob versionamento Git. -git init - - - -```{r, engine ="bash", eval = FALSE} -tree -a -``` - -``` -. -└── .git - ├── branches - ├── config - ├── description - ├── HEAD - ├── hooks - │ ├── applypatch-msg.sample - │ ├── commit-msg.sample - │ ├── post-update.sample - │ ├── pre-applypatch.sample - │ ├── pre-commit.sample - │ ├── prepare-commit-msg.sample - │ ├── pre-push.sample - │ ├── pre-rebase.sample - │ └── update.sample - ├── info - │ └── exclude - ├── objects - │ ├── info - │ └── pack - └── refs - ├── heads - └── tags - -10 directories, 13 files +cd meu1repo +## Mostra todo conteúdo do diretório. +tree -a ``` **NOTA**: o `tree` é um programa instalado a parte (*third party @@ -135,28 +125,38 @@ software*) que retorna arte ASCII representado a estrutura de diretórios. Se você usa distribuição Debian, instale com `sudo apt-get install tree`. Windows: [tree][]. -## Minha Primeira Sessão - -Vamos começar da maneira mais simples, criando um arquivo com uma linha +Vamos começar da maneira mais simples: criando um arquivo com uma linha de texto apenas. Bem, vale avisar que ao longo desse capítulo, os arquivos serão sempre bem pequenos e dificilmente realistas, mas como o enfoque está no funcionamento, não haverá prejuízo. Vamos criar o arquivo com conteúdo também pelo terminal. Se você -preferir, abra um editor de texto favorito (Emacs, Gedit, Geany, -RStudio, Bloco de Notas, etc) e faça algo mais elaborado. - +preferir, abra eu editor de texto favorito (Emacs, Gedit, Geany, +RStudio, Bloco de Notas, Notepad++, etc) e faça algo mais criativo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo -## Cria o arquivo README.txt com a linha - Meu primeiro repositório Git. +## Cria um arquivo com uma linha de conteúdo. echo "Meu primeiro repositório Git" > README.txt ## Lista os arquivos do diretório. tree ``` +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo + +## Reconhecimento do Git sobre aquivo criado. +git status +``` + +E o que o Git "acha" de tudo isso? O comando *status* é o mais usado do +Git, principalmente nas etapas de aprendizado. Uma característica +diferente do Git, se comparado a outras aplicações de uso por terminal, +é que ele é realmente camarada. Nas mensagens de *output*, o Git +informa o que aconteceu e também sugere o que fazer. + Este diretório agora é um diretório sob versionamento Git, portanto todas as alterações realizadas serão observadas pelo sistema. Ao criarmos o arquivo e pedirmos a situação (*status*), o Git indica que @@ -165,16 +165,15 @@ sugere uma ação que seria adicionar o aquivo (*add*). Se o seu sistema operacional está em português, parte dos outputs do Git podem estar traduzidos. -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Reconhecimento do Git sobre aquivo criado. -git status -``` - - +\begin{figure} + \begin{center} + \includegraphics [width=8cm]{./images/cap03_situation.png} + \end{center} + \caption{Passos para versionamento} + \label{fig:cap03_pversion} +\end{figure} -De forma geral temos 3 estágios de arquivos considerados no sistema de +De forma geral temos 3 estágios \ref{fig:cap03_pversion} de arquivos considerados no sistema de controle de versionamento Git. São eles *working directory*, *Staged Area* e *Committed*, os discutiremos ao logo do texto. Todo arquivo criado em um diretório versionado deve necessariamente passar pelos três @@ -188,19 +187,22 @@ arquivo seja incluído no monitoramento é necessário que ele receba o primeiro comando `add`. Isso marca a entrada dele no projeto como um arquivo que a partir de então será versionado. -O `status` agora não indica mais que ele está *untracked* mas sim que -existem mudanças para serem registradas (*changes to be commited*). A -melhor tradução de *commit*, pensando no seu uso em Git, é **fechar sob -segurança**. Quando um *commit* é feito, cria-se um instante na linha do -tempo que salva o estado do projeto. Para esse instante o projeto pode -ser retrocedido, voltando o condição/conteúdo de todos os arquivos para -o momento no qual o mencionado *commit* foi feito. Você pode voltar para -um *commit* de semanas e até anos atrás. +Para que o arquivo seja incluído no monitoramento é necessário que ele +receba o primeiro comando *add*. Isso marca a entrada dele no projeto +como um arquivo que a partir de então será versionado. O *status* agora +não indica mais que ele está *untracked* mas sim que existem mudanças +para serem registradas (*changes to be commited*). A melhor tradução de +*commit*, pensando no seu uso em Git, é **fechar sob segurança**. Quando +um *commit* é feito, cria-se um instante na linha do tempo que salva o +estado do projeto. Para esse instante o projeto pode ser retrocedido, +voltando o condição/conteúdo de todos os arquivos para o momento no qual +o mencionado *commit* foi feito. Você pode voltar para um *commit* de +semanas e até anos atrás. O controle de versão não é apenas voltar os arquivos para o conteúdo que eles tinham no passado. Arquivos rastreados que foram deletados ou renomeados são recuperados. Até mesmo as permissões de -leitura/escrita/execução dos arquivos são contempladas no +leitura/escrita/execussão dos arquivos são comtempladas no versionamento. ```{r, engine="bash", echo=-c(1:2)} @@ -215,30 +217,33 @@ O arquivo `README.txt` já é visto pelo Git como um arquivo com o qual ele deve se "preocupar", pois está sob versionamento. Vamos agora fazer um registro definitivo sobre o estado desse arquivo (*commit*). É de fundamental importância que a mensagem de notificação, ou mensagem de -*commit*, reflita as modificações feitas. São as mensagens que serão -consultadas quando você precisar desfazer ou voltar para um estado do -seu projeto. Ela deve ser curta (<= 72 caracteres) e ao mesmo tempo -informativa. A minha primeira mensagem não será, todavia. +*commit*, reflita as moficações feitas. São as mensagens que serão +consultadas quando você precisar desfazer/voltar. Ela deve ser curta (<= +72 caracteres) e ao mesmo tempo informativa. A minha primeira mensagem +não será, todavia. + Boas Práticas de commit: -- Verbo no indicativo -- Frases curtas -- Dizer o que fez e não como fez +\begin{itemize} +\item Verbo no indicativo} +\item Frases curtas +\item Dizer o que fez e não como fez +\end{itemize} -Evite mensagens de *commit* como: +Evite mensagens de commit como: -- "Modificações realizadas" -- "Trabalhei muito hoje" -- "Terminando este trabalho na madruga" +\begin{itemize} +\item "Modificações realizadas" +\item "Trabalhei muito hoje" +\item "Terminando este trabalho na madruga" +\end{itemize} -```{r, engine="bash", echo=-c(1:4)} +```{r engine="bash", echo =-c(1:2)} cd meu1repo -git config user.name "Knight Rider" -git config user.email "batman@justiceleague.org" ## Registro de versão. -git commit -m "Cria arquivo com título" +git commit -m 'Cria arquivo com título' ``` O retorno da instrução de *commit* indica o número de arquivos incluídos @@ -251,59 +256,47 @@ projeto. São mostrados apenas os 7 primeiros dígitos porque são suficientes para diferenciar *commits*, seja de projetos pequenos ou até mesmo de projetos moderados ou grandes. -Para o registro do desenvolvimento, existe uma outra marcação de projeto -que são as tags, que tem o caráter de destacar pontos de destaque da ati -vidade como por exemplo versão versão alfa, beta. +### Complementos +Para o registro de desenvolvimento, existe marcação por tags, que +seriam commits especiais, geralmente usado para marcar pontos de +destaque do projeto, por exemplo versão alfa, beta, teste servidor. -```{r, engine = "sh"} -git tag versao1 -git status -``` +```{r, engine = "bash", echo =-c(1:2), eval = FALSE} +cd meu1repo + +# Criando a tag +git tag versao2 -```{r, engine = "sh"} # Podemos marcar uma tag com um commit git tag -a versao2 -m "Versão 2 está pronta" -``` - - -```{r, engine = "sh"} -# Ver todas as tags +# Para ver todas as tags git tag -``` - - -```{r,engine = "sh"} # Excluir tags git tag -d versao1 - ``` +Caso haja mudança no nome do arquivo que você esteja versionado, deve ser alterado pelo próprio git, para que fique no atual estágio de versionamento. - -Caso haja mudança de nome no arquivo o novo arquivo não estará na mesma etapa, portanto o ideal é alterar o nome do arquivo pelo GIT. - -```{r, engine = "sh", eval = FALSE} +```{r, engine = "bash", eval = FALSE} # git mv antigo novo - -git mv README LEIAME +git mv -f README.txt LEIAME.txt ``` Caso você queira excluir o arquivo -```{r, engine = "sh", eval = FALSE} -git rm README +```{r, engine = "bash", eval = FALSE} +git rm README.txt ``` - -# Aperfeiçoando +## Versões de Arquivos Diferentes Vamos criar mais arquivos e acrescentar conteúdo ao já rastreado pelo Git para percebermos o funcionamento. Escrever uma lista de razões para -usar o Linux. A lista é curta poder ampliar no futuro e com erros -de português para serem corrigidos posteriormente. +usar o Linux. Deixei a lista curta poder ampliar no futuro e com erros +de português para corrigir depois. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -321,7 +314,6 @@ echo "Por que usar o Linux? * É seguro * É customizavel" > porqueLinux.txt ``` -Saída ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -329,6 +321,7 @@ cd meu1repo ## Mostra o conteúdo do arquivo. less README.txt ``` + ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -336,12 +329,6 @@ cd meu1repo less porqueLinux.txt ``` -E o que o Git "acha" de tudo isso? O comando *status* é o mais usado do -Git, principalmente nas etapas de aprendizado. Uma característica -diferente do Git, se comparado a outras aplicações de uso por terminal, -é que ele é realmente camarada. Nas mensagens de *output*, o Git -informa o que aconteceu e também sugere o que fazer. - ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -360,7 +347,7 @@ acessar o histórico de registros usamos `git log`. O histórico mostra o obtida com `git log --oneline`, útil quando o histórico é longo. É possível fazer restrição no `git log`, como mostrar os *commits* a partir de certa data, certo intervalo de datas, para um único autor ou -único arquivo. Visite: [git-log][]. +único arquivo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -382,9 +369,10 @@ cd meu1repo git diff ``` -Vamos aplicar o primeiro *add* ao `porqueLinux.txt` para que ele comece + +Vamos aplicar o primeiro *add* ao `porqueLinux.txt` para que ele começe a ser versionado. Perceba que ao adicioná-lo, as mudanças, no caso a -criação do arquivo com conteúdo, já são separadas para receber registro +criação do arquivo com contúdo, já são separadas para receber registro (*changes to be commited*). ```{r, engine="bash", echo=-c(1:2)} @@ -395,24 +383,46 @@ git add porqueLinux.txt git status ``` +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo + +## Mensagem que registra as modificações adicionadas. +git commit -m "Lista de inicial de o porquê usar o Linux." +``` + +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo +git status ``` -No ramo master -Changes not staged for commit: - (utilize "git add <arquivo>..." para atualizar o que será submetido) - (utilize "git checkout -- <arquivo>..." para descartar mudanças no diretório de trabalho) - modificado: porqueLinux.txt +Ainda resta o `REAMDE.txt` para receber registro. Você não precisa fazer +agora. Pode continuar editanto caso não tenha atingido uma quantidade de +modificação merecedora de *commit*. Lembre-se que registros geram +conteúdo no diretório `.git`. Quanto mais *commits*, mais conteúdo +gerado. Mas também, toda vez que você faz um *commit*, você define um +ponto de retorno, um estado salvo, caso precise no futuro +recuperar/visitar. O que é uma unidade de modificação comitável você irá +definir aos poucos com a prática. -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "git commit -a") +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo +## Encaminha o arquivo para receber registro. +git add README.txt +git status ``` -Na 1° linha diz que estamos no ramo master porém não vem esclarecer com muitos detalhes agora, -Na 2 ° linha diz que mudanças foram feitas no arquivo, e não estão sendo rastreadas. Logo abaixo é citado os comandos que utilizamos na seção anterior para o arquivo se tornar rastreado. -O comando `git status` é recomendado que se utilize sempre após algum outro comando git quando você está na fase inicial de aprendizagem. +```{r, engine="bash", echo=-c(1:2)} +cd meu1repo +## Atribui mensagem de notificação. +git commit -m "Adiciona frase do Linux Torvalds." +``` +Agora temos 3 *commits* e o *log* apresenta os *sha1* e as mensagens +correspondentes aos mesmos. Com `--oneline` resumimos o *output* mostrando +apenas o *sha1* e a mensagem de *commit*. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -420,17 +430,11 @@ cd meu1repo git log --oneline ``` -Por meio dos *sha1*, podemos aplicar o `diff` para visitarmos as +Por meio dos *sha1*, podemos aplicar o *diff* para visitarmos as modificações entre dois *commits*, não necessariamente consecutivos, por exemplo. Também podemos retroceder (*checkout*, *reset*, *revert*) o projeto para alguns desses pontos. -Abaixo instruímos o Git mostrar as diferenças para um *commit* atrás. A -cabeça (*HEAD*) é o que se entende como estado mais recente. Usa-se o -termo *HEAD* (cabeça) pois considera-se um crescimento do histórico -debaixo para cima no qual um novo *commit* é colocado em cima dos demais -(empilhado). O `HEAD@{0}` ou apenas `HEAD` representa o último registro -feito. Não é necessário escrever o último `HEAD` na instrução abaixo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -438,6 +442,14 @@ cd meu1repo git diff HEAD@{1} ``` +Instruímos o Git mostrar as diferenças para um *commit* atrás. A +cabeça (*HEAD*) é o que se entende como estado mais recente. Usa-se o +termo *HEAD* (cabeça) pois considera-se um crescimento do histórico +debaixo para cima no qual um novo *commit* é colocado em cima dos demais +(empilhado). O `HEAD@{0}` ou apenas `HEAD` representa o último registro +feito. Não é necessário escrever o último `HEAD` na intrução abaixo. + + Agora inspecionado uma distância de 2 *commits* a partir do último. Aqui tem-se os dois arquivos envolvidos nesse intervalo de 2 *commits*. Com `--name-only` retorna-se só o nome dos arquivos. @@ -479,10 +491,11 @@ cd meu1repo ## Depois de corrigir palavras e adicionar conteúdo. git status +``` O Git sugere você aplicar *add* para preparar para *commit*. Caso as modificações sejam um engano e não mais desejadas, você pode -desfazê-las, abandonar a correção/inclusão das palavras usando +desfazazê-las, abadonar a correção/inclusão das palavras usando `checkout`. Vamos aplicá-lo para ver como funciona. ```{r, engine="bash", echo=-c(1:2)} @@ -498,17 +511,12 @@ cd meu1repo ## Abandona modificações feitas presentes no arquivo. git checkout -- porqueLinux.txt ``` -No ramo master -Mudanças a serem submetidas: - (use "git reset HEAD <file>..." to unstage) ```{r, engine="bash", echo=-c(1:2)} cd meu1repo less porqueLinux.txt ``` -2° linha diz que mudanças foram submetidas, e logo abaixo diz caso eu queria retornar esta execução utilizando o comando `git reset`,mais pra frente veremos com detalhes. -Vamos *commitar* Bateu o arrependimento? Tem formas de poder retroceder com mudanças ainda não registradas mas mantendo a possibilidade de @@ -557,7 +565,7 @@ seguido de número, então estão sendo comparadas versões * `HEAD^n` * `HEAD~n` -em que `n` é um número inteiro não negativo. Cada sufixo tem uma +em que `n` é um número inteiro não negativo. Cada sulfixo tem uma finalidade que não detalharemos agora. Visite: [git-caret-and-tilde][]. ```{r, engine="bash", echo=-c(1:2)} @@ -591,7 +599,7 @@ git diff HEAD@{2} HEAD@{0} Para ficar claro daqui em diante, você pode ao invés de pedir `log`, pedir o `reflog` que incluí as referências em termos da sequência do -mais recente para os seus ancestrais. +mais rencente para os seus ancestrais. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -619,11 +627,9 @@ cd meu1repo git blame README.txt ``` +## Trabalhando com Ramos -## Fazendo cópias e trabalhando com ramos - -Existem várias formas de se trabalham com ramos. Geralmente os ramos são -feitos sob demandas para adicionar uma característica ao projeto +Existem várias formas de se trabalham com ramos veja a figura \ref{fig:cap03_work}. Geralmente os ramos são feitos sob demandas para adicionar uma característica ao projeto (*feature*) ou corrigir um *bug*. Alguns ramos, por outro lado, são ramos fixos destinados a receber o desenvolvimento dos ramos de demanda. Esses ramos são geralmente chamados de *devel* (*development*) @@ -631,7 +637,16 @@ e *release*. O ramo *master* é o default e em geral, para projetos grandes, o *master* só recebe versões funcionais do projeito, livre de bugs. -Para criar um ramo, usamos `git branch` seguido do nome que se +\begin{figure} + \begin{center} + \includegraphics [width=8cm]{./images/git_workflow.png} + \end{center} + \caption{\textit{Printscreen} do passo 8} + \label{fig:cap03_work} +\end{figure} + + +Para criar um ramo, usandos `git branch` seguido do nome que se deseja. Vamos criar um ramo para adicionar mais arquivos ou modificações ao projeto. @@ -685,7 +700,7 @@ partir do ramo que é seu ancestral, ou seja, ele começa a partir do commitar. O comando `wget` permite baixar arquivos pelo terminal. Será baixado um arquivo com um função para calcular o fator de inflação de variância (*vif*, variance inflation factor) usado em modelos de -regressão, disponível na página da [Professora Suely Giolo][]. +regressão, disponível na página da Professora Suely Giolo. [\footnote{\url{http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R}} ```{r, engine="bash", include=FALSE} ## Tenta ir para o diretório downloads, se não conseguir é porque não @@ -832,6 +847,8 @@ git log --oneline é extremamente útil para resolver os bugs. Vamos fazer um segundo ramo a partir do *commit* anterior a inclusão do arquivo R. + + ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -1015,7 +1032,7 @@ No nosso projeto temos o *master* e o *feature01* em igual condição, sem nenhuma diferença. O *commit* recém feito indica um novo seguimento a partir daquele onde adicionamos novos itens na lista. Vamos criar um novo ramo porque atualmente estamos em um ramos suspenso (*detached -HEAD*) que não é persistente. +HEAD*) que não é persistênte. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -1044,8 +1061,8 @@ git log --graph --oneline --decorate --date=relative --all Vamos explorar bem a funcionalidade. Vamos voltar para o `feature01` e criar mais coisas lá. Você já deve estar pensando que tudo isso é -absurdo e jamais alguém ficaria indo e voltando assim. Você está certo, -porém, quando o projeto envolve mais pessoas, certamente as coisas irão +absurdo e jamais alguém firaria indo e voltando assim. Você está certo, +porém, quando o projeto envolve mais pessoas, cerrtamente as coisas irão bifurcar em algum ponto. ```{r, engine="bash", echo=-c(1:2)} @@ -1172,7 +1189,7 @@ criar um ramo novo, modificar o arquivo na última linha e commitar. Vou voltar par ao *master* e fazer o mesmo mas vou usar um texto diferente para incluir no arquivo. Já que os ramos *feature01* e *feature02* não são mais necessários, podemos removê-los. No entanto, eles permanecem na -história do projeto e poder ressurgir se você voltar no tempo. +história do projeto e poder resurgir se você voltar no tempo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -1359,11 +1376,11 @@ less bib1.txt | head -10 Então deu conflito e o Git informa que ele deve ser resolvido. Resolver o conflito aqui significa abrir os arquivos com problema listados no git -status e editar de tal forma a "desconflitar". Nas regiões de conflito o +status e editar de tal forma a desconflitar. Nas regiões de conflito o Git sinaliza de forma especial, indicando por divisórias (`<<<<<<<`, `=======` e `>>>>>>>`) as versões no HEAD (ramo *master*) e no ramos a ser incorporado (*feature03*). Então vamos resolver o conflito sem -favorecer ninguém, ou seja, vamos encurtar para 4 dígitos e manter caixa +favorecer ninguém, ou seja, vamos encurtar para 4 digitos e manter caixa alta. Dessa forma o aquivo fica assim. ```{r, engine="bash", echo=-c(1:2), include=FALSE} @@ -1399,9 +1416,11 @@ cd meu1repo git status ``` + + ```{r, engine="bash", echo=-c(1:2)} cd meu1repo - +# Fluxo de trabalho do repositório criado git log --graph --oneline --decorate --date=relative --all ``` @@ -1411,3 +1430,22 @@ cd meu1repo git reflog ``` +<!-- Referências ---------------------------------------------------------> + +[Customizing Git - Git Configuration]: http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration +[Setting up a repository]: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-config +[sha1-size]: http://stackoverflow.com/questions/18134627/how-much-of-a-git-sha-is-generally-considered-necessary-to-uniquely-identify-a +[git-log]: http://git-scm.com/docs/git-log +[Installing-Git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git +[**Git BASH**]: https://lostechies.com/derickbailey/files/2011/03/Screen-shot-2010-11-25-at-10.56.27-AM.png +[**Git GUI**]: http://www.davidegrayson.com/for_blog/entry/20130420_git_win8/git-gui.png +[**Shell Integration**]: http://planetozh.com/blog/wp-content/uploads/2012/11/pewpew.png +[**Gitk**]: http://www.davidegrayson.com/for_blog/entry/20130420_git_win8/git-history.png +[how-to-set-meld-as-git-mergetool]: http://stackoverflow.com/questions/12956509/how-to-set-meld-as-git-mergetool +[linuxmint/nemo]: https://github.com/linuxmint/nemo +[tree]: http://gnuwin32.sourceforge.net/packages/tree.htm +[Git contributing guide]: http://git.leg.ufpr.br/leg/gitlab-rautu/blob/master/CONTRIBUTING.md +[git-diffs]: http://www.git-tower.com/learn/git/ebook/command-line/advanced-topics/diffs +[git-caret-and-tilde]: http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde +[Professora Suely Giolo]: http://www.est.ufpr.br/prof/22-suely.html +[git-hosting-services-compared]: http://www.git-tower.com/blog/git-hosting-services-compared/ diff --git a/cap03.md b/cap03.md index 9dcc20f8dc0c58580c4e1bcd9c5c017171d1cd1d..68c2dbcbaff505ae4d055140f031d7db1ad4992c 100644 --- a/cap03.md +++ b/cap03.md @@ -55,8 +55,6 @@ versionamento, então vamos iniciar um repositório Git nele. git init ``` -``` -## Initialized empty Git repository in /home/gabriel/apostila-git/cap03/meu1repo/.git/ ``` O Git retorna a mensagem de inicilização do repositório. Nesse momento @@ -122,256 +120,7 @@ preferir, abra um editor de texto favorito (Emacs, Gedit, Geany, RStudio, Bloco de Notas, etc) e faça algo mais elaborado. - -```bash -## Cria o arquivo README.txt com a linha - Meu primeiro repositório Git. -echo "Meu primeiro repositório Git" > README.txt - -## Lista os arquivos do diretório. -tree -``` - -``` -## . -## └── README.txt -## -## 0 directories, 1 file -``` - -Ao criarmos o arquivo e pedirmos a situação (*status*), ele indica que -existe um arquivo não restreado (*untracked*) no diretório. Inclusive -sugere uma ação que seria adicionar o aquivo (*add*). Se o seu sistema -operacional está em português, parte dos outputs do Git podem estar -traduzidos. - - - -```bash -## Reconhecimento do Git sobre aquivo criado. -git status -``` - -``` -## On branch master -## -## Initial commit -## -## Untracked files: -## (use "git add <file>..." to include in what will be committed) -## -## README.txt -## -## nothing added to commit but untracked files present (use "git add" to track) -``` - -A situação está o seguinte: figura-cap03-situation: - -Temos 3 estágios para o controle versionamento, após ter criado o docum --ento, está na condição diretório de trabalho. Aonde os arquivos não está -rastreado, apenas no seu computador como qualquer outro. Para tornar ver -sionado precisa passar para área temporária (add) e depois confirmar (commit). Após conf -irmado então o arquivo está tendo controle de versão. Faremos então este -processo. - - -Para que o arquivo seja incluído no monitoramento é necessário que ele -receba o primeiro comando *add*. Isso marca a entrada dele no projeto -como um arquivo que a partir de então será versionado. O *status* agora -não indica mais que ele está *untracked* mas sim que existem mudanças -para serem registradas (*changes to be commited*). A melhor tradução de -*commit*, pensando no seu uso em Git, é **fechar sob segurança**. Quando -um *commit* é feito, cria-se um instante na linha do tempo que salva o -estado do projeto. Para esse instante o projeto pode ser retrocedido, -voltando o condição/conteúdo de todos os arquivos para o momento no qual -o mencionado *commit* foi feito. Você pode voltar para um *commit* de -semanas e até anos atrás. - -O controle de versão não é apenas voltar os arquivos para o conteúdo que -eles tinham no passado. Arquivos rastreados que foram deletados ou -renomeados são recuperados. Até mesmo as permissões de -leitura/escrita/execussão dos arquivos são comtempladas no -versionamento. - - -```bash -## O primeiro `add` submete o arquivo ao versionamento. -git add README.txt -git status -``` - -``` -## On branch master -## -## Initial commit -## -## Changes to be committed: -## (use "git rm --cached <file>..." to unstage) -## -## new file: README.txt -``` - -O arquivo `README.txt` já é visto pelo Git como um arquivo com o qual -ele deve se "preocupar", pois está sob versionamento. Vamos agora fazer -um registro definitivo sobre o estado desse arquivo (*commit*). É de -fundamental importância que a mensagem de notificação, ou mensagem de -*commit*, reflita as moficações feitas. São as mensagens que serão -consultadas quando você precisar desfazer/voltar. Ela deve ser curta (<= -72 caracteres) e ao mesmo tempo informativa. A minha primeira mensagem -não será, todavia. - - -Boas Práticas de commit: - -- Verbo no indicativo -- Frases curtas -- Dizer o que fez e não como fez - -Péssimas Práticas de commit: - -"BLABLABLABLA" -"Trabalhei muito hoje" -"Terminando este trabalho na madruga" - - -```bash -## Registro de versão. -git commit -m "Cria arquivo com título." -``` - -``` -## [master (root-commit) 7d5ce41] Cria arquivo com título. -## 1 file changed, 1 insertion(+) -## create mode 100644 README.txt -``` - - -O retorno da instrução de *commit* indica o número de arquivos incluídos -no *commit* e o número de inserções e deleções de linhas. O mais -importante está na primeira linha que informa o ramo de trabalho atual -(*branch*) e o *sha1* do *commit*. O *sha1* é uma sequência hexadecimal -de 40 digitos que representa unicamente o *commit*, então são $16^40$ -possibilidades!. É por meio do *sha1* que podemos retroceder o -projeto. São mostrados apenas os 7 primeiros digitos porque são -suficientes para diferenciar *commits* dentro até mesmo de projetos -moderados ou grandes - - - -# Aperfeiçoando - -Vamos criar mais arquivos e acrescentar conteúdo ao já rastreado pelo -Git para percebermos o funcionamento. Escrever uma lista de razões para -usar o Linux. Deixei a lista curta poder ampliar no futuro e com erros -de português para corrigir depois. - - - -```bash -## Adiciona mais linhas ao README.txt -echo " -A filosofia do Linux é 'Ria na face do perigo'. -Ôpa. Errado. 'Faça você mesmo'. É, é essa. - -- Lunus Torvalds" >> README.txt - -## Cria uma lista de pontos sobre o porquê de usar o Linux. -echo "Por que usar o Linux? - -* É livre -* É seguro -* É customizavel" > porqueLinux.txt -``` - - -```bash -## Mostra o conteúdo do arquivo. -less README.txt -``` - -``` -## Meu primeiro repositório Git -## -## A filosofia do Linux é 'Ria na face do perigo'. -## Ôpa. Errado. 'Faça você mesmo'. É, é essa. -## -- Lunus Torvalds -``` - -```bash -## Mostra o conteúdo do arquivo. -less porqueLinux.txt -``` - -``` -## Por que usar o Linux? -## -## * É livre -## * É seguro -## * É customizavel -``` - -E o que o Git "acha" de tudo isso? O comando *status* é o mais usado do -Git, principalmente nas etapas de aprendizado. Uma característica -diferente do Git, se comparado a outras aplicações de uso por terminal, -é que ele é realmente camarada. Nas mensagens de *output*, o Gitque -informa o que aconteceu e também dá sugestões do que fazer. - - -```bash -git status -``` - -``` -## On branch master -## Changes not staged for commit: -## (use "git add <file>..." to update what will be committed) -## (use "git checkout -- <file>..." to discard changes in working directory) -## -## modified: README.txt -## -## Untracked files: -## (use "git add <file>..." to include in what will be committed) -## -## porqueLinux.txt -## -## no changes added to commit (use "git add" and/or "git commit -a") -``` - -O Git retornou dois campos. No primeiro ele diz que existem mudanças no -`README.txt` não encaminhadas para receber registro (*not staged for -commit*) e no segundo ele aponta que o `porqueLinux.txt` é um arquivo -não rastreado (fora de monitoramento). - -Vamos explorar um pouco mais os recursos do Git antes de adicionar as -recentes mudanças. Até o momento, temos apenas um *commit* feito. Para -acessar o histórico de registros usamos `git log`. O histórico mostra o -*sha1*, o autor, data e mensagem de *commit*. Uma saída mais enxuta é -obtida com `git log --oneline`, útil quando o histórico é longo. É -possível fazer restrição no `git log`, como mostrar os *commits* a -partir de certa data, certo intervalo de datas, para um único autor ou -único arquivo. Visite: [git-log][]. - - -```bash -## Mostra o histórico de commits. -git log -``` - -``` -## commit 7d5ce4170045be9bb241a1261b641a94012ef12d -## Author: gabriel sartori <gabrielsartori2008@hotmail.com> -## Date: Sat Nov 14 19:51:43 2015 -0200 -## -## Cria arquivo com título. -``` - -O comando *diff* mostra as diferenças no conteúdo dos -arquivos/diretório. No caso, apenas o `README.txt` está sendo rastreado, -por isso o *output* indica a adição (`+`) de novas linhas. Na saída -tem-se os *sha1* das versões comparadas e o intervalo de linhas -envolvido na porção modificada (`@@`). Visite: [git-diffs][]. - - -```bash -## Diferença nos arquivos versionados. +## Comandos De Verificação git diff ``` @@ -398,7 +147,7 @@ criação do arquivo com contúdo, já são separadas para receber registro ## Adiciona o arquivo ao processo de reastreamento. git add porqueLinux.txt git status -``` +ref log ``` ## On branch master @@ -421,7 +170,7 @@ git commit -m "Lista de inicial de o porquê usar o Linux." ``` ``` -## [master 2785f3e] Lista de inicial de o porquê usar o Linux. +## [master 448b201] Lista de inicial de o porquê usar o Linux. ## 1 file changed, 5 insertions(+) ## create mode 100644 porqueLinux.txt ``` @@ -473,7 +222,7 @@ git commit -m "Adiciona frase do Linux Torvalds." ``` ``` -## [master 53fa265] Adiciona frase do Linux Torvalds. +## [master 41a3225] Adiciona frase do Linux Torvalds. ## 1 file changed, 4 insertions(+) ``` @@ -487,9 +236,9 @@ git log --oneline ``` ``` -## 53fa265 Adiciona frase do Linux Torvalds. -## 2785f3e Lista de inicial de o porquê usar o Linux. -## 7d5ce41 Cria arquivo com título. +## 41a3225 Adiciona frase do Linux Torvalds. +## 448b201 Lista de inicial de o porquê usar o Linux. +## ffc1d12 Cria arquivo com título. ``` Por meio dos *sha1*, podemos aplicar o *diff* para visitarmos as @@ -787,9 +536,9 @@ git reflog ``` ``` -## 53fa265 HEAD@{0}: commit: Adiciona frase do Linux Torvalds. -## 2785f3e HEAD@{1}: commit: Lista de inicial de o porquê usar o Linux. -## 7d5ce41 HEAD@{2}: commit (initial): Cria arquivo com título. +## 41a3225 HEAD@{0}: commit: Adiciona frase do Linux Torvalds. +## 448b201 HEAD@{1}: commit: Lista de inicial de o porquê usar o Linux. +## ffc1d12 HEAD@{2}: commit (initial): Cria arquivo com título. ``` @@ -800,7 +549,7 @@ git commit -m "Novos argumentos." ``` ``` -## [master c48f96c] Novos argumentos. +## [master a2c3f0d] Novos argumentos. ## 1 file changed, 4 insertions(+), 1 deletion(-) ``` @@ -815,34 +564,1161 @@ git blame README.txt ``` ``` -## ^7d5ce41 (gabriel sartori 2015-11-14 19:51:43 -0200 1) Meu primeiro repositório Git -## 53fa265e (gabriel sartori 2015-11-14 19:51:44 -0200 2) -## 53fa265e (gabriel sartori 2015-11-14 19:51:44 -0200 3) A filosofia do Linux é 'Ria na face do perigo'. -## 53fa265e (gabriel sartori 2015-11-14 19:51:44 -0200 4) Ôpa. Errado. 'Faça você mesmo'. É, é essa. -## 53fa265e (gabriel sartori 2015-11-14 19:51:44 -0200 5) -- Lunus Torvalds +## ^ffc1d12 (gabriel sartori 2015-11-24 14:31:29 -0200 1) Meu primeiro repositório Git +## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 2) +## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 3) A filosofia do Linux é 'Ria na face do perigo'. +## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 4) Ôpa. Errado. 'Faça você mesmo'. É, é essa. +## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 5) -- Lunus Torvalds +``` + + +## Fazendo cópias e trabalhando com ramos + +Existem várias formas de se trabalham com ramos. Geralmente os ramos são +feitos sob demandas para adicionar uma característica ao projeto +(*feature*) ou corrigir um *bug*. Alguns ramos, por outro lado, são +ramos fixos destinados a receber o desenvolvimento dos ramos de +demanda. Esses ramos são geralmente chamados de *devel* (*development*) +e *release*. O ramo *master* é o default e em geral, para projetos +grandes, o *master* só recebe versões funcionais do projeito, livre de +bugs. + +Para criar um ramo, usandos `git branch` seguido do nome que se +deseja. Vamos criar um ramo para adicionar mais arquivos ou modificações +ao projeto. + + +```bash +## Lista ramos (all), locais e remotos. +## git branch ## Só ramos locais +## git branch -r ## Só ramos remotos +git branch -a ## Todos os ramos. +``` + +``` +## * master +``` + + +```bash +## Cria um ramo para adição de conteúdo, novo segmento. +git branch feature01 +``` + + +```bash +## Novo ramo criado aparece. +git branch +``` + +``` +## feature01 +## * master +``` + + +```bash +## Muda o HEAD de ramo. +git checkout feature01 +``` + +``` +## Switched to branch 'feature01' +``` + + +```bash +## Situação no novo ramo. +git status +``` + +``` +## On branch feature01 +## nothing to commit, working directory clean +``` + + +```bash +## Histórico de commits. +git log --oneline +``` + +``` +## a2c3f0d Novos argumentos. +## 41a3225 Adiciona frase do Linux Torvalds. +## 448b201 Lista de inicial de o porquê usar o Linux. +## ffc1d12 Cria arquivo com título. +``` + +Veja que o novo ramo não começa no zero ou vazio (sem arquivos) e sim a +partir do ramo que é seu ancestral, ou seja, ele começa a partir do +último *commit* existente, por padrão. Vamos adicionar um arquivo e +commitar. O comando `wget` permite baixar arquivos pelo terminal. Será +baixado um arquivo com um função para calcular o fator de inflação de +variância (*vif*, variance inflation factor) usado em modelos de +regressão, disponível na página da [Professora Suely Giolo][]. + + + + +```bash +## Baixando arquivo da internet. Uma função do R. +wget 'http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R' +``` + + +``` +## --2015-11-24 14:31:30-- http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R +## Resolving people.ufpr.br (people.ufpr.br)... ???.??.???.??, 2801:82:8020:0:8377:0:100:20 +## Connecting to people.ufpr.br (people.ufpr.br)|???.??.???.??|:80... connected. +## HTTP request sent, awaiting response... 200 OK +## Length: 560 +## Saving to: ‘vif.R’ +## +## 0K 100% 44,0M=0s +## +## 2015-11-24 14:31:30 (44,0 MB/s) - ‘vif.R’ saved [560/560] +``` + + +```bash +## Situação do repositório após o download. +git status +``` + +``` +## On branch feature01 +## Untracked files: +## (use "git add <file>..." to include in what will be committed) +## +## vif.R +## +## nothing added to commit but untracked files present (use "git add" to track) +``` + + +```bash +git add vif.R +git commit -m "Adiciona função R para VIF." +``` + +``` +## [feature01 ed304f7] Adiciona função R para VIF. +## 1 file changed, 20 insertions(+) +## create mode 100644 vif.R +``` + + +```bash +## Estrutura do diretório. +tree +``` + +``` +## . +## ├── porqueLinux.txt +## ├── README.txt +## └── vif.R +## +## 0 directories, 3 files +``` + + +```bash +## Histórico de commits. +git reflog +``` + +``` +## ed304f7 HEAD@{0}: commit: Adiciona função R para VIF. +## a2c3f0d HEAD@{1}: checkout: moving from master to feature01 +## a2c3f0d HEAD@{2}: commit: Novos argumentos. +## 41a3225 HEAD@{3}: commit: Adiciona frase do Linux Torvalds. +## 448b201 HEAD@{4}: commit: Lista de inicial de o porquê usar o Linux. +## ffc1d12 HEAD@{5}: commit (initial): Cria arquivo com título. +``` + + +```bash +git status +``` + +``` +## On branch feature01 +## nothing to commit, working directory clean +``` + +Então acabamos de acrescentar um novo aquivo ao projeto. Agora que as +modificações foram salvas (*commit* feito) podemos trocar de ramo. Você +vai ver que ao voltarmos para o ramo *master* o arquivo baixado da +internet vai "desaparecer". + + +```bash +## Volta para o ramo master. +git checkout master ``` +``` +## Switched to branch 'master' +``` +```bash +## Estrutura do diretório. +tree +``` -## Back to Past (Imagem de Volta para o Futuro) +``` +## . +## ├── porqueLinux.txt +## └── README.txt +## +## 0 directories, 2 files +``` -git checkout -git mv *Não é bem assim -git reset +O arquivo `vif.R` não sumiu. Ele está no ramo `feature01` e só passará +para o ramo master quando mesclarmos o que existe no `feature01` ao +`master`. Então é assim: mudou de ramo, muda o conteúdo do +diretório. Fazer isso é bem simples, basta dar um `git merge`. Antes +vamos aprender como saber as diferenças que existem entre ramos. -## Ramificações -Master -Branch +```bash +## Mostra todas as modificações, cada linha modificada de cada arquivo. +git diff master feature01 +``` -## Complementos -git blame -git show -git rm -git ls-files +``` +## diff --git a/vif.R b/vif.R +## new file mode 100644 +## index 0000000..a114969 +## --- /dev/null +## +++ b/vif.R +## @@ -0,0 +1,20 @@ +## +vif<-function (obj, digits = 5) { +## + Qr <- obj$qr +## + if (is.null(obj$terms) || is.null(Qr)) +## + stop("invalid 'lm' object: no terms or qr component") +## + tt <- terms(obj) +## + hasintercept <- attr(tt, "intercept") > 0 +## + p <- Qr$rank +## + if (hasintercept) +## + p1 <- 2:p +## + else p1 <- 1:p +## + R <- Qr$qr[p1, p1, drop = FALSE] +## + if (length(p1) > 1) +## + R[row(R) > col(R)] <- 0 +## + Rinv <- qr.solve(R) +## + vv <- apply(Rinv, 1, function(x) sum(x^2)) +## + ss <- apply(R, 2, function(x) sum(x^2)) +## + vif <- ss * vv +## + signif(vif, digits) +## + } +## + +``` + + +```bash +## Mostra só os arquivos modificados. +git diff --name-only master feature01 +``` + +``` +## vif.R +``` + +Como você já havia antecipado, a única diferença entre os ramos `master` +e `feature01` é o arquivo `vif.R`. Agora é só pedir o `git merge`. + + +```bash +## Mesclando as modificações em feature01 no master. +git merge feature01 master +``` + +``` +## Updating a2c3f0d..ed304f7 +## Fast-forward +## vif.R | 20 ++++++++++++++++++++ +## 1 file changed, 20 insertions(+) +## create mode 100644 vif.R +``` + + +```bash +git log --oneline +``` + +``` +## ed304f7 Adiciona função R para VIF. +## a2c3f0d Novos argumentos. +## 41a3225 Adiciona frase do Linux Torvalds. +## 448b201 Lista de inicial de o porquê usar o Linux. +## ffc1d12 Cria arquivo com título. +``` + +É possível criar um ramo a partir de um *commit* ancestral ao atual. Isso +é extremamente útil para resolver os bugs. Vamos fazer um segundo ramo a +partir do *commit* anterior a inclusão do arquivo R. + + +```bash +## Referencias aos commits. +git reflog +``` + +``` +## ed304f7 HEAD@{0}: merge feature01: Fast-forward +## a2c3f0d HEAD@{1}: checkout: moving from feature01 to master +## ed304f7 HEAD@{2}: commit: Adiciona função R para VIF. +## a2c3f0d HEAD@{3}: checkout: moving from master to feature01 +## a2c3f0d HEAD@{4}: commit: Novos argumentos. +## 41a3225 HEAD@{5}: commit: Adiciona frase do Linux Torvalds. +## 448b201 HEAD@{6}: commit: Lista de inicial de o porquê usar o Linux. +## ffc1d12 HEAD@{7}: commit (initial): Cria arquivo com título. +``` + + +```bash +## Volta para antes do arquivo de baixar o vif.R. +git checkout HEAD@{4} +``` + +``` +## Note: checking out 'HEAD@{4}'. +## +## You are in 'detached HEAD' state. You can look around, make experimental +## changes and commit them, and you can discard any commits you make in this +## state without impacting any branches by performing another checkout. +## +## If you want to create a new branch to retain commits you create, you may +## do so (now or later) by using -b with the checkout command again. Example: +## +## git checkout -b new_branch_name +## +## HEAD is now at a2c3f0d... Novos argumentos. +``` + + +```bash +## Qual a situação. +git status +``` + +``` +## HEAD detached at a2c3f0d +## nothing to commit, working directory clean +``` + + +```bash +## O histório existente nesse ponto. +git log --name-only --oneline +``` + +``` +## a2c3f0d Novos argumentos. +## porqueLinux.txt +## 41a3225 Adiciona frase do Linux Torvalds. +## README.txt +## 448b201 Lista de inicial de o porquê usar o Linux. +## porqueLinux.txt +## ffc1d12 Cria arquivo com título. +## README.txt +``` + +Já que o *commit* mais recente dessa história aponta para o arquivo +compras, vamos checar o seu conteúdo apenas por medida de segurança. + + +```bash +## Mostra o conteúdo do arquivo. +less porqueLinux.txt +``` + +``` +## Por que usar o Linux? +## +## * É livre +## * É seguro +## * É customizável +## * Tem repositórios de software +## * Atualização constante +## * Desempenho +``` + +Dito e feito! Voltamos no tempo para o instante logo após o *commit* que +incluí novos itens na lista. Podemos voltar para o presente se +estivermos satisfeitos com o passeio mas também podemos criar um ramo +aqui, caso isso seja necessário. Primeiro vamos voltar para o presente +depois mostramos como criar o ramo. + + +```bash +## Mostra onde estamos. +git branch +``` + +``` +## * (detached from a2c3f0d) +## feature01 +## master +``` + +Se não fizemos nenhuma modificação, voltar é bem simples. Se +modificações foram feitas é necessário saber se precisam ser mantidas e +onde ou se devem ser descartadas. + + +```bash +## Volta para o presente. +git checkout master +``` + +``` +## Previous HEAD position was a2c3f0d... Novos argumentos. +## Switched to branch 'master' +``` + + +```bash +git status +``` + +``` +## On branch master +## nothing to commit, working directory clean +``` + + +```bash +git log --oneline +``` + +``` +## ed304f7 Adiciona função R para VIF. +## a2c3f0d Novos argumentos. +## 41a3225 Adiciona frase do Linux Torvalds. +## 448b201 Lista de inicial de o porquê usar o Linux. +## ffc1d12 Cria arquivo com título. +``` + + +```bash +## Fenda no tempo fechada. Sem sinal do detached HEAD. +git branch +``` + +``` +## feature01 +## * master +``` + + +```bash +## Sinal do passeio no tempo. +git reflog +``` + +``` +## ed304f7 HEAD@{0}: checkout: moving from a2c3f0d2a344bf7c680ec67982efca4f5cdf164c to master +## a2c3f0d HEAD@{1}: checkout: moving from master to HEAD@{4} +## ed304f7 HEAD@{2}: merge feature01: Fast-forward +## a2c3f0d HEAD@{3}: checkout: moving from feature01 to master +## ed304f7 HEAD@{4}: commit: Adiciona função R para VIF. +## a2c3f0d HEAD@{5}: checkout: moving from master to feature01 +## a2c3f0d HEAD@{6}: commit: Novos argumentos. +## 41a3225 HEAD@{7}: commit: Adiciona frase do Linux Torvalds. +## 448b201 HEAD@{8}: commit: Lista de inicial de o porquê usar o Linux. +## ffc1d12 HEAD@{9}: commit (initial): Cria arquivo com título. +``` + +Vamos começar a ser ousados. Vamos voltar no passado, adicionar um +arquivo, commitar e ver o que acontece, como o histórico é representado. + + +```bash +## Volta no tempo, após commit que aumenta porqueLinux.txt. +git checkout HEAD@{6} +``` + +``` +## Note: checking out 'HEAD@{6}'. +## +## You are in 'detached HEAD' state. You can look around, make experimental +## changes and commit them, and you can discard any commits you make in this +## state without impacting any branches by performing another checkout. +## +## If you want to create a new branch to retain commits you create, you may +## do so (now or later) by using -b with the checkout command again. Example: +## +## git checkout -b new_branch_name +## +## HEAD is now at a2c3f0d... Novos argumentos. +``` + + + + +```bash +## Baixa arquivo de dados da internet. +wget 'http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt' +``` + + +``` +## --(date +"%Y-%m-%d %H:%M:%S")-- http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt +## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? +## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. +## HTTP request sent, awaiting response... 200 OK +## Length: 217 [text/plain] +## Saving to: ‘pimentel_racoes.txt’ +## +## 0K 100% 68,9M=0s +## +## (date +"%Y-%m-%d %H:%M:%S") (68,9 MB/s) - ‘pimentel_racoes.txt’ saved [217/217] +## +## ‘pimentel_racoes.txt’ -> ‘../meu1repo/pimentel_racoes.txt’ +``` + + +```bash +git status +``` + +``` +## HEAD detached at a2c3f0d +## Untracked files: +## (use "git add <file>..." to include in what will be committed) +## +## pimentel_racoes.txt +## +## nothing added to commit but untracked files present (use "git add" to track) +``` + + +```bash +## Adiciona para registrar a inclusão do arquivo. +git add pimentel_racoes.txt +git commit -m "Adiciona aquivo de dados de experimento com rações." +``` + +``` +## [detached HEAD 344674a] Adiciona aquivo de dados de experimento com rações. +## 1 file changed, 24 insertions(+) +## create mode 100644 pimentel_racoes.txt +``` + + +```bash +git status +``` + +``` +## HEAD detached from a2c3f0d +## nothing to commit, working directory clean +``` + + +```bash +## Log num formato gráfico ASCII para mostrar o novo ramo. +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 344674a (HEAD) Adiciona aquivo de dados de experimento com rações. +## | * ed304f7 (master, feature01) Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + +No nosso projeto temos o *master* e o *feature01* em igual condição, sem +nenhuma diferença. O *commit* recém feito indica um novo seguimento a +partir daquele onde adicionamos novos itens na lista. Vamos criar um +novo ramo porque atualmente estamos em um ramos suspenso (*detached +HEAD*) que não é persistênte. + + +```bash +git branch +``` + +``` +## * (detached from a2c3f0d) +## feature01 +## master +``` + + +```bash +## Um novo ramo a partir do atual HEAD. +git checkout -b feature02 +``` + +``` +## Switched to a new branch 'feature02' +``` + + +```bash +git branch +``` + +``` +## feature01 +## * feature02 +## master +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 344674a (HEAD, feature02) Adiciona aquivo de dados de experimento com rações. +## | * ed304f7 (master, feature01) Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + +Vamos explorar bem a funcionalidade. Vamos voltar para o `feature01` e +criar mais coisas lá. Você já deve estar pensando que tudo isso é +absurdo e jamais alguém firaria indo e voltando assim. Você está certo, +porém, quando o projeto envolve mais pessoas, cerrtamente as coisas irão +bifurcar em algum ponto. + + +```bash +git checkout feature01 +``` + +``` +## Switched to branch 'feature01' +``` + + +``` +## Diretório existe. +## Arquivo brasilCopa2014.txt já existe. +## ‘brasilCopa2014.txt’ -> ‘../meu1repo/brasilCopa2014.txt’ +``` + + +```bash +wget 'http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt' +``` + + +``` +## --2015-11-24 14:31:31-- http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt +## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? +## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. +## HTTP request sent, awaiting response... 200 OK +## Length: 1254 (1,2K) [text/plain] +## Saving to: ‘brasilCopa2014.txt’ +## +## 0K . 100% 69,6M=0s +## +## 2015-11-24 14:31:31 (69,6 MB/s) - ‘brasilCopa2014.txt’ saved [1254/1254] +``` + + +```bash +git add brasilCopa2014.txt +git commit -m "Arquivo sobre copa 2014 celeção brasileira." +``` + +``` +## [feature01 78a7842] Arquivo sobre copa 2014 celeção brasileira. +## 1 file changed, 22 insertions(+) +## create mode 100644 brasilCopa2014.txt +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 78a7842 (HEAD, feature01) Arquivo sobre copa 2014 celeção brasileira. +## * ed304f7 (master) Adiciona função R para VIF. +## | * 344674a (feature02) Adiciona aquivo de dados de experimento com rações. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + +Agora nos temos o *feature01* na frente do master e o *feature02* ao +lado. O conteúdo dos dois ramos terá que ser incorporado ao *master* em +algum momento porque é assim que funciona. Mas não há razões para +preocupação pois o propósito do Git é justamente facilitar esse +processo. Nesse caso, por exemplo, como as diferenças nos ramos consiste +na adição de arquivos diferentes, incorporar as modificações no *master* +será uma tarefa simples para o Git. O agravante é quando em dois ramos +(ou duas pessoas) o mesmo arquivo é modificado no mesmo intervalo de +linhas. Nessa situação o *merge* nos arquivos deve ser supervisionado e +não automático. Vamos incorporar as modificações dos ramos ao master +então. + + +```bash +## Volta para o master. +git checkout master +``` + +``` +## Switched to branch 'master' +``` + + +```bash +## Mescla o feature01. +git merge feature01 master +``` + +``` +## Updating ed304f7..78a7842 +## Fast-forward +## brasilCopa2014.txt | 22 ++++++++++++++++++++++ +## 1 file changed, 22 insertions(+) +## create mode 100644 brasilCopa2014.txt +``` + + +```bash +## Mescla o feature02. +git merge feature02 master +``` + +``` +## Merge made by the 'recursive' strategy. +## pimentel_racoes.txt | 24 ++++++++++++++++++++++++ +## 1 file changed, 24 insertions(+) +## create mode 100644 pimentel_racoes.txt +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 0bac2be (HEAD, master) Merge branch 'feature02' +## |\ +## | * 344674a (feature02) Adiciona aquivo de dados de experimento com rações. +## * | 78a7842 (feature01) Arquivo sobre copa 2014 celeção brasileira. +## * | ed304f7 Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + + +```bash +tree +``` + +``` +## . +## ├── brasilCopa2014.txt +## ├── pimentel_racoes.txt +## ├── porqueLinux.txt +## ├── README.txt +## └── vif.R +## +## 0 directories, 5 files +``` + +**** +## Resolvendo conflitos + +Agora vamos de propósito mostrar uma situação em que não é possível +fazer o merge automaticamente. Vamos criar um conflito. Para isso vou +criar um ramo novo, modificar o arquivo na última linha e commitar. Vou +voltar par ao *master* e fazer o mesmo mas vou usar um texto diferente +para incluir no arquivo. Já que os ramos *feature01* e *feature02* não +são mais necessários, podemos removê-los. No entanto, eles permanecem na +história do projeto e poder resurgir se você voltar no tempo. + + +```bash +## Remove ramos. +git branch -d feature01 +git branch -d feature02 +git branch +``` + +``` +## Deleted branch feature01 (was 78a7842). +## Deleted branch feature02 (was 344674a). +## * master +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 0bac2be (HEAD, master) Merge branch 'feature02' +## |\ +## | * 344674a Adiciona aquivo de dados de experimento com rações. +## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. +## * | ed304f7 Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + +Agora vou criar um novo ramo, adicionar um arquivo e encurtar o nome das +colunas no cabeçalho. + + +```bash +## Muda para um ramo criado na hora. +git checkout -b feature03 +``` + +``` +## Switched to a new branch 'feature03' +``` + + + + +```bash +## Baixa o arquivo. +wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' +``` + + +``` +## --2015-11-24 14:31:31-- http://www.leg.ufpr.br/~walmes/data/bib1.txt +## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? +## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. +## HTTP request sent, awaiting response... 200 OK +## Length: 535 [text/plain] +## Saving to: ‘bib1.txt’ +## +## 0K 100% 35,0M=0s +## +## 2015-11-24 14:31:31 (35,0 MB/s) - ‘bib1.txt’ saved [535/535] +``` + + +```bash +## Mostra as 4 primeiras linhas. +head -4 bib1.txt +``` + +``` +## repetição variedade bloco y +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +``` + +Ao encurtar o nome para quatro dígitos, fica assim. + + +```bash +## Substitui o conteúdo da primeira linha pelos nomes truncados em 4 +## dígidos e separados por tabulação. Etapa que você pode fazer no seu +## editor de texto. +sed -i "1s/.*/rept\tvari\tbloc\ty/" bib1.txt +head -4 bib1.txt +``` + +``` +## rept vari bloc y +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +``` + + +```bash +git add bib1.txt +git commit -m "Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos." +``` + +``` +## [feature03 ef648bb] Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. +## 1 file changed, 58 insertions(+) +## create mode 100644 bib1.txt +``` + +Baixamos e modificamos o arquivo. Adicionamos e fizemos o registro das +modificações. Agora vamos voltar ao *master* e baixar o arquivo também, +fazendo de conta que é outra pessoa trabalhando no mesmo projeto, mas +essa pessoa vai passar a cabeçalho para caixa alta. + + +```bash +git checkout master +``` + +``` +## Switched to branch 'master' +``` + + + + +```bash +## Baixa o arquivo. +wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' +``` + +Ao encurtar o nome para quatro dígitos, fica assim. + + +```bash +## Substitui o conteúdo da primeira linha pelo mesmo em caixa alta. Faça +## isso no seu editor de texto de preferido. +sed -i '1s/.*/\U&/' bib1.txt +head -4 bib1.txt +``` + +``` +## REPETIÇÃO VARIEDADE BLOCO Y +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +``` + + +```bash +git add bib1.txt +git commit -m "Arquivo de experimento em BIB. Cabeçalho em caixa alta." +``` + +``` +## [master 87e8601] Arquivo de experimento em BIB. Cabeçalho em caixa alta. +## 1 file changed, 58 insertions(+) +## create mode 100644 bib1.txt +``` + + +```bash +git diff master feature03 +``` + +``` +## diff --git a/bib1.txt b/bib1.txt +## index a8dfaa6..b5f5963 100644 +## --- a/bib1.txt +## +++ b/bib1.txt +## @@ -1,4 +1,4 @@ +## -REPETIÇÃO VARIEDADE BLOCO Y +## +rept vari bloc y +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * ef648bb (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. +## | * 87e8601 (HEAD, master) Arquivo de experimento em BIB. Cabeçalho em caixa alta. +## |/ +## * 0bac2be Merge branch 'feature02' +## |\ +## | * 344674a Adiciona aquivo de dados de experimento com rações. +## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. +## * | ed304f7 Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + + +```bash +## Dá mensagem de erro que informa o conflito. +git merge feature03 master +``` + + +``` +## Auto-merging bib1.txt +## CONFLICT (add/add): Merge conflict in bib1.txt +## Automatic merge failed; fix conflicts and then commit the result. +``` + + +```bash +git status +``` + +``` +## On branch master +## You have unmerged paths. +## (fix conflicts and run "git commit") +## +## Unmerged paths: +## (use "git add <file>..." to mark resolution) +## +## both added: bib1.txt +## +## no changes added to commit (use "git add" and/or "git commit -a") +``` + + +```bash +## `less` printa o conteúdo do arquivo mas `head` limita para 10 linhas. +less bib1.txt | head -10 +``` + +``` +## <<<<<<< HEAD +## REPETIÇÃO VARIEDADE BLOCO Y +## ======= +## rept vari bloc y +## >>>>>>> feature03 +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +## 1 4 2 16 +## 1 5 3 14 +``` + +Então deu conflito e o Git informa que ele deve ser resolvido. Resolver +o conflito aqui significa abrir os arquivos com problema listados no git +status e editar de tal forma a desconflitar. Nas regiões de conflito o +Git sinaliza de forma especial, indicando por divisórias (`<<<<<<<`, +`=======` e `>>>>>>>`) as versões no HEAD (ramo *master*) e no ramos a +ser incorporado (*feature03*). Então vamos resolver o conflito sem +favorecer ninguém, ou seja, vamos encurtar para 4 digitos e manter caixa +alta. Dessa forma o aquivo fica assim. + + + + +```bash +## Arquivo depois da edição que resolve o conflito. +head -6 bib1.txt +``` + +``` +## REPT VARI BLOC Y +## 1 1 1 20 +## 1 2 1 18 +## 1 3 2 15 +## 1 4 2 16 +## 1 5 3 14 +``` + + +```bash +git status +``` + +``` +## On branch master +## You have unmerged paths. +## (fix conflicts and run "git commit") +## +## Unmerged paths: +## (use "git add <file>..." to mark resolution) +## +## both added: bib1.txt +## +## no changes added to commit (use "git add" and/or "git commit -a") +``` + + +```bash +git add bib1.txt +git commit -m "Resolve conflito, trunca com caixa alta." +``` + +``` +## [master 52b1f76] Resolve conflito, trunca com caixa alta. +``` + + +```bash +git status +``` + +``` +## On branch master +## nothing to commit, working directory clean +``` + + +```bash +git log --graph --oneline --decorate --date=relative --all +``` + +``` +## * 52b1f76 (HEAD, master) Resolve conflito, trunca com caixa alta. +## |\ +## | * ef648bb (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. +## * | 87e8601 Arquivo de experimento em BIB. Cabeçalho em caixa alta. +## |/ +## * 0bac2be Merge branch 'feature02' +## |\ +## | * 344674a Adiciona aquivo de dados de experimento com rações. +## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. +## * | ed304f7 Adiciona função R para VIF. +## |/ +## * a2c3f0d Novos argumentos. +## * 41a3225 Adiciona frase do Linux Torvalds. +## * 448b201 Lista de inicial de o porquê usar o Linux. +## * ffc1d12 Cria arquivo com título. +``` + + +```bash +git reflog +``` + +``` +## 52b1f76 HEAD@{0}: commit (merge): Resolve conflito, trunca com caixa alta. +## 87e8601 HEAD@{1}: commit: Arquivo de experimento em BIB. Cabeçalho em caixa alta. +## 0bac2be HEAD@{2}: checkout: moving from feature03 to master +## ef648bb HEAD@{3}: commit: Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. +## 0bac2be HEAD@{4}: checkout: moving from master to feature03 +## 0bac2be HEAD@{5}: merge feature02: Merge made by the 'recursive' strategy. +## 78a7842 HEAD@{6}: merge feature01: Fast-forward +## ed304f7 HEAD@{7}: checkout: moving from feature01 to master +## 78a7842 HEAD@{8}: commit: Arquivo sobre copa 2014 celeção brasileira. +## ed304f7 HEAD@{9}: checkout: moving from feature02 to feature01 +## 344674a HEAD@{10}: checkout: moving from 344674a37125d278b22320956316e7df2e939fdc to feature02 +## 344674a HEAD@{11}: commit: Adiciona aquivo de dados de experimento com rações. +## a2c3f0d HEAD@{12}: checkout: moving from master to HEAD@{6} +## ed304f7 HEAD@{13}: checkout: moving from a2c3f0d2a344bf7c680ec67982efca4f5cdf164c to master +## a2c3f0d HEAD@{14}: checkout: moving from master to HEAD@{4} +## ed304f7 HEAD@{15}: merge feature01: Fast-forward +## a2c3f0d HEAD@{16}: checkout: moving from feature01 to master +## ed304f7 HEAD@{17}: commit: Adiciona função R para VIF. +## a2c3f0d HEAD@{18}: checkout: moving from master to feature01 +## a2c3f0d HEAD@{19}: commit: Novos argumentos. +## 41a3225 HEAD@{20}: commit: Adiciona frase do Linux Torvalds. +## 448b201 HEAD@{21}: commit: Lista de inicial de o porquê usar o Linux. +## ffc1d12 HEAD@{22}: commit (initial): Cria arquivo com título. +``` -## Ajuda -Git help diff --git a/images/git_workflow.png b/images/git_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe2368e015b69c6194128cfb03f212e2d349738 Binary files /dev/null and b/images/git_workflow.png differ