From 2e5e2768128d4907a286e939ff873799defa8b78 Mon Sep 17 00:00:00 2001 From: Walmes Zeviani <walmes@ufpr.br> Date: Thu, 17 Dec 2015 10:07:10 -0200 Subject: [PATCH] Remove os arquivos iniciais git_tuto*. --- git_tuto.Rmd | 2166 -------------------------------- git_tuto.md | 3381 -------------------------------------------------- 2 files changed, 5547 deletions(-) delete mode 100644 git_tuto.Rmd delete mode 100644 git_tuto.md diff --git a/git_tuto.Rmd b/git_tuto.Rmd deleted file mode 100644 index d9cad9a..0000000 --- a/git_tuto.Rmd +++ /dev/null @@ -1,2166 +0,0 @@ ---- -title: "Tutorial de Git" -author: "PET EstatÃstica UFPR" -output: - html_document: - highlight: pygments - keep_md: yes - theme: flatly - toc: yes - pdf_document: - toc: yes ---- - -```{r, include=FALSE} -library(knitr) -opts_chunk$set(comment=NA) -``` - -<!-- -## Processar com: -render git_tuto.Rmd -rm -rf meu1repo/ && rm -rf ~/maquina2/meu1repo/ && render git_tuto.Rmd - -TODO - * Remover o downloads. Fazer uma vez para uma pasta /Downloads e só - copiar de lá. Manter o comandos com wget porque assim outras pessoas - podem reproduzir. - * Aprender o que fazer para não precisar dar cd meu1repo em todos os - chunks. - -TODO Materiais a serem lidos -* http://www.atualsistemas.net/dev/Manual_Git.PDF -* http://www.dcc.fc.up.pt/~pbv/aulas/labprog/slides/gitprimer.pdf - -## Wiki de um tutorial completo do Conselho Nacional de Justiça. -http://www.cnj.jus.br/wikipje/index.php/GIT - -## Slides com muitas ilustrações. -http://wiki.softwarelivre.org/pub/Blogs/BlogPostAntonioTerceiro20081108115324/curso-vcs.pdf - -## Compara serviços de versionamento -http://www.ufjf.br/getcomp/files/2013/03/An%C3%A1lise-Comparativa-entre-Sistemas-de-Controle-de-Vers%C3%B5es-Daniel-Tannure-Menandro-de-Freitas.pdf - -## Aproveita-se no glossario e cheat sheet -http://www.ceuma.br/nucleodeti/wp-content/uploads/2013/12/Git_v0.1.2.pdf ---> - -<img src="https://git-scm.com/images/logos/downloads/Git-Icon-1788C.png" -width=200px align="right" display="block"> - -<!--==================================================================== --> - -**** -*Cheat sheets* para Git - - * [Tobias Günther](http://www.git-tower.com/blog/git-cheat-sheet/); - * [GitHub git cheat sheet](https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf) - * [Chris Sevilleja](https://scotch.io/bar-talk/git-cheat-sheet) - * [Jan Krüger](http://jan-krueger.net/wordpress/wp-content/uploads/2007/09/git-cheat-sheet.pdf) - * [William Leeks](http://www.cheetyr.com/git) - * [cheat.errtheblog.com](http://cheat.errtheblog.com/s/git) - -O modelo de funcionamento do Git: - - * [patrickzahnd.ch](http://www.patrickzahnd.ch/wp-content/uploads/2014/02/git-transport-v1.pdf) - * [Andrew Petenson](http://ndpsoftware.com/git-cheatsheet.html) - -Playlists de tutoriais de Git - - * Loiane Groner - [Git e Github para iniciantes](https://www.youtube.com/watch?v=UMhskLXJuq4) - * HxTutors - [Github - Pra que serve e como usar?](https://www.youtube.com/watch?v=neDiLHwXSVo) - * Devmedia Editora - [Controle de versoes distribuido com Git](https://www.youtube.com/watch?v=1zj8ItHi_Kk) - * RBtech - [Curso básico de Git (playlist)](https://www.youtube.com/playlist?list=PLInBAd9OZCzzHBJjLFZzRl6DgUmOeG3H0) - * Luiz Venturote - [Controle de Versão com Git](https://www.youtube.com/playlist?list=PLBzQU3U8iMRndBoeUhURmQf1aLhQExbP8) - * Leandro Cavalcante [Git (playlist)](https://www.youtube.com/watch?v=GBnt3ztA6nI&list=PLXtEEPEfASEIrUZj9X_kj-dlaul59bRox) - * StudyClassOficial - [Controle de Versão com GIT](https://www.youtube.com/watch?v=Wj8EB4IAqWc) - * Israel Santos - [Controle de versão com git](https://www.youtube.com/watch?v=morEwdyzmY4) - * Giovanni Silva - [Tutorial Git (playlist)](https://www.youtube.com/playlist?list=PL3NGePwPGuvvnBO4tk---xNABmNVEpD2R) - * makigas - [Tutorial de Git en media hora](https://www.youtube.com/watch?v=QGKTdL7GG24) - * Desde Cero - [Cómo Instalar Git en Windows Desde Cero](https://www.youtube.com/watch?v=poVAyKNsk00) - -**** -## O que é o Git? - -O Git é uma ferramenta de controle de versão que facilita os projetos em equipe -a verficação do mesmo. Basicamente, o Git detecta as mudanças que ocorrem no -arquivo, bem como onde ocorreu e qual mudança foi feita. Ainda existe a -possibilidade de voltar no histórico do projeto, sempre que necessário. -Outra facilidade está na equipe trabalhar em cima do projeto ao mesmo tempo, -e no final o Git faz o trabalho de juntar todos os arquivos mostrando se há -algum conflito. Integrantes podem mandar sugestões de alterações, e cabe ao -responsável pelo projeto incorporar ou não essas alterações. - -Criado em 2005 por Linus Torvalds, também criador do Linux, o Git surgiu -a partir da necessidade de desenvolver uma ferramenta básica que pudesse -lidar com projetos grandes de maneira eficaz. Linus colocou o nome Git -em referência a si mesmo, que no inglês britânico é uma gÃria para "cabeça-dura". - -**** -## Download e instalação - -A primeira coisa a fazer é ter instalado os arquivos necessários para o -Git funcionar. Em sistemas Debian e suas variações (Ubuntu, LinuxMint, -...), os pacotes necessários podem ser instalados com comandos que, a -partir dos repositórios de cada distribuição, instalam o Git na sua -máquina. - -**Linux** - -Em uma sessão de terminal Linux de distribuições Debian (Ubuntu, Mint), -execute o código abaixo. - -```{r, engine="sh", eval=FALSE} -## Adicione o ppa para ter a versão mais recente do Git. Descomente e -## rode essas duas linhas de comando para isso. -## sudo add-apt-repository ppa:git-core/ppa -## sudo apt-get update - -sudo apt-get install git git-core git-man git-gui git-doc \ - ssh openssh-server openssh-client -git --version - -## Ferramentas complementares. -sudo apt-get install gitk meld -``` - -Usuários de Linux baseados no Arch instalam de uam forma ligeiramente -diferente. - -```{r, engine="sh", eval=FALSE} -pacman -S git openssh meld -git --version -``` - -O `ssh` e `openssh-*` são necessários para a comunicação entre sua -máquina e o servidor do GitHub ou GitLab. Iremos configurar repositórios -remotos em uma outra sessão. O Git também pode ser instalado em ou -sistemas operacionais. Visite [Installing-Git][] e siga as -instruções. Os arquivos de instalação podem ser baixados do endereço -<http://git-scm.com>. - -**Windows** - -Usuários Windows devem visitar <https://git-for-windows.github.io/>, -baixar e instalar. Essa instalação do Git traz o [**Git BASH**][] que é como -um terminal do (Li|U)nix, a [**Git GUI**][] que é uma interface para -trabalhar com Git e [**Shell Integration**][] que são ações disponÃveis no -menu aberto pelo botão direto mouse. Além disso, segundo o que consta é -que essa instalação tras também a [**Gitk**][], uma interface para navegação -no histórico. - -[Meld](http://meldmerge.org/) é um assistente de comparação de arquivos -(*file diff*). Ele é muito útil como ferramenta para resolver conflitos -de merge (*mergetool*). No entanto, não é obrigatório ter. - -**** -## Configurando perfil - -Estas configurações precisam ser feitas apenas uma vez, e servem para -determinar algumas opções globais do Git. - -Os comandos abaixo vão configurar o nome de usuário e email. Fique -tranquilo que o Git não vai te enviar email, isso é apenas informação -que ficará associada ao trabalho que você desenvolver de modo a permitir -que os colaborados/gestores do projeto identifiquem suas contribuições e -possam entrar em contato, se necessário (principalmente se você fizer -aqui de errado). Mesmo que você nunca venha a trabalhar em equipe, -apenas localmente, é importante fornecer nome e email. Se trabalhar de -duas máquinas diferentes, você pode indentificar no nome de usuário. - -```{r, engine="sh", eval=FALSE} -## Configurações do Git do Batman. -git config --global user.name "Knight Rider" -git config --global user.email "batman@justiceleague.org" - -## Configurações do Git do Superman. -git config --global user.name "Kal-El" -git config --global user.email "superman@justiceleague.org" -``` - -O `--global` dessa instrução significa que o que for definido vai valer -para todo projeto Git da máquina. É possÃvel fazer definições para cada -projeto, ou seja, não globais. Portanto, você pode trabalhar com nomes -ou emails diferentes para cada projeto. É possÃvel também criar `alias` -para algumas intruções Git. Embora elas não sejam tão longas, no uso -contÃnuo pode valer a pena. Visite: - - * [Setting up a repository][] - * [Customizing Git - Git Configuration][] - -Além disso podemos definir um editor de texto padrão para escrever as -mensagens de *commits*. Por padrão, esse editor é o `$EDITOR` do seu -shell. (Essa etapa pode ser pulada a princÃpio, como veremos mais pra -frente). Esse editor não precisa ser necessariamente o mesmo editor que -você usa para escrever [texto, código]. No meu caso uso o Emacs, mas -para essa tarefa prefiro o vim por ser um editor embutido, e que não vai -carregar uma interface gráfica desnecessariamente quando for preciso -escrever uma mensagem de *commit*. Portanto, aqui pode-se deixar espaço -para o `vim`. - -```{r, engine="sh", eval=FALSE} -git config --global core.editor vim -``` - -O Emacs também pode ser carregado embutido no terminal (sem usar o X), -usando a opção `emacs -nw` (de *no window*) na sua inicialização. - -No Linux, as informações acima passadas ficam salvas em um arquivo na -home do usuário chamado `.gitconfig`. Quando não se usa o `--global`, as -definições ficam salvas dentro do próprio do projeto. Eis o conteúdo do -arquivo de configuração do Batman. - -```{r, engine="bash", eval=FALSE} -less ~/.gitconfig -``` - -``` -[user] - name = Knight Rider - email = batman@justiceleague.org -[merge] - tool = meld -``` - -No caso dele, além de nome e email, tem que o `meld` que é a ferramenta -de merge definida como padrão. Para conseguir isso você precisa definir -como fez com os demais ([how-to-set-meld-as-git-mergetool][]). - -```{r, engine="bash", eval=FALSE} -git config --global merge.tool meld -``` - -**Avançado**: Para usuários Linux que apreciam o nÃvel de customização -que o Linux oferece (como o Batman e nós), é possÃvel configurar o -prompt do terminal para mostrar a informação do ramo, usuário, etc. Essa -informação estampada facilita um bocado, principalmente em projetos -grandes. Visite: - - * [Eranga Bandara](https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt) - * [Michael Hoffman](http://code-worrier.com/blog/git-branch-in-bash-prompt/) - -**** - -## Criar um projeto versionado - -### Instruções do Git - -Já temos o Git devidamente e com credenciais (nome e email) e -configurações aplicadas. Vamos então ver como o sistema de controle de -versão acontece. - -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="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Padrão de instruções Git. -git <instrução> <complementos ...> -``` - -Os comandos abaixo revelam tudo o Git tem, 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 - -## Ajuda resumida do Git, principais comandos com descrição. -git help -a -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Lista de todos os comandos disponÃveis. -git help -a -``` - -### Criar um diretório para o projeto Git - -Vamos criar um diretório vazio para começarmos um projeto. Também se -pode começar de um diretório que já tenha arquivos e subdiretórios. Você -pode fazer isso com seu *file manager* padrão que no Ubuntu é o -[`Nautilus`](https://wiki.gnome.org/action/show/Apps/Nautilus), no Mint -é o `Nemo`. - -**NOTA**: o desenvolvimento do Nemo é feito com Git e está disponÃvel no -GitHub: [linuxmint/nemo][]. - -Nesse tutorial, 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. Se você considera que uma ferramenta -gráfica é mais confortável ou produtiva, sinta-se à vontade para -aprendê-la e usá-la. - -```{r, engine="bash", include=FALSE} -if [ -d meu1repo ] -then - echo "Diretório existe. Então apagar pasta .git" - cd meu1repo - ls -a - if [ -d .git ] - then - echo "Já existe projeto git aqui. Apagar." - rm -rf .git/ - rm -rf * - fi -else - echo "Diretório não existe." - mkdir meu1repo -fi - -## Tudo limpo tal como precisamos. -pwd -ls -a -``` - -```{r, engine="bash", eval=FALSE} -## Cria diretório (make directory). -mkdir meu1repo - -## Entra no diretório (change directory). -cd meu1repo -``` - -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 email usados e alguns -definições adicionais, caso existam. Em caso de ainda não ter -configurado o seu Git, informe o nome e email conforme apresentado na -sessão anterior. - -```{r, engine="bash", eval=FALSE} -## Mostra as informações/definições do usuário. -git config --list -``` - -```sh -user.name=Knight Rider -user.email=batman@justiceleague.org -merge.tool=meld -``` - -Temos um diretório destinado ao projeto que será mantido sobre -versionamento, então vamos iniciar um repositório Git nele. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Inicia um repositório sob versionamento Git. -git init -``` - -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 -diretório. É por essa razão que ele é oculto. Alterar o conteúdo pode -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 conferir a sua -estrutura. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra todo conteúdo do diretório. -tree -a -``` - -**NOTA**: o `tree` é um programa instalado a parte (*third party -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][]. - -Vamos começar da maneira mais simples: criando um arquivo com uma linha -de texto apenas. Bem, vale avisar que ao longo desse tutorial, 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 eu editor de texto favorito (Emacs, Gedit, Geany, -RStudio, etc) e faça algo mais criativo. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Cria um arquivo com uma linha de conteúdo. -echo "Meu primeiro repositório Git" > README.txt - -## Lista os arquivos do diretório. -tree -``` - -O Git está "atento" a tudo que acontece nesse diretório. 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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Reconhecimento do Git sobre aquivo criado. -git status -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## O primeiro `add` submete o arquivo ao versionamento. -git add README.txt -git status -``` - -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. - -```{r, engine="bash", echo=-c(1:4)} -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." -``` - -**NOTA**: Sobre mensagens de *commit* e trabalho colaborativo em Git -existem algumas boas práticas que devem ser seguidas. Visite: -[Git contributing guide][]. - -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. Visite: [sha1-size][]. - -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. - -<!-- -Frases do Linus Torvalds. -http://www.diolinux.com.br/2015/04/13-frases-epicas-de-linus-torvalds.html ---> - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## 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 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra o conteúdo do arquivo. -less README.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra o conteúdo do arquivo. -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 Gitque -informa o que aconteceu e também dá sugestões do que fazer. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -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][]. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra o histórico de commits. -git log -``` - -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][]. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Diferença nos arquivos versionados. -git diff -``` - -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 contúdo, já são separadas para receber registro -(*changes to be commited*). - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Adiciona o arquivo ao processo de reastreamento. -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 -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Encaminha o arquivo para receber registro. -git add README.txt -git status -``` - -```{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 - -git log --oneline -``` - -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 intrução abaixo. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git diff HEAD@{1} -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git diff HEAD@{2} HEAD@{0} -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git diff --name-only HEAD@{2} HEAD@{0} -``` - -Vamos resolver logo o caso da palavra sem acento em -`porqueLinux.txt`. Você abre o arquivo no seu editor de texto e modifica -conforme necessário. A modificação compreende um linha apenas mas aà -lembrei de mais coisas e acrescentei. O `git diff` mostra as -diferenças. Epa! As diferenças não eram entre *commits*? O conteúdo -adicionado ainda não recebeu notificação! - -```{r, engine="bash", include=FALSE} -cd meu1repo - -echo "Por que usar o Linux? - -* É livre -* É seguro -* É customizável -* Tem repositórios de software -* Atualização constante -* Desempenho" > porqueLinux.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -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 -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)} -cd meu1repo - -## Palavras corrigidas e mais itens adicionados. -less porqueLinux.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Abandona modificações feitas presentes no arquivo. -git checkout -- porqueLinux.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -less porqueLinux.txt -``` - -Bateu o arrependimento? Tem formas de poder retroceder com mudanças -ainda não registradas mas mantendo a possibilidade de -recuperá-las. Mostraremos em breve. - -**NOTA**: sempre que quiser testar um comando novo e não está seguro do -que ele faz ou da extensão dos seus efeitos, faça uma cópia do projeto -em outro diretório e experimente ele lá. Isso previne sabores amargos, -pois algumas ações podem ser irreversÃveis. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Depois de desfazer as modificações no porqueLinux.txt -git status -``` - -Vamos seguir com as modificações em `porqueLinux.txt` que corrigem o -texto e acrescentam itens novos. - -```{r, engine="bash", include=FALSE} -cd meu1repo - -echo "Por que usar o Linux? - -* É livre -* É seguro -* É customizável -* Tem repositórios de software -* Atualização constante -* Desempenho" > porqueLinux.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -O `diff` vazio compara o diretório de trabalho com o último registro -(último *commit*). Quando você usa explicitamente na instrução `HEAD@{ }` -seguido de número, então estão sendo comparadas versões -"commitadas". Existem variantes de sufixo para usar no `HEAD` que são: - - * `HEAD@{n}` - * `HEAD^n` - * `HEAD~n` - -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)} -cd meu1repo - -## Modificações no diretório vs último commit. -git diff -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Último commit vs dois ancestrais, usando ~. -git diff HEAD~1 HEAD~0 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Último commit vs seu ancestral, usando @{}. -git diff HEAD@{1} HEAD@{0} -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Último commit vs dois ancestrais. -## git diff HEAD~2 HEAD~0 -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 rencente para os seus ancestrais. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra referências para commits os ancentrais. -git reflog -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Adiciona e commita. -git add porqueLinux.txt -git commit -m "Novos argumentos." -``` - -O Git permite um nÃvel de rastreabilidade bem fino. Veja por exemplo que -é possÃvel saber quem modificou e quando cada linha do arquivo e qual o -correspondente *sha1* do *commit*. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra quem, onde e o que fez em cada arquivo. -git blame README.txt -``` - -**** -## 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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Lista ramos (all), locais e remotos. -## git branch ## Só ramos locais -## git branch -r ## Só ramos remotos -git branch -a ## Todos os ramos. -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Cria um ramo para adição de conteúdo, novo segmento. -git branch feature01 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Novo ramo criado aparece. -git branch -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Muda o HEAD de ramo. -git checkout feature01 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Situação no novo ramo. -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Histórico de commits. -git log --oneline -``` - -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][]. - -```{r, engine="bash", include=FALSE} -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo vif.R, então baixar da internet. -if [ ! -f vif.R ] -then - echo "Arquivo vif.R não existe. Baixando..." - wget 'http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R' -else - echo "Arquivo vif.R já existe." -fi - -## Copiar o arquivo vif.R para o meu1repo (-v: verbose). -cp -v vif.R ../meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Baixando arquivo da internet. Uma função do R. -wget 'http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R' -``` - -```{r, engine="bash", echo=FALSE} -## Printa o seria o output da wget mas sem usar a wget para não -## encarecer a compilação. Insere o instante da compilação. Esconde -## também o IP da máquina com ???.??.???.??. - -cat << EOF ---$(date +"%Y-%m-%d %H:%M:%S")-- 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 - -$(date +"%Y-%m-%d %H:%M:%S") (44,0 MB/s) - ‘vif.R’ saved [560/560] -EOF -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Situação do repositório após o download. -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git add vif.R -git commit -m "Adiciona função R para VIF." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Estrutura do diretório. -tree -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Histórico de commits. -git reflog -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -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". - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Volta para o ramo master. -git checkout master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Estrutura do diretório. -tree -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra todas as modificações, cada linha modificada de cada arquivo. -git diff master feature01 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra só os arquivos modificados. -git diff --name-only master feature01 -``` - -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`. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mesclando as modificações em feature01 no master. -git merge feature01 master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --oneline -``` - -É 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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Referencias aos commits. -git reflog -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Volta para antes do arquivo de baixar o vif.R. -git checkout HEAD@{4} -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Qual a situação. -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## O histório existente nesse ponto. -git log --name-only --oneline -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra o conteúdo do arquivo. -less porqueLinux.txt -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra onde estamos. -git branch -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Volta para o presente. -git checkout master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --oneline -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Fenda no tempo fechada. Sem sinal do detached HEAD. -git branch -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Sinal do passeio no tempo. -git reflog -``` - -Vamos começar a ser ousados. Vamos voltar no passado, adicionar um -arquivo, commitar e ver o que acontece, como o histórico é representado. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Volta no tempo, após commit que aumenta porqueLinux.txt. -git checkout HEAD@{6} -``` - -```{r, engine="bash", include=FALSE} -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo pimentel_racoes.txt, então baixar da internet. -if [ ! -f pimentel_racoes.txt ] -then - echo "Arquivo pimentel_racoes.txt não existe. Baixando..." - wget 'http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt' -else - echo "Arquivo pimentel_racoes.txt já existe." -fi - -## Copiar o arquivo pimentel_racoes.txt para o meu1repo (-v: verbose). -cp -v pimentel_racoes.txt ../meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Baixa arquivo de dados da internet. -wget 'http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt' -``` - -```{r, engine="bash", echo=FALSE} -## Printa o seria o output da wget mas sem usar a wget para não -## encarecer a compilação. Insere o instante da compilação. Esconde -## também o IP da máquina com ???.??.???.??. - -cat << EOF ---(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’ -EOF -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## 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." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Log num formato gráfico ASCII para mostrar o novo ramo. -git log --graph --oneline --decorate --date=relative --all -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git branch -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Um novo ramo a partir do atual HEAD. -git checkout -b feature02 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git branch -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -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 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)} -cd meu1repo - -git checkout feature01 -``` - -```{r, engine="bash", echo=FALSE} -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo brasilCopa2014.txt, então baixar da internet. -if [ ! -f brasilCopa2014.txt ] -then - echo "Arquivo brasilCopa2014.txt não existe. Baixando..." - wget 'http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt' -else - echo "Arquivo brasilCopa2014.txt já existe." -fi - -## Copiar o arquivo brasilCopa2014.txt para o meu1repo (-v: verbose). -cp -v brasilCopa2014.txt ../meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -wget 'http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt' -``` - -```{r, engine="bash", echo=FALSE} -## Printa o seria o output da wget mas sem usar a wget para não -## encarecer a compilação. Insere o instante da compilação. Esconde -## também o IP da máquina com ???.??.???.??. - -cat << EOF ---$(date +"%Y-%m-%d %H:%M:%S")-- 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 - -$(date +"%Y-%m-%d %H:%M:%S") (69,6 MB/s) - ‘brasilCopa2014.txt’ saved [1254/1254] -EOF -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git add brasilCopa2014.txt -git commit -m "Arquivo sobre copa 2014 celeção brasileira." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Volta para o master. -git checkout master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mescla o feature01. -git merge feature01 master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mescla o feature02. -git merge feature02 master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -tree -``` - -**** -## 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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Remove ramos. -git branch -d feature01 -git branch -d feature02 -git branch -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -Agora vou criar um novo ramo, adicionar um arquivo e encurtar o nome das -colunas no cabeçalho. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Muda para um ramo criado na hora. -git checkout -b feature03 -``` - -```{r, engine="bash", include=FALSE} -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo bib1.txt, então baixar da internet. -if [ ! -f bib1.txt ] -then - echo "Arquivo bib1.txt não existe. Baixando..." - wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' -else - echo "Arquivo bib1.txt já existe." -fi - -## Copiar o arquivo bib1.txt para o meu1repo (-v: verbose). -cp -v bib1.txt ../meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' -``` - -```{r, engine="bash", echo=FALSE} -## Printa o seria o output da wget mas sem usar a wget para não -## encarecer a compilação. Insere o instante da compilação. Esconde -## também o IP da máquina com ???.??.???.??. - -cat << EOF ---$(date +"%Y-%m-%d %H:%M:%S")-- 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 - -$(date +"%Y-%m-%d %H:%M:%S") (35,0 MB/s) - ‘bib1.txt’ saved [535/535] -EOF -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Mostra as 4 primeiras linhas. -head -4 bib1.txt -``` - -Ao encurtar o nome para quatro dÃgitos, fica assim. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## 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 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git add bib1.txt -git commit -m "Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos." -``` - -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. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git checkout master -``` - -```{r, engine="bash", include=FALSE} -## Copiar o arquivo bib1.txt para o meu1repo (-v: verbose). -cd downloads -cp -v bib1.txt ../meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' -``` - -Ao encurtar o nome para quatro dÃgitos, fica assim. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## 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 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git add bib1.txt -git commit -m "Arquivo de experimento em BIB. Cabeçalho em caixa alta." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git diff master feature03 -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd meu1repo - -## Dá mensagem de erro que informa o conflito. -git merge feature03 master -``` - -```{r, warning=FALSE, echo=FALSE} -x <- system("cd meu1repo && git merge feature03 master", intern=TRUE) -cat(paste(x, collapse="\n")) - -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## `less` printa o conteúdo do arquivo mas `head` limita para 10 linhas. -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 -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. - -```{r, engine="bash", echo=-c(1:2), include=FALSE} -cd meu1repo - -sed -i '1,3d;5d' bib1.txt -sed -i '1s/.*/\U&/' bib1.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -## Arquivo depois da edição que resolve o conflito. -head -6 bib1.txt -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git add bib1.txt -git commit -m "Resolve conflito, trunca com caixa alta." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git reflog -``` - -## Trabalhando com cópias - -```{r, engine="bash", include=FALSE} -if [ -d ~/maquina2/ ] -then - echo "Diretório existe. Então apagar pasta meu1repo." - cd ~/maquina2/ - ls -a - if [ -d meu1repo ] - then - echo "Já existe meu1repo aqui. Apagar." - rm -rf meu1repo - fi -else - echo "Diretório não existe." - mkdir ~/maquina2/ -fi - -## Tudo limpo tal como precisamos. -pwd -ls -a - -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git remote -v -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2 - -## Diretório na segunda que terá uma cópia em desenvolvimento do -## projeto. -pwd -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2 - -## Conteúdo. -tree -a -``` - -```{r, engine="bash", echo=-c(1:2)} -DIRGIT=$PWD; cd ~/maquina2 - -## Clonando o projeto de outro lugar. -## $DIRGIT representa o caminho para chegar até meu1repo. -git clone "$DIRGIT/meu1repo/.git" && cd meu1repo -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2 - -## Conteúdo após clonar. -tree -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git remote -v -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git log --oneline -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git branch -a -``` - -```{r, engine="bash", echo=-c(1:4)} -cd ~/maquina2/meu1repo -git config user.name "Knight Rider" -git config user.email "batman@justiceleague.org" - -git branch feature04 -git checkout feature04 -``` - -```{r, engine="bash", include=TRUE} -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo diasbarros_feijao.txt, então baixar da -## internet. -if [ ! -f diasbarros_feijao.txt ] -then - echo "Arquivo diasbarros_feijao.txt não existe. Baixando..." - wget 'http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.txt' -else - echo "Arquivo diasbarros_feijao.txt já existe." -fi - -## Copiar o arquivo diasbarros_feijao.txt para o meu1repo (-v: verbose). -cp -v diasbarros_feijao.txt ~/maquina2/meu1repo/ -``` - -```{r, engine="bash", echo=-c(1:2), eval=FALSE} -cd ~/maquina2/meu1repo - -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.txt' -``` - -```{r, engine="bash", echo=FALSE} -## Printa o seria o output da wget mas sem usar a wget para não -## encarecer a compilação. Insere o instante da compilação. Esconde -## também o IP da máquina com ???.??.???.??. - -cat << EOF ---$(date +"%Y-%m-%d %H:%M:%S")-- http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.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: 487 [text/plain] -Saving to: ‘diasbarros_feijao.txt’ - - 0K 100% 40,2M=0s - -$(date +"%Y-%m-%d %H:%M:%S") (40,2 MB/s) - ‘diasbarros_feijao.txt’ saved [487/487] -EOF -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git add diasbarros_feijao.txt -git commit -m "Dados de experimento com feijão." -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git push origin feature04 -``` - -Volta para origem e verifica o que recebeu de contribuição. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -pwd -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git status -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git branch -a -``` - -Opa! Tem um novo ramo. Vamos ver o que ele tem de diferente. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git diff --name-only feature04 master -``` - -Parece que chegou um arquivo novo. Vamos então mesclar ao master. - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git merge feature04 master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -pwd -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git pull origin master -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git log --graph --oneline --decorate --date=relative --all -``` - -```{r, engine="bash", echo=-c(1:2)} -cd ~/maquina2/meu1repo - -git log --stat -``` - -```{r, engine="bash", echo=-c(1:2)} -cd meu1repo - -git log -p -2 -``` - -```{r, include=FALSE} -## STOP -opts_chunk$set(eval=FALSE) -``` - -**** -## Ignorando arquivos e diretórios - -Há momentos em que é necessário a criação de arquivos e pastas, dentro do -repositório git, que não devem ser versionados, como é o caso de uma -compilação Latex, que gera arquivos auxiliares que não é preciso deixar -disponÃvel a terceiros. Para esse intuito, o git possui um recurso que permite -que arquivos e pastas fiquem "invisÃveis" para o software. - -Para que isso ocorra, é indispensável a criação de um arquivo com extensão -`.gitignore`, que o git irá reconhecer e efetuar leitura a procura de -pastas e arquivos a ignorar. Dentro deste arquivo, é imprescindÃvel que seja -escrito, por linha, somente um nome de pasta ou arquivo a ser ignorado. - -### Padrões de formatos para o `.gitignore` - -* Linhas em branco não são lidas, servindo apenas como modo de separar e -organizar o arquivo. - -* Os caracteres ` # ` e ` ! ` são reservado do git. Para pastas ou arquivos -que os nomes comecem com ` # ` (Exemplo: #git.txt) ou ` ! ` (Exemplo: !git.txt), -deve-se usar uma barra invertida na frente do padrão (Exemplo: \\#ddd.txt, \\!ddd.txt). - -* O caracter ` # ` serve para efetuar comentários, ou seja, a linha que iniciar com `#` -não será interpretada pelo git. - -* O caracter `!` serve para negar um padrão, por exemplo, pode-se mandar o git -ignorar todos os arquivos de determinada pasta (Usando: Nome_Dir/*), -mas deixar de ignorar um arquivo especÃfico dentro dela -(Exemplo: !Nome_Dir/Arquivo.txt). - -* O asterisco ` * ` pode ser usado para substituir parte do nome de -arquivos e pastas, ou o nome inteiro. Isso é valido também para a -extensão do arquivo. - -* Um diretório pode ser ignorado adicionando seu nome e uma barra ao final deste. - -* Dois asteriscos ` ** ` podem ser usados para substituir caminhos de subpastas, -como por exemplo, para ignorar o diretório Subpasta, -o caminho `/Exercicio/Teste/Pasta/Subpasta/` pode ser substituido por `/**/Subpasta/`. - - -### Exemplo - -O código abaixo é um exemplo de um arquivo com extensão `.gitignore`: - -```{r, engine="sh", eval=FALSE} -# Esta linha é um comentário. - -# Ignorando arquivos com extensão .aux menos o arquivo EXEMPLO.aux: - -*.aux -!EXEMPLO.aux - -# Ignorando todos os arquivos com nome EXEMPLO: - -EXEMPLO.* - -# Ignorando arquivos que possuam HTML no nome: - -HTML*.* - -# Ignorando as Subpastas e os arquivos da pasta DIR: - -DIR/* - -# Não ignorar apenas a Subpasta1 da pasta DIR: - -!DIR/Subpasta1/ - -``` - -Vale ressaltar que, no exemplo acima, por mais que esteja sendo ignorado arquivos -com o nome EXEMPLO, e arquivos com extensão .aux, -o arquivo EXEMPLO.aux (que está pecedido do sinal `!`) não será ignorado. - -### Tornando Global - -Cada vez que cria-se um novo projeto, para que arquivos sejam ignorados, -deve-se criar um novo arquivo `.gitignore`. Para que isso não ocorra, e -possÃvel configurar o arquivo globalmente, ou seja, ele estará incorporado -as configurações do git do seu computador. - - -```{r, engine="sh", eval=FALSE} -git config --global core.excludesfile ~/.gitignore_global -``` - - Depois de executar o código acima, o `.gitignore` da pasta atual - (pasta do seu projeto) será atribuido como global no arquivo de - configuração do git (`.gitconfig`). - - Uma observação importante a ser feita é que, se adicionado arquivos para - serem ignorados globalmente, como arquivos PDF (Usando: *.pdf), por exemplo, - todos os arquivos com essa extensão serão ignorados pelo git, - não somente os do projeto atual. - Portanto, é recomendado somente definir um `.gitignore` como global, - se ele apenas desconsiderar arquivos auxiliares, ou seja, que não serão necessários - para compilações futuras. - -**** -## Autenticando em contas do GitLab (c3sl) e GitHub - -Os procedimentos dessa sessão tem o objetivo de promover o conexão da -sua máquina de trabalho com sua conta no GitLab do c3sl (alunos UFPR) ou -conta do GitHub. Assume-se, logicamente, que você tenha conta em algum -desses serviços. Caso você não tenha uma conta em algum serviço de -hospedagem de repsitório Git, seguem algumas opções: - - * GitHub: <https://github.com/> - * GitLab: <https://about.gitlab.com/> - * Bitbucket: <https://bitbucket.org/> - -Uma comparação entre os serviços disponÃveis para Git está disponÃvel em -[git-hosting-services-compared][]. - -Abra o terminal em qualquer diretório. Não precisa ser um diretório -Git. Aqui será criado um par de chaves, que nada mais são que longas -cadeias de caracteres, de forma que elas formam um par -chave/cadeado. A pública (a chave) é copiada para o servidor. A privada -fica na sua máquina. Dessa maneira, a comunicação para transferência de -dados entre as máquinas pode ser feita. - -Será solicitado uma senha (`passphrase`). Você pode forncer uma ou -apenas pressionar `Enter` para correr o procedimento padrão. O resultado -é uma senha gráfica ASCII além de gerar os arquivos (chaves) cujo -caminho é informado no *output*. - -```{r, engine="sh", eval=FALSE} -## keygen (chave gerar). rsa é o tipo. -ssh-keygen -t rsa -C "batman@justiceleague.org" -``` - -``` -Generating public/private rsa key pair. -Enter file in which to save the key (/home/batman/.ssh/id_rsa): -Enter passphrase (empty for no passphrase): -Enter same passphrase again: -Your identification has been saved in /home/batman/.ssh/id_rsa. -Your public key has been saved in /home/batman/.ssh/id_rsa.pub. -The key fingerprint is: -66:c1:0b:3a:94:25:83:00:81:9f:40:26:f7:aa:af:3a batman@justiceleague.org -The key's randomart image is: - +--[ RSA 2048]----+ - | | - ~MMMMMMMMMMMM MMMMMMMMMMMM~ - .MMMMMMMMM. MMM .MMMMMMMMM. - MMMMMMMMMMMMMMMMMMMMMMMMMMM - MMMMMMMMMMMMMMMMMMMMMMMMM - .MMMMMMMMMMMMMMMMMMMMMMMMM. - .MMMMMMMMM. - .MMM. - M - | | - +-----------------+ -``` - -O importante é o conteúdo do arquivo `/home/batman/.ssh/id_rsa.pub`, a -sua chave pública. Este deve ser fornecido ao GitLab (ou GitHub) em uma -janela com as chaves. Os endereços abaixo levam para a mencionada -janela. Requer que esteja logado. - - * GitLab: <http://gitab.c3sl.ufpr.br/profile/keys> - * GitHub: <https://github.com/settings/ssh> - -Nessa janela deverá ser informado o código gerado pelo -`ssh-keygen`. Você deve copiar o texto do arquivo -`/home/batman/.ssh/id_rsa.pub`, sem moficá-lo, e fornecer ao GitLab. -Para ver/abrir o conteúdo do arquivo no próprio terminal use `less` ou -`cat`. Para copiar do terminal use `ctrl+shift+c`. Para abrir com um -editor de texto, o `gedit` por exemplo, é só passar o nome do arquivo. - -```sh -## Abre o arquivo com o editor de texto Gedit. -gedit /home/batman/.ssh/id_rsa.pub - -## Mostra o conteúdo do arquivo no próprio terminal. -less /home/batman/.ssh/id_rsa.pub -``` - -``` -ssh-rsa BBBBB3NzaC1yc2EAAAADAQABAAABAQDDuQmvkQ0WgwYQvR16z37tG37Q61ID+Qf4hi8+cARjjSWP7015CAtRnCvmGFSbdFMjz3ZEkp2XzHIyRCKw2hLP57rkFcfioWra6N5/9+z+tPiwr2OzwLfk7J/GAETGA4rtoToV96hf5RvKRhvuqyO5uf5ouBILm1PRpjA/5AkfToWp25/7WC136eGIOSJMFgQ3OuK5U+qSXAwuSdu9Uj1XkVYFDjasA45ZjsnkE6L9bKiYymadshEbWEBHJAWqDErd8srMtBYS/2hodNnjfH7rNHHCo8wZD5GJFz7YUodaBSaSYuHVfrEryaEm/r5787CAiecFAjWEeVq6StM7N/lz batman@justiceleague.org -``` - -Para conferir a comunicação da sua máquina com o servidor do GitLab do -c3sl ou do GitHub, aplique a instrução `ssh` abaixo. - -```sh -## Com gitlab do c3sl. -ssh -T git@gitlab.c3sl.ufpr.br -``` - -``` -Welcome to GitLab, Knight Rider! -``` - -```sh -## Com github. -ssh -T git@github.com -``` - -``` -Hi batman! You've successfully authenticated, but GitHub does not provide shell access. -``` - -Em caso de obter uma mensagem não positiva, repita o comando com a opção -`-v` para um log do procedimento. - -```sh -## Com gitlab do c3sl. -ssh -vT git@github.com -``` - -``` -OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 -debug1: Reading configuration data /etc/ssh/ssh_config -debug1: /etc/ssh/ssh_config line 19: Applying options for * -debug1: Connecting to github.com [192.30.252.130] port 22. -debug1: Connection established. -debug1: identity file /home/batman/.ssh/id_rsa type 1 -debug1: identity file /home/batman/.ssh/id_rsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_dsa type -1 -debug1: identity file /home/batman/.ssh/id_dsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_ecdsa type -1 -debug1: identity file /home/batman/.ssh/id_ecdsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_ed25519 type -1 -debug1: identity file /home/batman/.ssh/id_ed25519-cert type -1 -debug1: Enabling compatibility mode for protocol 2.0 -debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3 -debug1: Remote protocol version 2.0, remote software version libssh-0.7.0 -debug1: no match: libssh-0.7.0 -debug1: SSH2_MSG_KEXINIT sent -debug1: SSH2_MSG_KEXINIT received -debug1: kex: server->client aes128-ctr hmac-sha1 none -debug1: kex: client->server aes128-ctr hmac-sha1 none -debug1: sending SSH2_MSG_KEX_ECDH_INIT -debug1: expecting SSH2_MSG_KEX_ECDH_REPLY -debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 -debug1: Host 'github.com' is known and matches the RSA host key. -debug1: Found key in /home/batman/.ssh/known_hosts:1 -debug1: ssh_rsa_verify: signature correct -debug1: SSH2_MSG_NEWKEYS sent -debug1: expecting SSH2_MSG_NEWKEYS -debug1: SSH2_MSG_NEWKEYS received -debug1: Roaming not allowed by server -debug1: SSH2_MSG_SERVICE_REQUEST sent -debug1: SSH2_MSG_SERVICE_ACCEPT received -debug1: Authentications that can continue: publickey -debug1: Next authentication method: publickey -debug1: Offering RSA public key: /home/batman/.ssh/id_rsa -debug1: Server accepts key: pkalg ssh-rsa blen 279 -debug1: Authentication succeeded (publickey). -Authenticated to github.com ([192.30.252.130]:22). -debug1: channel 0: new [client-session] -debug1: Entering interactive session. -debug1: Sending environment. -debug1: Sending env LC_PAPER = pt_BR.UTF-8 -debug1: Sending env LC_ADDRESS = pt_BR.UTF-8 -debug1: Sending env LC_MONETARY = pt_BR.UTF-8 -debug1: Sending env LC_NUMERIC = pt_BR.UTF-8 -debug1: Sending env LC_TELEPHONE = pt_BR.UTF-8 -debug1: Sending env LC_IDENTIFICATION = pt_BR.UTF-8 -debug1: Sending env LANG = en_US.UTF-8 -debug1: Sending env LC_MEASUREMENT = pt_BR.UTF-8 -debug1: Sending env LC_TIME = pt_BR.UTF-8 -debug1: Sending env LC_NAME = pt_BR.UTF-8 -debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 -Hi batman! You've successfully authenticated, but GitHub does not provide shell access. -debug1: channel 0: free: client-session, nchannels 1 -Transferred: sent 3856, received 1784 bytes, in 0.4 seconds -Bytes per second: sent 10261.9, received 4747.7 -debug1: Exit status 1 -``` - -### Requisições de mescla - -### Colaborando via fork - -**** -## Modelos de fluxos de trabalho - -<!-- -Inspiração: - -https://git-scm.com/book/pt-br/v1/Git-Distribu%C3%ADdo-Fluxos-de-Trabalho-Distribu%C3%ADdos -http://imasters.com.br/gerencia-de-ti/fluxo-de-desenvolvimento-com-gitflow/ -http://www.magentonapratica.com.br/2014/07/um-modelo-bem-sucedido-de-ramificacao.html ---> - -**** -## Usando ferramentas gráficas para o Git - -### Git GUI - -### Gitk - -### Meld - -**** -## Dicionário de termos - -<!---------------------------------------------------------------------- --> -<!-- 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/git_tuto.md b/git_tuto.md deleted file mode 100644 index 1e4eb8f..0000000 --- a/git_tuto.md +++ /dev/null @@ -1,3381 +0,0 @@ -# Tutorial de Git -PET EstatÃstica UFPR - - - -<!-- -## Processar com: -render git_tuto.Rmd -rm -rf meu1repo/ && rm -rf ~/maquina2/meu1repo/ && render git_tuto.Rmd - -TODO - * Remover o downloads. Fazer uma vez para uma pasta /Downloads e só - copiar de lá. Manter o comandos com wget porque assim outras pessoas - podem reproduzir. - * Aprender o que fazer para não precisar dar cd meu1repo em todos os - chunks. - -TODO Materiais a serem lidos -* http://www.atualsistemas.net/dev/Manual_Git.PDF -* http://www.dcc.fc.up.pt/~pbv/aulas/labprog/slides/gitprimer.pdf - -## Wiki de um tutorial completo do Conselho Nacional de Justiça. -http://www.cnj.jus.br/wikipje/index.php/GIT - -## Slides com muitas ilustrações. -http://wiki.softwarelivre.org/pub/Blogs/BlogPostAntonioTerceiro20081108115324/curso-vcs.pdf - -## Compara serviços de versionamento -http://www.ufjf.br/getcomp/files/2013/03/An%C3%A1lise-Comparativa-entre-Sistemas-de-Controle-de-Vers%C3%B5es-Daniel-Tannure-Menandro-de-Freitas.pdf - -## Aproveita-se no glossario e cheat sheet -http://www.ceuma.br/nucleodeti/wp-content/uploads/2013/12/Git_v0.1.2.pdf ---> - -<img src="https://git-scm.com/images/logos/downloads/Git-Icon-1788C.png" -width=200px align="right" display="block"> - -<!--==================================================================== --> - -**** -*Cheat sheets* para Git - - * [Tobias Günther](http://www.git-tower.com/blog/git-cheat-sheet/); - * [GitHub git cheat sheet](https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf) - * [Chris Sevilleja](https://scotch.io/bar-talk/git-cheat-sheet) - * [Jan Krüger](http://jan-krueger.net/wordpress/wp-content/uploads/2007/09/git-cheat-sheet.pdf) - * [William Leeks](http://www.cheetyr.com/git) - * [cheat.errtheblog.com](http://cheat.errtheblog.com/s/git) - -O modelo de funcionamento do Git: - - * [patrickzahnd.ch](http://www.patrickzahnd.ch/wp-content/uploads/2014/02/git-transport-v1.pdf) - * [Andrew Petenson](http://ndpsoftware.com/git-cheatsheet.html) - -Playlists de tutoriais de Git - - * Loiane Groner - [Git e Github para iniciantes](https://www.youtube.com/watch?v=UMhskLXJuq4) - * HxTutors - [Github - Pra que serve e como usar?](https://www.youtube.com/watch?v=neDiLHwXSVo) - * Devmedia Editora - [Controle de versoes distribuido com Git](https://www.youtube.com/watch?v=1zj8ItHi_Kk) - * RBtech - [Curso básico de Git (playlist)](https://www.youtube.com/playlist?list=PLInBAd9OZCzzHBJjLFZzRl6DgUmOeG3H0) - * Luiz Venturote - [Controle de Versão com Git](https://www.youtube.com/playlist?list=PLBzQU3U8iMRndBoeUhURmQf1aLhQExbP8) - * Leandro Cavalcante [Git (playlist)](https://www.youtube.com/watch?v=GBnt3ztA6nI&list=PLXtEEPEfASEIrUZj9X_kj-dlaul59bRox) - * StudyClassOficial - [Controle de Versão com GIT](https://www.youtube.com/watch?v=Wj8EB4IAqWc) - * Israel Santos - [Controle de versão com git](https://www.youtube.com/watch?v=morEwdyzmY4) - * Giovanni Silva - [Tutorial Git (playlist)](https://www.youtube.com/playlist?list=PL3NGePwPGuvvnBO4tk---xNABmNVEpD2R) - * makigas - [Tutorial de Git en media hora](https://www.youtube.com/watch?v=QGKTdL7GG24) - * Desde Cero - [Cómo Instalar Git en Windows Desde Cero](https://www.youtube.com/watch?v=poVAyKNsk00) - -**** -## O que é o Git? - -O Git é uma ferramenta de controle de versão que facilita os projetos em equipe -a verficação do mesmo. Basicamente, o Git detecta as mudanças que ocorrem no -arquivo, bem como onde ocorreu e qual mudança foi feita. Ainda existe a -possibilidade de voltar no histórico do projeto, sempre que necessário. -Outra facilidade está na equipe trabalhar em cima do projeto ao mesmo tempo, -e no final o Git faz o trabalho de juntar todos os arquivos mostrando se há -algum conflito. Integrantes podem mandar sugestões de alterações, e cabe ao -responsável pelo projeto incorporar ou não essas alterações. - -**** -## Download e instalação - -A primeira coisa a fazer é ter instalado os arquivos necessários para o -Git funcionar. Em sistemas Debian e suas variações (Ubuntu, LinuxMint, -...), os pacotes necessários podem ser instalados com comandos que, a -partir dos repositórios de cada distribuição, instalam o Git na sua -máquina. - -**Linux** - -Em uma sessão de terminal Linux de distribuições Debian (Ubuntu, Mint), -execute o código abaixo. - - -```sh -## Adicione o ppa para ter a versão mais recente do Git. Descomente e -## rode essas duas linhas de comando para isso. -## sudo add-apt-repository ppa:git-core/ppa -## sudo apt-get update - -sudo apt-get install git git-core git-man git-gui git-doc \ - ssh openssh-server openssh-client -git --version - -## Ferramentas complementares. -sudo apt-get install gitk meld -``` - -Usuários de Linux baseados no Arch instalam de uam forma ligeiramente -diferente. - - -```sh -pacman -S git openssh meld -git --version -``` - -O `ssh` e `openssh-*` são necessários para a comunicação entre sua -máquina e o servidor do GitHub ou GitLab. Iremos configurar repositórios -remotos em uma outra sessão. O Git também pode ser instalado em ou -sistemas operacionais. Visite [Installing-Git][] e siga as -instruções. Os arquivos de instalação podem ser baixados do endereço -<http://git-scm.com>. - -**Windows** - -Usuários Windows devem visitar <https://git-for-windows.github.io/>, -baixar e instalar. Essa instalação do Git traz o [**Git BASH**][] que é como -um terminal do (Li|U)nix, a [**Git GUI**][] que é uma interface para -trabalhar com Git e [**Shell Integration**][] que são ações disponÃveis no -menu aberto pelo botão direto mouse. Além disso, segundo o que consta é -que essa instalação tras também a [**Gitk**][], uma interface para navegação -no histórico. - -[Meld](http://meldmerge.org/) é um assistente de comparação de arquivos -(*file diff*). Ele é muito útil como ferramenta para resolver conflitos -de merge (*mergetool*). No entanto, não é obrigatório ter. - -**** -## Configurando perfil - -Estas configurações precisam ser feitas apenas uma vez, e servem para -determinar algumas opções globais do Git. - -Os comandos abaixo vão configurar o nome de usuário e email. Fique -tranquilo que o Git não vai te enviar email, isso é apenas informação -que ficará associada ao trabalho que você desenvolver de modo a permitir -que os colaborados/gestores do projeto identifiquem suas contribuições e -possam entrar em contato, se necessário (principalmente se você fizer -aqui de errado). Mesmo que você nunca venha a trabalhar em equipe, -apenas localmente, é importante fornecer nome e email. Se trabalhar de -duas máquinas diferentes, você pode indentificar no nome de usuário. - - -```sh -## Configurações do Git do Batman. -git config --global user.name "Knight Rider" -git config --global user.email "batman@justiceleague.org" - -## Configurações do Git do Superman. -git config --global user.name "Kal-El" -git config --global user.email "superman@justiceleague.org" -``` - -O `--global` dessa instrução significa que o que for definido vai valer -para todo projeto Git da máquina. É possÃvel fazer definições para cada -projeto, ou seja, não globais. Portanto, você pode trabalhar com nomes -ou emails diferentes para cada projeto. É possÃvel também criar `alias` -para algumas intruções Git. Embora elas não sejam tão longas, no uso -contÃnuo pode valer a pena. Visite: - - * [Setting up a repository][] - * [Customizing Git - Git Configuration][] - -Além disso podemos definir um editor de texto padrão para escrever as -mensagens de *commits*. Por padrão, esse editor é o `$EDITOR` do seu -shell. (Essa etapa pode ser pulada a princÃpio, como veremos mais pra -frente). Esse editor não precisa ser necessariamente o mesmo editor que -você usa para escrever [texto, código]. No meu caso uso o Emacs, mas -para essa tarefa prefiro o vim por ser um editor embutido, e que não vai -carregar uma interface gráfica desnecessariamente quando for preciso -escrever uma mensagem de *commit*. Portanto, aqui pode-se deixar espaço -para o `vim`. - - -```sh -git config --global core.editor vim -``` - -O Emacs também pode ser carregado embutido no terminal (sem usar o X), -usando a opção `emacs -nw` (de *no window*) na sua inicialização. - -No Linux, as informações acima passadas ficam salvas em um arquivo na -home do usuário chamado `.gitconfig`. Quando não se usa o `--global`, as -definições ficam salvas dentro do próprio do projeto. Eis o conteúdo do -arquivo de configuração do Batman. - - -```bash -less ~/.gitconfig -``` - -``` -[user] - name = Knight Rider - email = batman@justiceleague.org -[merge] - tool = meld -``` - -No caso dele, além de nome e email, tem que o `meld` que é a ferramenta -de merge definida como padrão. Para conseguir isso você precisa definir -como fez com os demais ([how-to-set-meld-as-git-mergetool][]). - - -```bash -git config --global merge.tool meld -``` - -**Avançado**: Para usuários Linux que apreciam o nÃvel de customização -que o Linux oferece (como o Batman e nós), é possÃvel configurar o -prompt do terminal para mostrar a informação do ramo, usuário, etc. Essa -informação estampada facilita um bocado, principalmente em projetos -grandes. Visite: - - * [Eranga Bandara](https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt) - * [Michael Hoffman](http://code-worrier.com/blog/git-branch-in-bash-prompt/) - -**** - -## Criar um projeto versionado - -### Instruções do Git - -Já temos o Git devidamente e com credenciais (nome e email) e -configurações aplicadas. Vamos então ver como o sistema de controle de -versão acontece. - -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. - - -```bash -## Padrão de instruções Git. -git <instrução> <complementos ...> -``` - -Os comandos abaixo revelam tudo o Git tem, embora dizer o que ele tem -não signifique nada diante do que ele pode fazer com o que tem. - - -```bash -## Ajuda resumida do Git, principais comandos com descrição. -git help -a -``` - -``` -usage: git [--version] [--help] [-C <path>] [-c name=value] - [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] - [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] - [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] - <command> [<args>] - -disponÃvel comandos git em '/usr/lib/git-core' - - add merge-octopus - add--interactive merge-one-file - am merge-ours - annotate merge-recursive - apply merge-resolve - archimport merge-subtree - archive merge-tree - bisect mergetool - bisect--helper mktag - blame mktree - branch mv - bundle name-rev - cat-file notes - check-attr p4 - check-ignore pack-objects - check-mailmap pack-redundant - check-ref-format pack-refs - checkout patch-id - checkout-index peek-remote - cherry prune - cherry-pick prune-packed - citool pull - clean push - clone quiltimport - column read-tree - commit rebase - commit-tree receive-pack - config reflog - count-objects relink - credential remote - credential-cache remote-ext - credential-cache--daemon remote-fd - credential-store remote-ftp - cvsexportcommit remote-ftps - cvsimport remote-http - cvsserver remote-https - daemon remote-testpy - describe remote-testsvn - diff repack - diff-files replace - diff-index repo-config - diff-tree request-pull - difftool rerere - difftool--helper reset - fast-export rev-list - fast-import rev-parse - fetch revert - fetch-pack rm - filter-branch send-email - fmt-merge-msg send-pack - for-each-ref sh-i18n--envsubst - format-patch shell - fsck shortlog - fsck-objects show - gc show-branch - get-tar-commit-id show-index - grep show-ref - gui stage - gui--askpass stash - hash-object status - help stripspace - http-backend submodule - http-fetch subtree - http-push svn - imap-send symbolic-ref - index-pack tag - init tar-tree - init-db unpack-file - instaweb unpack-objects - log update-index - lost-found update-ref - ls-files update-server-info - ls-remote upload-archive - ls-tree upload-pack - mailinfo var - mailsplit verify-pack - merge verify-tag - merge-base web--browse - merge-file whatchanged - merge-index write-tree - -'git help -a' and 'git help -g' lists available subcommands and some -concept guides. See 'git help <command>' or 'git help <concept>' -to read about a specific subcommand or concept. -``` - - -```bash -## Lista de todos os comandos disponÃveis. -git help -a -``` - -``` -usage: git [--version] [--help] [-C <path>] [-c name=value] - [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] - [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] - [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] - <command> [<args>] - -disponÃvel comandos git em '/usr/lib/git-core' - - add merge-octopus - add--interactive merge-one-file - am merge-ours - annotate merge-recursive - apply merge-resolve - archimport merge-subtree - archive merge-tree - bisect mergetool - bisect--helper mktag - blame mktree - branch mv - bundle name-rev - cat-file notes - check-attr p4 - check-ignore pack-objects - check-mailmap pack-redundant - check-ref-format pack-refs - checkout patch-id - checkout-index peek-remote - cherry prune - cherry-pick prune-packed - citool pull - clean push - clone quiltimport - column read-tree - commit rebase - commit-tree receive-pack - config reflog - count-objects relink - credential remote - credential-cache remote-ext - credential-cache--daemon remote-fd - credential-store remote-ftp - cvsexportcommit remote-ftps - cvsimport remote-http - cvsserver remote-https - daemon remote-testpy - describe remote-testsvn - diff repack - diff-files replace - diff-index repo-config - diff-tree request-pull - difftool rerere - difftool--helper reset - fast-export rev-list - fast-import rev-parse - fetch revert - fetch-pack rm - filter-branch send-email - fmt-merge-msg send-pack - for-each-ref sh-i18n--envsubst - format-patch shell - fsck shortlog - fsck-objects show - gc show-branch - get-tar-commit-id show-index - grep show-ref - gui stage - gui--askpass stash - hash-object status - help stripspace - http-backend submodule - http-fetch subtree - http-push svn - imap-send symbolic-ref - index-pack tag - init tar-tree - init-db unpack-file - instaweb unpack-objects - log update-index - lost-found update-ref - ls-files update-server-info - ls-remote upload-archive - ls-tree upload-pack - mailinfo var - mailsplit verify-pack - merge verify-tag - merge-base web--browse - merge-file whatchanged - merge-index write-tree - -'git help -a' and 'git help -g' lists available subcommands and some -concept guides. See 'git help <command>' or 'git help <concept>' -to read about a specific subcommand or concept. -``` - -### Criar um diretório para o projeto Git - -Vamos criar um diretório vazio para começarmos um projeto. Também se -pode começar de um diretório que já tenha arquivos e subdiretórios. Você -pode fazer isso com seu *file manager* padrão que no Ubuntu é o -[`Nautilus`](https://wiki.gnome.org/action/show/Apps/Nautilus), no Mint -é o `Nemo`. - -**NOTA**: o desenvolvimento do Nemo é feito com Git e está disponÃvel no -GitHub: [linuxmint/nemo][]. - -Nesse tutorial, 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. Se você considera que uma ferramenta -gráfica é mais confortável ou produtiva, sinta-se à vontade para -aprendê-la e usá-la. - - - - -```bash -## Cria diretório (make directory). -mkdir meu1repo - -## Entra no diretório (change directory). -cd meu1repo -``` - -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 email usados e alguns -definições adicionais, caso existam. Em caso de ainda não ter -configurado o seu Git, informe o nome e email conforme apresentado na -sessão anterior. - - -```bash -## Mostra as informações/definições do usuário. -git config --list -``` - -```sh -user.name=Knight Rider -user.email=batman@justiceleague.org -merge.tool=meld -``` - -Temos um diretório destinado ao projeto que será mantido sobre -versionamento, então vamos iniciar um repositório Git nele. - - -```bash -## Inicia um repositório sob versionamento Git. -git init -``` - -``` -Initialized empty Git repository in /media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo/.git/ -``` - -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 -diretório. É por essa razão que ele é oculto. Alterar o conteúdo pode -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 conferir a sua -estrutura. - - -```bash -## Mostra todo conteúdo do diretório. -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 -``` - -**NOTA**: o `tree` é um programa instalado a parte (*third party -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][]. - -Vamos começar da maneira mais simples: criando um arquivo com uma linha -de texto apenas. Bem, vale avisar que ao longo desse tutorial, 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 eu editor de texto favorito (Emacs, Gedit, Geany, -RStudio, etc) e faça algo mais criativo. - - -```bash -## Cria um arquivo com uma linha de conteúdo. -echo "Meu primeiro repositório Git" > README.txt - -## Lista os arquivos do diretório. -tree -``` - -``` -. -└── README.txt - -0 directories, 1 file -``` - -O Git está "atento" a tudo que acontece nesse diretório. 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 -``` - -``` -No ramo master - -Submissão inicial. - -Arquivos não monitorados: - (utilize "git add <arquivo>..." para incluir o que será submetido) - - README.txt - -nada adicionado ao envio mas arquivos não registrados estão presentes (use "git add" to registrar) -``` - -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 -``` - -``` -No ramo master - -Submissão inicial. - -Mudanças a serem submetidas: - (utilize "git rm --cached <arquivo>..." para não apresentar) - - 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. - - -```bash -## Registro de versão. -git commit -m "Cria arquivo com tÃtulo." -``` - -``` -[master (root-commit) e248651] Cria arquivo com tÃtulo. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 1 insertion(+) - create mode 100644 README.txt -``` - -**NOTA**: Sobre mensagens de *commit* e trabalho colaborativo em Git -existem algumas boas práticas que devem ser seguidas. Visite: -[Git contributing guide][]. - -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. Visite: [sha1-size][]. - -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. - -<!-- -Frases do Linus Torvalds. -http://www.diolinux.com.br/2015/04/13-frases-epicas-de-linus-torvalds.html ---> - - -```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 -``` - -``` -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: README.txt - -Arquivos não monitorados: - (utilize "git add <arquivo>..." para incluir o que será submetido) - - porqueLinux.txt - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "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 e2486515a9e75bf8e9e2e38e63e557c32ad887bf -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:58 2015 -0300 - - 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. -git diff -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -``` - -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 contúdo, já são separadas para receber registro -(*changes to be commited*). - - -```bash -## Adiciona o arquivo ao processo de reastreamento. -git add porqueLinux.txt -git status -``` - -``` -No ramo master -Mudanças a serem submetidas: - (use "git reset HEAD <file>..." to unstage) - - new file: porqueLinux.txt - -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: README.txt -``` - - -```bash -## Mensagem que registra as modificações adicionadas. -git commit -m "Lista de inicial de o porquê usar o Linux." -``` - -``` -[master 68a99fc] Lista de inicial de o porquê usar o Linux. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 5 insertions(+) - create mode 100644 porqueLinux.txt -``` - - -```bash -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: README.txt - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "git commit -a") -``` - -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. - - -```bash -## Encaminha o arquivo para receber registro. -git add README.txt -git status -``` - -``` -No ramo master -Mudanças a serem submetidas: - (use "git reset HEAD <file>..." to unstage) - - modificado: README.txt -``` - - -```bash -## Atribui mensagem de notificação. -git commit -m "Adiciona frase do Linux Torvalds." -``` - -``` -[master 28205ac] Adiciona frase do Linux Torvalds. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 4 insertions(+) -``` - -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*. - - -```bash -git log --oneline -``` - -``` -28205ac Adiciona frase do Linux Torvalds. -68a99fc Lista de inicial de o porquê usar o Linux. -e248651 Cria arquivo com tÃtulo. -``` - -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 intrução abaixo. - - -```bash -git diff HEAD@{1} -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -``` - -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. - - -```bash -git diff HEAD@{2} HEAD@{0} -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -diff --git a/porqueLinux.txt b/porqueLinux.txt -new file mode 100644 -index 0000000..8ecdfda ---- /dev/null -+++ b/porqueLinux.txt -@@ -0,0 +1,5 @@ -+Por que usar o Linux? -+ -+* É livre -+* É seguro -+* É customizavel -``` - - -```bash -git diff --name-only HEAD@{2} HEAD@{0} -``` - -``` -README.txt -porqueLinux.txt -``` - -Vamos resolver logo o caso da palavra sem acento em -`porqueLinux.txt`. Você abre o arquivo no seu editor de texto e modifica -conforme necessário. A modificação compreende um linha apenas mas aà -lembrei de mais coisas e acrescentei. O `git diff` mostra as -diferenças. Epa! As diferenças não eram entre *commits*? O conteúdo -adicionado ainda não recebeu notificação! - - - - -```bash -## Depois de corrigir palavras e adicionar conteúdo. -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 - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "git commit -a") -``` - -O Git sugere você aplicar *add* para preparar para *commit*. Caso as -modificações sejam um engano e não mais desejadas, você pode -desfazazê-las, abadonar a correção/inclusão das palavras usando -`checkout`. Vamos aplicá-lo para ver como funciona. - - -```bash -## Palavras corrigidas e mais itens adicionados. -less porqueLinux.txt -``` - -``` -Por que usar o Linux? - -* É livre -* É seguro -* É customizável -* Tem repositórios de software -* Atualização constante -* Desempenho -``` - - -```bash -## Abandona modificações feitas presentes no arquivo. -git checkout -- porqueLinux.txt -``` - - -```bash -less porqueLinux.txt -``` - -``` -Por que usar o Linux? - -* É livre -* É seguro -* É customizavel -``` - -Bateu o arrependimento? Tem formas de poder retroceder com mudanças -ainda não registradas mas mantendo a possibilidade de -recuperá-las. Mostraremos em breve. - -**NOTA**: sempre que quiser testar um comando novo e não está seguro do -que ele faz ou da extensão dos seus efeitos, faça uma cópia do projeto -em outro diretório e experimente ele lá. Isso previne sabores amargos, -pois algumas ações podem ser irreversÃveis. - - -```bash -## Depois de desfazer as modificações no porqueLinux.txt -git status -``` - -``` -No ramo master -nada a submeter, diretório de trabalho vazio -``` - -Vamos seguir com as modificações em `porqueLinux.txt` que corrigem o -texto e acrescentam itens novos. - - - - -```bash -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 - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "git commit -a") -``` - -O `diff` vazio compara o diretório de trabalho com o último registro -(último *commit*). Quando você usa explicitamente na instrução `HEAD@{ }` -seguido de número, então estão sendo comparadas versões -"commitadas". Existem variantes de sufixo para usar no `HEAD` que são: - - * `HEAD@{n}` - * `HEAD^n` - * `HEAD~n` - -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][]. - - -```bash -## Modificações no diretório vs último commit. -git diff -``` - -``` -diff --git a/porqueLinux.txt b/porqueLinux.txt -index 8ecdfda..8747d1e 100644 ---- a/porqueLinux.txt -+++ b/porqueLinux.txt -@@ -2,4 +2,7 @@ Por que usar o Linux? - - * É livre - * É seguro --* É customizavel -+* É customizável -+* Tem repositórios de software -+* Atualização constante -+* Desempenho -``` - - -```bash -## Último commit vs dois ancestrais, usando ~. -git diff HEAD~1 HEAD~0 -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -``` - - -```bash -## Último commit vs seu ancestral, usando @{}. -git diff HEAD@{1} HEAD@{0} -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -``` - - -```bash -## Último commit vs dois ancestrais. -## git diff HEAD~2 HEAD~0 -git diff HEAD@{2} HEAD@{0} -``` - -``` -diff --git a/README.txt b/README.txt -index 07d3585..d0af1d3 100644 ---- a/README.txt -+++ b/README.txt -@@ -1 +1,5 @@ - Meu primeiro repositório Git -+ -+A filosofia do Linux é 'Ria na face do perigo'. -+Ôpa. Errado. 'Faça você mesmo'. É, é essa. -+ -- Lunus Torvalds -diff --git a/porqueLinux.txt b/porqueLinux.txt -new file mode 100644 -index 0000000..8ecdfda ---- /dev/null -+++ b/porqueLinux.txt -@@ -0,0 +1,5 @@ -+Por que usar o Linux? -+ -+* É livre -+* É seguro -+* É customizavel -``` - -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 rencente para os seus ancestrais. - - -```bash -## Mostra referências para commits os ancentrais. -git reflog -``` - -``` -28205ac HEAD@{0}: commit: Adiciona frase do Linux Torvalds. -68a99fc HEAD@{1}: commit: Lista de inicial de o porquê usar o Linux. -e248651 HEAD@{2}: commit (initial): Cria arquivo com tÃtulo. -``` - - -```bash -## Adiciona e commita. -git add porqueLinux.txt -git commit -m "Novos argumentos." -``` - -``` -[master e57eeaf] Novos argumentos. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 4 insertions(+), 1 deletion(-) -``` - -O Git permite um nÃvel de rastreabilidade bem fino. Veja por exemplo que -é possÃvel saber quem modificou e quando cada linha do arquivo e qual o -correspondente *sha1* do *commit*. - - -```bash -## Mostra quem, onde e o que fez em cada arquivo. -git blame README.txt -``` - -``` -^e248651 (Teste 2015-10-01 16:36:58 -0300 1) Meu primeiro repositório Git -28205ac7 (Teste 2015-10-01 16:36:59 -0300 2) -28205ac7 (Teste 2015-10-01 16:36:59 -0300 3) A filosofia do Linux é 'Ria na face do perigo'. -28205ac7 (Teste 2015-10-01 16:36:59 -0300 4) Ôpa. Errado. 'Faça você mesmo'. É, é essa. -28205ac7 (Teste 2015-10-01 16:36:59 -0300 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 -``` - -``` -No ramo feature01 -nada a submeter, diretório de trabalho vazio -``` - - -```bash -## Histórico de commits. -git log --oneline -``` - -``` -e57eeaf Novos argumentos. -28205ac Adiciona frase do Linux Torvalds. -68a99fc Lista de inicial de o porquê usar o Linux. -e248651 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-10-01 16:36:59-- 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-10-01 16:36:59 (44,0 MB/s) - ‘vif.R’ saved [560/560] -``` - - -```bash -## Situação do repositório após o download. -git status -``` - -``` -No ramo feature01 -Arquivos não monitorados: - (utilize "git add <arquivo>..." para incluir o que será submetido) - - vif.R - -nada adicionado ao envio mas arquivos não registrados estão presentes (use "git add" to registrar) -``` - - -```bash -git add vif.R -git commit -m "Adiciona função R para VIF." -``` - -``` -[feature01 294a431] Adiciona função R para VIF. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 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 -``` - -``` -294a431 HEAD@{0}: commit: Adiciona função R para VIF. -e57eeaf HEAD@{1}: checkout: moving from master to feature01 -e57eeaf HEAD@{2}: commit: Novos argumentos. -28205ac HEAD@{3}: commit: Adiciona frase do Linux Torvalds. -68a99fc HEAD@{4}: commit: Lista de inicial de o porquê usar o Linux. -e248651 HEAD@{5}: commit (initial): Cria arquivo com tÃtulo. -``` - - -```bash -git status -``` - -``` -No ramo feature01 -nada a submeter, diretório de trabalho vazio -``` - -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 -``` - -``` -. -├── porqueLinux.txt -└── README.txt - -0 directories, 2 files -``` - -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. - - -```bash -## Mostra todas as modificações, cada linha modificada de cada arquivo. -git diff master feature01 -``` - -``` -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 e57eeaf..294a431 -Fast-forward - vif.R | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - create mode 100644 vif.R -``` - - -```bash -git log --oneline -``` - -``` -294a431 Adiciona função R para VIF. -e57eeaf Novos argumentos. -28205ac Adiciona frase do Linux Torvalds. -68a99fc Lista de inicial de o porquê usar o Linux. -e248651 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 -``` - -``` -294a431 HEAD@{0}: merge feature01: Fast-forward -e57eeaf HEAD@{1}: checkout: moving from feature01 to master -294a431 HEAD@{2}: commit: Adiciona função R para VIF. -e57eeaf HEAD@{3}: checkout: moving from master to feature01 -e57eeaf HEAD@{4}: commit: Novos argumentos. -28205ac HEAD@{5}: commit: Adiciona frase do Linux Torvalds. -68a99fc HEAD@{6}: commit: Lista de inicial de o porquê usar o Linux. -e248651 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 e57eeaf... Novos argumentos. -``` - - -```bash -## Qual a situação. -git status -``` - -``` -HEAD detached at e57eeaf -nada a submeter, diretório de trabalho vazio -``` - - -```bash -## O histório existente nesse ponto. -git log --name-only --oneline -``` - -``` -e57eeaf Novos argumentos. -porqueLinux.txt -28205ac Adiciona frase do Linux Torvalds. -README.txt -68a99fc Lista de inicial de o porquê usar o Linux. -porqueLinux.txt -e248651 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 e57eeaf) - 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 e57eeaf... Novos argumentos. -Switched to branch 'master' -``` - - -```bash -git status -``` - -``` -No ramo master -nada a submeter, diretório de trabalho vazio -``` - - -```bash -git log --oneline -``` - -``` -294a431 Adiciona função R para VIF. -e57eeaf Novos argumentos. -28205ac Adiciona frase do Linux Torvalds. -68a99fc Lista de inicial de o porquê usar o Linux. -e248651 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 -``` - -``` -294a431 HEAD@{0}: checkout: moving from e57eeaff9e77da94b22e5da043676a3cf70ed0b1 to master -e57eeaf HEAD@{1}: checkout: moving from master to HEAD@{4} -294a431 HEAD@{2}: merge feature01: Fast-forward -e57eeaf HEAD@{3}: checkout: moving from feature01 to master -294a431 HEAD@{4}: commit: Adiciona função R para VIF. -e57eeaf HEAD@{5}: checkout: moving from master to feature01 -e57eeaf HEAD@{6}: commit: Novos argumentos. -28205ac HEAD@{7}: commit: Adiciona frase do Linux Torvalds. -68a99fc HEAD@{8}: commit: Lista de inicial de o porquê usar o Linux. -e248651 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 e57eeaf... 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 e57eeaf -Arquivos não monitorados: - (utilize "git add <arquivo>..." para incluir o que será submetido) - - pimentel_racoes.txt - -nada adicionado ao envio mas arquivos não registrados estão presentes (use "git add" to registrar) -``` - - -```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 eb21436] Adiciona aquivo de dados de experimento com rações. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 24 insertions(+) - create mode 100644 pimentel_racoes.txt -``` - - -```bash -git status -``` - -``` -HEAD detached from e57eeaf -nada a submeter, diretório de trabalho vazio -``` - - -```bash -## Log num formato gráfico ASCII para mostrar o novo ramo. -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* eb21436 (HEAD) Adiciona aquivo de dados de experimento com rações. -| * 294a431 (master, feature01) Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 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 e57eeaf) - 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 -``` - -``` -* eb21436 (HEAD, feature02) Adiciona aquivo de dados de experimento com rações. -| * 294a431 (master, feature01) Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 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-10-01 16:37:00-- 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-10-01 16:37:00 (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 6737802] Arquivo sobre copa 2014 celeção brasileira. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 22 insertions(+) - create mode 100644 brasilCopa2014.txt -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* 6737802 (HEAD, feature01) Arquivo sobre copa 2014 celeção brasileira. -* 294a431 (master) Adiciona função R para VIF. -| * eb21436 (feature02) Adiciona aquivo de dados de experimento com rações. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 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 294a431..6737802 -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 -``` - -``` -* 9bf4962 (HEAD, master) Merge branch 'feature02' -|\ -| * eb21436 (feature02) Adiciona aquivo de dados de experimento com rações. -* | 6737802 (feature01) Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 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 6737802). -Deleted branch feature02 (was eb21436). -* master -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* 9bf4962 (HEAD, master) Merge branch 'feature02' -|\ -| * eb21436 Adiciona aquivo de dados de experimento com rações. -* | 6737802 Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 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-10-01 16:37:00-- 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-10-01 16:37:00 (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 981d1ee] Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 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 7546ee7] Arquivo de experimento em BIB. Cabeçalho em caixa alta. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 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 -``` - -``` -* 981d1ee (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -| * 7546ee7 (HEAD, master) Arquivo de experimento em BIB. Cabeçalho em caixa alta. -|/ -* 9bf4962 Merge branch 'feature02' -|\ -| * eb21436 Adiciona aquivo de dados de experimento com rações. -* | 6737802 Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 Cria arquivo com tÃtulo. -``` - - -```bash -## Dá mensagem de erro que informa o conflito. -git merge feature03 master -``` - - -``` -Mesclagem automática de bib1.txt -CONFLITO (adicionar/adicionar): conflito de mesclagem em bib1.txt -Automatic merge failed; fix conflicts and then commit the result. -``` - - -```bash -git status -``` - -``` -No ramo master -Você tem caminhos não mesclados. - (fixar conflitos e executar "git commit") - -Caminhos não mesclados: - (usar "git add <arquivo>..." para marcar resolução) - - ambos adicionaram: bib1.txt - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "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 -``` - -``` -No ramo master -Você tem caminhos não mesclados. - (fixar conflitos e executar "git commit") - -Caminhos não mesclados: - (usar "git add <arquivo>..." para marcar resolução) - - ambos adicionaram: bib1.txt - -nenhuma modificação adicionada à submissão (utilize "git add" e/ou "git commit -a") -``` - - -```bash -git add bib1.txt -git commit -m "Resolve conflito, trunca com caixa alta." -``` - -``` -[master f44bbdf] Resolve conflito, trunca com caixa alta. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author -``` - - -```bash -git status -``` - -``` -No ramo master -nada a submeter, diretório de trabalho vazio -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* f44bbdf (HEAD, master) Resolve conflito, trunca com caixa alta. -|\ -| * 981d1ee (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -* | 7546ee7 Arquivo de experimento em BIB. Cabeçalho em caixa alta. -|/ -* 9bf4962 Merge branch 'feature02' -|\ -| * eb21436 Adiciona aquivo de dados de experimento com rações. -* | 6737802 Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 Cria arquivo com tÃtulo. -``` - - -```bash -git reflog -``` - -``` -f44bbdf HEAD@{0}: commit (merge): Resolve conflito, trunca com caixa alta. -7546ee7 HEAD@{1}: commit: Arquivo de experimento em BIB. Cabeçalho em caixa alta. -9bf4962 HEAD@{2}: checkout: moving from feature03 to master -981d1ee HEAD@{3}: commit: Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -9bf4962 HEAD@{4}: checkout: moving from master to feature03 -9bf4962 HEAD@{5}: merge feature02: Merge made by the 'recursive' strategy. -6737802 HEAD@{6}: merge feature01: Fast-forward -294a431 HEAD@{7}: checkout: moving from feature01 to master -6737802 HEAD@{8}: commit: Arquivo sobre copa 2014 celeção brasileira. -294a431 HEAD@{9}: checkout: moving from feature02 to feature01 -eb21436 HEAD@{10}: checkout: moving from eb21436153d68107dacd3e47aca77773b91a1f42 to feature02 -eb21436 HEAD@{11}: commit: Adiciona aquivo de dados de experimento com rações. -e57eeaf HEAD@{12}: checkout: moving from master to HEAD@{6} -294a431 HEAD@{13}: checkout: moving from e57eeaff9e77da94b22e5da043676a3cf70ed0b1 to master -e57eeaf HEAD@{14}: checkout: moving from master to HEAD@{4} -294a431 HEAD@{15}: merge feature01: Fast-forward -e57eeaf HEAD@{16}: checkout: moving from feature01 to master -294a431 HEAD@{17}: commit: Adiciona função R para VIF. -e57eeaf HEAD@{18}: checkout: moving from master to feature01 -e57eeaf HEAD@{19}: commit: Novos argumentos. -28205ac HEAD@{20}: commit: Adiciona frase do Linux Torvalds. -68a99fc HEAD@{21}: commit: Lista de inicial de o porquê usar o Linux. -e248651 HEAD@{22}: commit (initial): Cria arquivo com tÃtulo. -``` - -## Trabalhando com cópias - - - - -```bash -git remote -v -``` - - -```bash -## Diretório na segunda que terá uma cópia em desenvolvimento do -## projeto. -pwd -``` - -``` -/home/est/acn13/maquina2 -``` - - -```bash -## Conteúdo. -tree -a -``` - -``` -. - -0 directories, 0 files -``` - - -```bash -## Clonando o projeto de outro lugar. -## $DIRGIT representa o caminho para chegar até meu1repo. -git clone "$DIRGIT/meu1repo/.git" && cd meu1repo -``` - -``` -Cloning into 'meu1repo'... -done. -``` - - -```bash -git status -``` - -``` -No ramo master -Your branch is up-to-date with 'origin/master'. - -nada a submeter, diretório de trabalho vazio -``` - - -```bash -## Conteúdo após clonar. -tree -``` - -``` -. -└── meu1repo - ├── bib1.txt - ├── brasilCopa2014.txt - ├── pimentel_racoes.txt - ├── porqueLinux.txt - ├── README.txt - └── vif.R - -1 directory, 6 files -``` - - -```bash -git remote -v -``` - -``` -origin /media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo/.git (fetch) -origin /media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo/.git (push) -``` - - -```bash -git log --oneline -``` - -``` -f44bbdf Resolve conflito, trunca com caixa alta. -7546ee7 Arquivo de experimento em BIB. Cabeçalho em caixa alta. -981d1ee Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -9bf4962 Merge branch 'feature02' -6737802 Arquivo sobre copa 2014 celeção brasileira. -eb21436 Adiciona aquivo de dados de experimento com rações. -294a431 Adiciona função R para VIF. -e57eeaf Novos argumentos. -28205ac Adiciona frase do Linux Torvalds. -68a99fc Lista de inicial de o porquê usar o Linux. -e248651 Cria arquivo com tÃtulo. -``` - - -```bash -git branch -a -``` - -``` -* master - remotes/origin/HEAD -> origin/master - remotes/origin/feature03 - remotes/origin/master -``` - - -```bash -git branch feature04 -git checkout feature04 -``` - -``` -Switched to branch 'feature04' -``` - - -```bash -## Tenta ir para o diretório downloads, se não conseguir é porque não -## existe então cria um diretório download para então entrar nele. -if [ -d downloads ] -then - echo "Diretório existe." - cd downloads -else - echo "Diretório não existe." - mkdir downloads - cd downloads -fi - -## Se não existir o aquivo diasbarros_feijao.txt, então baixar da -## internet. -if [ ! -f diasbarros_feijao.txt ] -then - echo "Arquivo diasbarros_feijao.txt não existe. Baixando..." - wget 'http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.txt' -else - echo "Arquivo diasbarros_feijao.txt já existe." -fi - -## Copiar o arquivo diasbarros_feijao.txt para o meu1repo (-v: verbose). -cp -v diasbarros_feijao.txt ~/maquina2/meu1repo/ -``` - -``` -Diretório existe. -Arquivo diasbarros_feijao.txt já existe. -“diasbarros_feijao.txt†-> “/home/est/acn13/maquina2/meu1repo/diasbarros_feijao.txt†-``` - - -```bash -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.txt' -``` - - -``` ---2015-10-01 16:37:02-- http://www.leg.ufpr.br/~walmes/data/diasbarros_feijao.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: 487 [text/plain] -Saving to: ‘diasbarros_feijao.txt’ - - 0K 100% 40,2M=0s - -2015-10-01 16:37:02 (40,2 MB/s) - ‘diasbarros_feijao.txt’ saved [487/487] -``` - - -```bash -git status -``` - -``` -No ramo feature04 -Arquivos não monitorados: - (utilize "git add <arquivo>..." para incluir o que será submetido) - - diasbarros_feijao.txt - -nada adicionado ao envio mas arquivos não registrados estão presentes (use "git add" to registrar) -``` - - -```bash -git add diasbarros_feijao.txt -git commit -m "Dados de experimento com feijão." -``` - -``` -[feature04 18912c0] Dados de experimento com feijão. - Committer: Teste <acn13@inf.ufpr.br> -Your name and email address were configured automatically based -on your username and hostname. Please check that they are accurate. -You can suppress this message by setting them explicitly: - - git config --global user.name "Your Name" - git config --global user.email you@example.com - -After doing this, you may fix the identity used for this commit with: - - git commit --amend --reset-author - - 1 file changed, 37 insertions(+) - create mode 100644 diasbarros_feijao.txt -``` - - -```bash -git push origin feature04 -``` - -``` -To /media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo/.git - * [new branch] feature04 -> feature04 -``` - -Volta para origem e verifica o que recebeu de contribuição. - - -```bash -pwd -``` - -``` -/media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo -``` - - -```bash -git status -``` - -``` -No ramo master -nada a submeter, diretório de trabalho vazio -``` - - -```bash -git branch -a -``` - -``` - feature03 - feature04 -* master -``` - -Opa! Tem um novo ramo. Vamos ver o que ele tem de diferente. - - -```bash -git diff --name-only feature04 master -``` - -``` -diasbarros_feijao.txt -``` - -Parece que chegou um arquivo novo. Vamos então mesclar ao master. - - -```bash -git merge feature04 master -``` - -``` -Updating f44bbdf..18912c0 -Fast-forward - diasbarros_feijao.txt | 37 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 37 insertions(+) - create mode 100644 diasbarros_feijao.txt -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* 18912c0 (HEAD, master, feature04) Dados de experimento com feijão. -* f44bbdf Resolve conflito, trunca com caixa alta. -|\ -| * 981d1ee (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -* | 7546ee7 Arquivo de experimento em BIB. Cabeçalho em caixa alta. -|/ -* 9bf4962 Merge branch 'feature02' -|\ -| * eb21436 Adiciona aquivo de dados de experimento com rações. -* | 6737802 Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 Cria arquivo com tÃtulo. -``` - - -```bash -pwd -``` - -``` -/home/est/acn13/maquina2/meu1repo -``` - - -```bash -git pull origin master -``` - -``` -From /media/acn13/- Arquivos -/Projetos_GIT/apostila-git/meu1repo/ - * branch master -> FETCH_HEAD - f44bbdf..18912c0 master -> origin/master -Already up-to-date. -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -* 18912c0 (HEAD, origin/master, origin/feature04, origin/HEAD, feature04) Dados de experimento com feijão. -* f44bbdf (master) Resolve conflito, trunca com caixa alta. -|\ -| * 981d1ee (origin/feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -* | 7546ee7 Arquivo de experimento em BIB. Cabeçalho em caixa alta. -|/ -* 9bf4962 Merge branch 'feature02' -|\ -| * eb21436 Adiciona aquivo de dados de experimento com rações. -* | 6737802 Arquivo sobre copa 2014 celeção brasileira. -* | 294a431 Adiciona função R para VIF. -|/ -* e57eeaf Novos argumentos. -* 28205ac Adiciona frase do Linux Torvalds. -* 68a99fc Lista de inicial de o porquê usar o Linux. -* e248651 Cria arquivo com tÃtulo. -``` - - -```bash -git log --stat -``` - -``` -commit 18912c0e8b397bbb1e0b22e9710bb6061c317725 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:02 2015 -0300 - - Dados de experimento com feijão. - - diasbarros_feijao.txt | 37 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 37 insertions(+) - -commit f44bbdf3d63290cdd205a1fe5908413e63a660cd -Merge: 7546ee7 981d1ee -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Resolve conflito, trunca com caixa alta. - -commit 7546ee745916c955baec2e6116ffccc9f6cdf443 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Arquivo de experimento em BIB. Cabeçalho em caixa alta. - - bib1.txt | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 58 insertions(+) - -commit 981d1eed5a20f296261cab67aaea499ecbc6ac05 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. - - bib1.txt | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 58 insertions(+) - -commit 9bf49622914702c9b2de0006217792609bebca0b -Merge: 6737802 eb21436 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Merge branch 'feature02' - -commit 67378029fe8eed356c99df88db746a73e9c9d8ad -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Arquivo sobre copa 2014 celeção brasileira. - - brasilCopa2014.txt | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -commit eb21436153d68107dacd3e47aca77773b91a1f42 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Adiciona aquivo de dados de experimento com rações. - - pimentel_racoes.txt | 24 ++++++++++++++++++++++++ - 1 file changed, 24 insertions(+) - -commit 294a43144efcf8c7aab402eab86920ae55af1647 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:59 2015 -0300 - - Adiciona função R para VIF. - - vif.R | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -commit e57eeaff9e77da94b22e5da043676a3cf70ed0b1 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:59 2015 -0300 - - Novos argumentos. - - porqueLinux.txt | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 28205ac71a0e20ee32673e9883226eb25c3053d7 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:59 2015 -0300 - - Adiciona frase do Linux Torvalds. - - README.txt | 4 ++++ - 1 file changed, 4 insertions(+) - -commit 68a99fcb5cd57195651f99f7a4e35bb8c0a0acfb -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:59 2015 -0300 - - Lista de inicial de o porquê usar o Linux. - - porqueLinux.txt | 5 +++++ - 1 file changed, 5 insertions(+) - -commit e2486515a9e75bf8e9e2e38e63e557c32ad887bf -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:36:58 2015 -0300 - - Cria arquivo com tÃtulo. - - README.txt | 1 + - 1 file changed, 1 insertion(+) -``` - - -```bash -git log -p -2 -``` - -``` -commit 18912c0e8b397bbb1e0b22e9710bb6061c317725 -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:02 2015 -0300 - - Dados de experimento com feijão. - -diff --git a/diasbarros_feijao.txt b/diasbarros_feijao.txt -new file mode 100644 -index 0000000..2525ebf ---- /dev/null -+++ b/diasbarros_feijao.txt -@@ -0,0 +1,37 @@ -+## Teor proteico avaliado em 10 cultivares de feijoeiro e 1 de soja em -+## um ensaio em DIC com 3 repetições. Dias & Barros, Biometria -+## Experimental, pg 222. -+cultivar rept teorProt -+1 1 27.2 -+1 2 26.1 -+1 3 26.2 -+2 1 26.6 -+2 2 26.7 -+2 3 26.7 -+3 1 29.5 -+3 2 29.4 -+3 3 29.5 -+4 1 30.9 -+4 2 31.3 -+4 3 31.4 -+5 1 27.7 -+5 2 27.9 -+5 3 27.3 -+6 1 33.7 -+6 2 33.5 -+6 3 33.3 -+7 1 28.4 -+7 2 28.5 -+7 3 28.3 -+8 1 27.3 -+8 2 27.3 -+8 3 27.4 -+9 1 30.1 -+9 2 30.2 -+9 3 29.9 -+10 1 22.4 -+10 2 21.7 -+10 3 22.3 -+11 1 45.7 -+11 2 45.9 -+11 3 46.3 - -commit f44bbdf3d63290cdd205a1fe5908413e63a660cd -Merge: 7546ee7 981d1ee -Author: Teste <acn13@inf.ufpr.br> -Date: Thu Oct 1 16:37:00 2015 -0300 - - Resolve conflito, trunca com caixa alta. -``` - - - -**** -## Ignorando arquivos e diretórios - -Há momentos em que é necessário a criação de arquivos e pastas, dentro do -repositório git, que não devem ser versionados, como é o caso de uma -compilação Latex, que gera arquivos auxiliares que não é preciso deixar -disponÃvel a terceiros. Para esse intuito, o git possui um recurso que permite -que arquivos e pastas fiquem "invisÃveis" para o software. - -Para que isso ocorra, é indispensável a criação de um arquivo com extensão -`.gitignore`, que o git irá reconhecer e efetuar leitura a procura de -pastas e arquivos a ignorar. Dentro deste arquivo, é imprescindÃvel que seja -escrito, por linha, somente um nome de pasta ou arquivo a ser ignorado. - -### Padrões de formatos para o `.gitignore` - -* Linhas em branco não são lidas, servindo apenas como modo de separar e -organizar o arquivo. - -* Os caracteres ` # ` e ` ! ` são reservado do git. Para pastas ou arquivos -que os nomes comecem com ` # ` (Exemplo: #git.txt) ou ` ! ` (Exemplo: !git.txt), -deve-se usar uma barra invertida na frente do padrão (Exemplo: \\#ddd.txt, \\!ddd.txt). - -* O caracter ` # ` serve para efetuar comentários, ou seja, a linha que iniciar com `#` -não será interpretada pelo git. - -* O caracter `!` serve para negar um padrão, por exemplo, pode-se mandar o git -ignorar todos os arquivos de determinada pasta (Usando: Nome_Dir/*), -mas deixar de ignorar um arquivo especÃfico dentro dela -(Exemplo: !Nome_Dir/Arquivo.txt). - -* O asterisco ` * ` pode ser usado para substituir parte do nome de -arquivos e pastas, ou o nome inteiro. Isso é valido também para a -extensão do arquivo. - -* Um diretório pode ser ignorado adicionando seu nome e uma barra ao final deste. - -* Dois asteriscos ` ** ` podem ser usados para substituir caminhos de subpastas, -como por exemplo, para ignorar o diretório Subpasta, -o caminho `/Exercicio/Teste/Pasta/Subpasta/` pode ser substituido por `/**/Subpasta/`. - - -### Exemplo - -O código abaixo é um exemplo de um arquivo com extensão `.gitignore`: - - -```sh -# Esta linha é um comentário. - -# Ignorando arquivos com extensão .aux menos o arquivo EXEMPLO.aux: - -*.aux -!EXEMPLO.aux - -# Ignorando todos os arquivos com nome EXEMPLO: - -EXEMPLO.* - -# Ignorando arquivos que possuam HTML no nome: - -HTML*.* - -# Ignorando as Subpastas e os arquivos da pasta DIR: - -DIR/* - -# Não ignorar apenas a Subpasta1 da pasta DIR: - -!DIR/Subpasta1/ - -``` - -Vale ressaltar que, no exemplo acima, por mais que esteja sendo ignorado arquivos -com o nome EXEMPLO, e arquivos com extensão .aux, -o arquivo EXEMPLO.aux (que está pecedido do sinal `!`) não será ignorado. - -### Tornando Global - -Cada vez que cria-se um novo projeto, para que arquivos sejam ignorados, -deve-se criar um novo arquivo `.gitignore`. Para que isso não ocorra, e -possÃvel configurar o arquivo globalmente, ou seja, ele estará incorporado -as configurações do git do seu computador. - - - -```sh -git config --global core.excludesfile ~/.gitignore_global -``` - - Depois de executar o código acima, o `.gitignore` da pasta atual - (pasta do seu projeto) será atribuido como global no arquivo de - configuração do git (`.gitconfig`). - - Uma observação importante a ser feita é que, se adicionado arquivos para - serem ignorados globalmente, como arquivos PDF (Usando: *.pdf), por exemplo, - todos os arquivos com essa extensão serão ignorados pelo git, - não somente os do projeto atual. - Portanto, é recomendado somente definir um `.gitignore` como global, - se ele apenas desconsiderar arquivos auxiliares, ou seja, que não serão necessários - para compilações futuras. - -**** -## Autenticando em contas do GitLab (c3sl) e GitHub - -Os procedimentos dessa sessão tem o objetivo de promover o conexão da -sua máquina de trabalho com sua conta no GitLab do c3sl (alunos UFPR) ou -conta do GitHub. Assume-se, logicamente, que você tenha conta em algum -desses serviços. Caso você não tenha uma conta em algum serviço de -hospedagem de repsitório Git, seguem algumas opções: - - * GitHub: <https://github.com/> - * GitLab: <https://about.gitlab.com/> - * Bitbucket: <https://bitbucket.org/> - -Uma comparação entre os serviços disponÃveis para Git está disponÃvel em -[git-hosting-services-compared][]. - -Abra o terminal em qualquer diretório. Não precisa ser um diretório -Git. Aqui será criado um par de chaves, que nada mais são que longas -cadeias de caracteres, de forma que elas formam um par -chave/cadeado. A pública (a chave) é copiada para o servidor. A privada -fica na sua máquina. Dessa maneira, a comunicação para transferência de -dados entre as máquinas pode ser feita. - -Será solicitado uma senha (`passphrase`). Você pode forncer uma ou -apenas pressionar `Enter` para correr o procedimento padrão. O resultado -é uma senha gráfica ASCII além de gerar os arquivos (chaves) cujo -caminho é informado no *output*. - - -```sh -## keygen (chave gerar). rsa é o tipo. -ssh-keygen -t rsa -C "batman@justiceleague.org" -``` - -``` -Generating public/private rsa key pair. -Enter file in which to save the key (/home/batman/.ssh/id_rsa): -Enter passphrase (empty for no passphrase): -Enter same passphrase again: -Your identification has been saved in /home/batman/.ssh/id_rsa. -Your public key has been saved in /home/batman/.ssh/id_rsa.pub. -The key fingerprint is: -66:c1:0b:3a:94:25:83:00:81:9f:40:26:f7:aa:af:3a batman@justiceleague.org -The key's randomart image is: - +--[ RSA 2048]----+ - | | - ~MMMMMMMMMMMM MMMMMMMMMMMM~ - .MMMMMMMMM. MMM .MMMMMMMMM. - MMMMMMMMMMMMMMMMMMMMMMMMMMM - MMMMMMMMMMMMMMMMMMMMMMMMM - .MMMMMMMMMMMMMMMMMMMMMMMMM. - .MMMMMMMMM. - .MMM. - M - | | - +-----------------+ -``` - -O importante é o conteúdo do arquivo `/home/batman/.ssh/id_rsa.pub`, a -sua chave pública. Este deve ser fornecido ao GitLab (ou GitHub) em uma -janela com as chaves. Os endereços abaixo levam para a mencionada -janela. Requer que esteja logado. - - * GitLab: <http://gitab.c3sl.ufpr.br/profile/keys> - * GitHub: <https://github.com/settings/ssh> - -Nessa janela deverá ser informado o código gerado pelo -`ssh-keygen`. Você deve copiar o texto do arquivo -`/home/batman/.ssh/id_rsa.pub`, sem moficá-lo, e fornecer ao GitLab. -Para ver/abrir o conteúdo do arquivo no próprio terminal use `less` ou -`cat`. Para copiar do terminal use `ctrl+shift+c`. Para abrir com um -editor de texto, o `gedit` por exemplo, é só passar o nome do arquivo. - -```sh -## Abre o arquivo com o editor de texto Gedit. -gedit /home/batman/.ssh/id_rsa.pub - -## Mostra o conteúdo do arquivo no próprio terminal. -less /home/batman/.ssh/id_rsa.pub -``` - -``` -ssh-rsa BBBBB3NzaC1yc2EAAAADAQABAAABAQDDuQmvkQ0WgwYQvR16z37tG37Q61ID+Qf4hi8+cARjjSWP7015CAtRnCvmGFSbdFMjz3ZEkp2XzHIyRCKw2hLP57rkFcfioWra6N5/9+z+tPiwr2OzwLfk7J/GAETGA4rtoToV96hf5RvKRhvuqyO5uf5ouBILm1PRpjA/5AkfToWp25/7WC136eGIOSJMFgQ3OuK5U+qSXAwuSdu9Uj1XkVYFDjasA45ZjsnkE6L9bKiYymadshEbWEBHJAWqDErd8srMtBYS/2hodNnjfH7rNHHCo8wZD5GJFz7YUodaBSaSYuHVfrEryaEm/r5787CAiecFAjWEeVq6StM7N/lz batman@justiceleague.org -``` - -Para conferir a comunicação da sua máquina com o servidor do GitLab do -c3sl ou do GitHub, aplique a instrução `ssh` abaixo. - -```sh -## Com gitlab do c3sl. -ssh -T git@gitlab.c3sl.ufpr.br -``` - -``` -Welcome to GitLab, Knight Rider! -``` - -```sh -## Com github. -ssh -T git@github.com -``` - -``` -Hi batman! You've successfully authenticated, but GitHub does not provide shell access. -``` - -Em caso de obter uma mensagem não positiva, repita o comando com a opção -`-v` para um log do procedimento. - -```sh -## Com gitlab do c3sl. -ssh -vT git@github.com -``` - -``` -OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 -debug1: Reading configuration data /etc/ssh/ssh_config -debug1: /etc/ssh/ssh_config line 19: Applying options for * -debug1: Connecting to github.com [192.30.252.130] port 22. -debug1: Connection established. -debug1: identity file /home/batman/.ssh/id_rsa type 1 -debug1: identity file /home/batman/.ssh/id_rsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_dsa type -1 -debug1: identity file /home/batman/.ssh/id_dsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_ecdsa type -1 -debug1: identity file /home/batman/.ssh/id_ecdsa-cert type -1 -debug1: identity file /home/batman/.ssh/id_ed25519 type -1 -debug1: identity file /home/batman/.ssh/id_ed25519-cert type -1 -debug1: Enabling compatibility mode for protocol 2.0 -debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3 -debug1: Remote protocol version 2.0, remote software version libssh-0.7.0 -debug1: no match: libssh-0.7.0 -debug1: SSH2_MSG_KEXINIT sent -debug1: SSH2_MSG_KEXINIT received -debug1: kex: server->client aes128-ctr hmac-sha1 none -debug1: kex: client->server aes128-ctr hmac-sha1 none -debug1: sending SSH2_MSG_KEX_ECDH_INIT -debug1: expecting SSH2_MSG_KEX_ECDH_REPLY -debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 -debug1: Host 'github.com' is known and matches the RSA host key. -debug1: Found key in /home/batman/.ssh/known_hosts:1 -debug1: ssh_rsa_verify: signature correct -debug1: SSH2_MSG_NEWKEYS sent -debug1: expecting SSH2_MSG_NEWKEYS -debug1: SSH2_MSG_NEWKEYS received -debug1: Roaming not allowed by server -debug1: SSH2_MSG_SERVICE_REQUEST sent -debug1: SSH2_MSG_SERVICE_ACCEPT received -debug1: Authentications that can continue: publickey -debug1: Next authentication method: publickey -debug1: Offering RSA public key: /home/batman/.ssh/id_rsa -debug1: Server accepts key: pkalg ssh-rsa blen 279 -debug1: Authentication succeeded (publickey). -Authenticated to github.com ([192.30.252.130]:22). -debug1: channel 0: new [client-session] -debug1: Entering interactive session. -debug1: Sending environment. -debug1: Sending env LC_PAPER = pt_BR.UTF-8 -debug1: Sending env LC_ADDRESS = pt_BR.UTF-8 -debug1: Sending env LC_MONETARY = pt_BR.UTF-8 -debug1: Sending env LC_NUMERIC = pt_BR.UTF-8 -debug1: Sending env LC_TELEPHONE = pt_BR.UTF-8 -debug1: Sending env LC_IDENTIFICATION = pt_BR.UTF-8 -debug1: Sending env LANG = en_US.UTF-8 -debug1: Sending env LC_MEASUREMENT = pt_BR.UTF-8 -debug1: Sending env LC_TIME = pt_BR.UTF-8 -debug1: Sending env LC_NAME = pt_BR.UTF-8 -debug1: client_input_channel_req: channel 0 rtype exit-status reply 0 -Hi batman! You've successfully authenticated, but GitHub does not provide shell access. -debug1: channel 0: free: client-session, nchannels 1 -Transferred: sent 3856, received 1784 bytes, in 0.4 seconds -Bytes per second: sent 10261.9, received 4747.7 -debug1: Exit status 1 -``` - -### Requisições de mescla - -### Colaborando via fork - -**** -## Modelos de fluxos de trabalho - -<!-- -Inspiração: - -https://git-scm.com/book/pt-br/v1/Git-Distribu%C3%ADdo-Fluxos-de-Trabalho-Distribu%C3%ADdos -http://imasters.com.br/gerencia-de-ti/fluxo-de-desenvolvimento-com-gitflow/ -http://www.magentonapratica.com.br/2014/07/um-modelo-bem-sucedido-de-ramificacao.html ---> - -**** -## Usando ferramentas gráficas para o Git - -### Git GUI - -### Gitk - -### Meld - -**** -## Dicionário de termos - -<!---------------------------------------------------------------------- --> -<!-- 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/ -- GitLab