diff --git a/.gitignore b/.gitignore index b4161d80e502c256f02d457b82e8dded6b351566..544446e73bb97ac8a97756f291abfb52a989929e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,7 @@ downloads/* *.orig apostila-git.Rproj /apostila_git.toc -/cap05.md +/apostila_git.lol +cap*.md +cap*.pdf +cap*.tex diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 051ff87d253adf964aca03e2f263d15057093e15..48e113bc05dd30d4f1d0a02e1022b404a5da3ccc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,138 +1,138 @@ -Guia de contribuição -==================== - -Esse é um projeto público do PET EstatÃstica aberto a -colaboradores. Para que a colaboração seja bem sucedida, seguem algumas -intruções e recomendações. - -## O funcionamento - -O núcleo do tutorial é o arquivo `git_tuto.Rmd`. O arquivo `Rmd` é -marcado por ser escrito com sintaxe [markdown][] com fragmentos de -código R. Os fragmentos de código R são interpretados durante a -compilação feita com a função `render` do pacote [rmarkdown][]. Por ser -escrito em markdown, o tutorial pode ser compilado em formatos como markdown (`.md`), html e PDF. - -Apesar de `Rmd` normalmente ter fragmentos de código R, nesse tutorial -predominam fragmentos de código shell, em outras palavras, são -fragmentos de código executados do terminal do Linux. Para ter um -fragmento de código shell que seja interpretado na compilação, tem-se -que fazê-lo conforme abaixo. - - ```{r, engine="sh"} - comando shell - ``` - -A compilação desse documento cria sempre um projeto Git do zero. Com -intruções do shell ao longo do documento, no instante da compilação, -arquivos são criados, adicionados (`git add`), commitados (`git -commit`), moficados, etc. Esse documento é, portanto, um documento -reproduzÃvel. - -Para compilar o documento você deve abrir uma sessão R onde o diretório -de trabalho é o que contém o arquivo `git_tuto.Rmd` e rodar uma chamada -da função render. Usuários do RStudio podem fazer isso diretamente pelo -botão de compilar, presente na barra de ferramentas. - - ```{r, engine="sh"} - library(rmarkdown) - - render("git_tuto.Rmd") - ``` - -Os diretórios criados durante a compilação são sempre apagados, para que ao -compilar novamente, tudo seja reproduzido. O projeto deve recriar tudo e -é essa a intenção, apesar do custo. Se os diretórios não fossem -deletados antes de uma nova compilação, iria-se receber erros de -compilação. - -Esse documento usa instruções no terminal que podem ser particulares do -Linux, como o comando `tree` e `sed`. Portando, a reprodutibilidade da -compilação pode não acontecer em outros sistemas operacionais. - -## O fluxo de trabalho - -Esse projeto terá dois ramos persistentes: - - * `devel`: que irá receber imediatamente a contribuição dos - membros e será submetido a teste (no caso compilação). Se bem - sucedido, a contribuição é movida para o ramo `master`. - * `master`: que recebe a versão estável do projeto. - -Os membros devem criar ramos de demanda para adicionarem suas -contribuições. Por exemplo, se existe a demanda (*issue*) de acrescentar uma -sessão sobre o uso do programa `meld` para resolver conflitos de merge, -deve-se criar um ramo para isso, adicionar as contribuições e subir esse -ramo para o repositório remoto. Os *issues* criados no GitLab são -automaticamente numerados. Para nosso benefÃcio, vamos usar o mesmo -número ao criar os *branches* para atender as correspondentes -demandas. Vamos usar o padrão `issue#?` em que `?` representa o número -do *issue*. - -```sh -git branch -b issue#3 - -... trabalha, git add, git commit ... -... trabalha, git add, git commit ... -... trabalha, git add, git commit ... - -git push origin issue#3 -``` - -Assim que der o `git push`, a próxima etapa é fazer uma requisição de -*merge*. Isso se faz pela interface do GitLab clicando em -[merge request][] no menu da esquerda, dentro da página do projeto, e -depois no botão *New Merge Request*. Lá é onde se designa o responsável -por avaliar e aplicar o *merge* e quais os *branches* envolvidos -(doador/receptor). - -Existe apenas uma regra que jamais deve ser quebrada: - -> Nunca dê `push` para os ramos `devel` e `master`. - -Esses ramos se receberão conteúdo provenientes de *merge* dos ramos de -demanda (*issue*). - -## Mensagens de commit - -É extremamente recomendado, por questões de organização e produtividade, -que as mensagens de commit sejam apropriadas. Não use mensagens vagas ou -óbvias do tipo *Modificações feitas*, *Arquivos incluÃdos*. Procure algo -como *Incluà arquivo de estilo CSS*, *Modifica preâmbulo*, *Troca -'require' por 'library'* ([5 dicas para melhores commits][]). - -Exitem formas especiais de escrever um *commit* que tenha ações do -repositório remoto como fechar um *issue* ou fazer uma referência a -outro *commit* ([ações nas mensagens de commit][]). As palavras -especiais são: `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, -`resolve`, `resolves`, `resolved`. Depois das palavras vem uma -identificação de *issue* ou *sha1*. - -```sh -git commit -m "Close #4. Bug devido ao encoding." -``` - -Visite para mais dicas de como escrever um *commit*: -[como-escrever-boas-mensagens-de-commit][] - -## Escrita do código - -Recomensa-se fortemente que ao escrever o código, não se ultrapasse 72 -caracteres por linha. Isso torna o texto/código mais legÃvel nos -arquivos fontes. Linhas longas são difÃceis de ler nos monitores atuais, -que possuem uma tela grande. - -Editores de texto (de verdade) geralmente possuem formas de auto quebrar -linhas, auto indentar/acomodar ou sinalizar a margem direita. O Emacs -tem [auto break lines][] e [refluxo de texto][]. Outros editores -permitem exibir uma linha vertical para indicar o limite, como o RStudio -(> Tools > Global Options > Code > Display > Margin column). - -[markdown]: http://br-mac.org/2013/09/o-que-e-markdown.html -[rmarkdown]: http://rmarkdown.rstudio.com/ -[merge request]: https://gitlab.c3sl.ufpr.br/pet-estatistica/git-tutorial/merge_requests -[ações nas mensagens de commit]: https://help.github.com/articles/closing-issues-via-commit-messages/ -[5 dicas para melhores commits]: https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message -[auto break lines]: http://emacswiki.org/emacs/LineWrap -[refluxo de texto]: http://www.emacswiki.org/emacs/FillParagraph -[como-escrever-boas-mensagens-de-commit]: http://blog.diovani.com/post/101092814586/como-escrever-boas-mensagens-de-commit +Guia de contribuição +==================== + +Esse é um projeto público do PET EstatÃstica aberto a +colaboradores. Para que a colaboração seja bem sucedida, seguem algumas +instruções e recomendações. + +## O funcionamento + +O núcleo do tutorial é o arquivo `git_tuto.Rmd`. O arquivo `Rmd` é +marcado por ser escrito com sintaxe [markdown][] com fragmentos de +código R. Os fragmentos de código R são interpretados durante a +compilação feita com a função `render` do pacote [rmarkdown][]. Por ser +escrito em markdown, o tutorial pode ser compilado em formatos como markdown (`.md`), html e PDF. + +Apesar de `Rmd` normalmente ter fragmentos de código R, nesse tutorial +predominam fragmentos de código shell, em outras palavras, são +fragmentos de código executados do terminal do Linux. Para ter um +fragmento de código shell que seja interpretado na compilação, tem-se +que fazê-lo conforme abaixo. + + ```{r, engine="sh"} + comando shell + ``` + +A compilação desse documento cria sempre um projeto Git do zero. Com +instruções do shell ao longo do documento, no instante da compilação, +arquivos são criados, adicionados (`git add`), commitados (`git +commit`), modificados, etc. Esse documento é, portanto, um documento +reproduzÃvel. + +Para compilar o documento você deve abrir uma sessão R onde o diretório +de trabalho é o que contém o arquivo `git_tuto.Rmd` e rodar uma chamada +da função render. Usuários do RStudio podem fazer isso diretamente pelo +botão de compilar, presente na barra de ferramentas. + + ```{r, engine="sh"} + library(rmarkdown) + + render("git_tuto.Rmd") + ``` + +Os diretórios criados durante a compilação são sempre apagados, para que ao +compilar novamente, tudo seja reproduzido. O projeto deve recriar tudo e +é essa a intenção, apesar do custo. Se os diretórios não fossem +deletados antes de uma nova compilação, iria-se receber erros de +compilação. + +Esse documento usa instruções no terminal que podem ser particulares do +Linux, como o comando `tree` e `sed`. Portando, a reprodutibilidade da +compilação pode não acontecer em outros sistemas operacionais. + +## O fluxo de trabalho + +Esse projeto terá dois ramos persistentes: + + * `devel`: que irá receber imediatamente a contribuição dos + membros e será submetido a teste (no caso compilação). Se bem + sucedido, a contribuição é movida para o ramo `master`. + * `master`: que recebe a versão estável do projeto. + +Os membros devem criar ramos de demanda para adicionarem suas +contribuições. Por exemplo, se existe a demanda (*issue*) de acrescentar uma +sessão sobre o uso do programa `meld` para resolver conflitos de merge, +deve-se criar um ramo para isso, adicionar as contribuições e subir esse +ramo para o repositório remoto. Os *issues* criados no GitLab são +automaticamente numerados. Para nosso benefÃcio, vamos usar o mesmo +número ao criar os *branches* para atender as correspondentes +demandas. Vamos usar o padrão `issue#?` em que `?` representa o número +do *issue*. + +```sh +git branch -b issue#3 + +... trabalha, git add, git commit ... +... trabalha, git add, git commit ... +... trabalha, git add, git commit ... + +git push origin issue#3 +``` + +Assim que der o `git push`, a próxima etapa é fazer uma requisição de +*merge*. Isso se faz pela interface do GitLab clicando em +[merge request][] no menu da esquerda, dentro da página do projeto, e +depois no botão *New Merge Request*. Lá é onde se designa o responsável +por avaliar e aplicar o *merge* e quais os *branches* envolvidos +(doador/receptor). + +Existe apenas uma regra que jamais deve ser quebrada: + +> Nunca dê `push` para os ramos `devel` e `master`. + +Esses ramos se receberão conteúdo provenientes de *merge* dos ramos de +demanda (*issue*). + +## Mensagens de commit + +É extremamente recomendado, por questões de organização e produtividade, +que as mensagens de commit sejam apropriadas. Não use mensagens vagas ou +óbvias do tipo *Modificações feitas*, *Arquivos incluÃdos*. Procure algo +como *Incluà arquivo de estilo CSS*, *Modifica preâmbulo*, *Troca +'require' por 'library'* ([5 dicas para melhores commits][]). + +Exitem formas especiais de escrever um *commit* que tenha ações do +repositório remoto como fechar um *issue* ou fazer uma referência a +outro *commit* ([ações nas mensagens de commit][]). As palavras +especiais são: `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, +`resolve`, `resolves`, `resolved`. Depois das palavras vem uma +identificação de *issue* ou *sha1*. + +```sh +git commit -m "Close #4. Bug devido ao encoding." +``` + +Visite para mais dicas de como escrever um *commit*: +[como-escrever-boas-mensagens-de-commit][] + +## Escrita do código + +Recomenda-se fortemente que ao escrever o código, não se ultrapasse 72 +caracteres por linha. Isso torna o texto/código mais legÃvel nos +arquivos fontes. Linhas longas são difÃceis de ler nos monitores atuais, +que possuem uma tela grande. + +Editores de texto (de verdade) geralmente possuem formas de auto quebrar +linhas, auto indentar/acomodar ou sinalizar a margem direita. O Emacs +tem [auto break lines][] e [refluxo de texto][]. Outros editores +permitem exibir uma linha vertical para indicar o limite, como o RStudio +(> Tools > Global Options > Code > Display > Margin column). + +[markdown]: http://br-mac.org/2013/09/o-que-e-markdown.html +[rmarkdown]: http://rmarkdown.rstudio.com/ +[merge request]: https://gitlab.c3sl.ufpr.br/pet-estatistica/git-tutorial/merge_requests +[ações nas mensagens de commit]: https://help.github.com/articles/closing-issues-via-commit-messages/ +[5 dicas para melhores commits]: https://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message +[auto break lines]: http://emacswiki.org/emacs/LineWrap +[refluxo de texto]: http://www.emacswiki.org/emacs/FillParagraph +[como-escrever-boas-mensagens-de-commit]: http://blog.diovani.com/post/101092814586/como-escrever-boas-mensagens-de-commit diff --git a/README.md b/README.md index b54ed0ae04501c248bab99ed83e10b735de9abb6..d81a2b5eff91e97444344831ff2d289d888000ef 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,37 @@ -Tutorial de Git -=============== +Apostila Git +============ + +PET EstatÃstica UFPR O [Git][] é um sistema de controle de versão distribuÃdo cuja finalidade é permitir que muitas pessoas colaborem no mesmo projeto facilmente "juntando" as contribuições dos membros e incorporando ao projeto com o mÃnimo de esforço possÃvel. -Esse projeto tem a finalidade de aprofundar o conhecimento do Git e -documentar tal aprendizado em uma apostila que seja útil tanto para -iniciantes quanto para usuários intermediários. - -O projeto é desenvolvido no serviço GitLab do C3SL e acessado pelo link: - -<https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git> +Esse projeto tem a finalidade de aprofundar o conhecimento do sistema de +controle de versões Git e documentar o aprendizado em uma apostila que +seja útil tanto para iniciantes quanto para usuários intermediários. -Todas as contribuições ao projeto são bem vindas, tanto por meio de -[issue][] quando por *fork*. +O projeto é desenvolvido no serviço [GitLab do C3SL] e também na +organização [PET EstatÃstica no GitHub]. Todas as contribuições ao +projeto são bem vindas, tanto por meio de [issue][] quando por *fork* em +qualquer um das plataformas (GitLab ou GitHub). -**PET EstatÃstica UFPR** +Os autores na primeira edição da apostila (*tag* [week08]) foram: - * [Alessandra Zeizer Dimas](https://gitlab.c3sl.ufpr.br/u/pazd11) - * [Ângela Luiza Cunha Legey](https://gitlab.c3sl.ufpr.br/u/alcl12) - * [Daniel Ikenaga](https://gitlab.c3sl.ufpr.br/u/di12) - * [Eduardo Elias Ribeiro Junior](https://gitlab.c3sl.ufpr.br/u/eerj12) - * [Gabriel Sartori Klostermann](https://gitlab.c3sl.ufpr.br/u/gsk12) - * [Jhenifer Caetano Veloso](https://gitlab.c3sl.ufpr.br/u/jcv13) + * [Alcides Conte Neto](https://gitlab.c3sl.ufpr.br/u/13) - + colaborador; + * [Alessandra Zeizer Dimas](https://gitlab.c3sl.ufpr.br/u/pazd11); + * [Ângela Luiza Cunha Legey](https://gitlab.c3sl.ufpr.br/u/alcl12); + * [Daniel Ikenaga](https://gitlab.c3sl.ufpr.br/u/di12); + * [Eduardo Elias Ribeiro Junior](https://gitlab.c3sl.ufpr.br/u/eerj12); + * [Gabriel Sartori Klostermann](https://gitlab.c3sl.ufpr.br/u/gsk12); + * [Jhenifer Caetano Veloso](https://gitlab.c3sl.ufpr.br/u/jcv13); + * [Walmes Marques Zeviani](https://gitlab.c3sl.ufpr.br/u/walmes) - + tutor. [Git]: https://git-scm.com/book/pt-br/v1/Primeiros-passos-No%C3%A7%C3%B5es-B%C3%A1sicas-de-Git -[issue]: https://gitlab.c3sl.ufpr.br/pet-estatistica/git-tutorial/issues \ No newline at end of file +[issue]: https://gitlab.c3sl.ufpr.br/pet-estatistica/git-tutorial/issues +[GitLab do C3SL]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git +[PET EstatÃstica no GitHub]: https://github.com/pet-estatistica +[week08]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week08 diff --git a/apostila_git.pdf b/apostila_git.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a0e2424eea354ce2154eeb67e361a04d2b13e979 Binary files /dev/null and b/apostila_git.pdf differ diff --git a/apostila_git.tex b/apostila_git.tex index 2ee48475a18b416dadbca675338436dde44106e3..f71350a0e8b7f4020104f41bef81139e430adbca 100644 --- a/apostila_git.tex +++ b/apostila_git.tex @@ -1,6 +1,7 @@ \documentclass[ - a5paper, - pagesize, + % a5paper, + a4paper, + % pagesize, 9pt, % bibtotoc, pointlessnumbers, @@ -47,7 +48,7 @@ }{} %----------------------------------------------------------------------- -% knitr. +% knitr quando faz render em Rmd para gerar tex. \usepackage{color} \usepackage{fancyvrb} @@ -73,6 +74,58 @@ \newcommand{\ErrorTok}[1]{\textbf{{#1}}} \newcommand{\NormalTok}[1]{{#1}} +%----------------------------------------------------------------------- +% knitr quando faz knit em Rnw para gerar tex + +% \usepackage[]{graphicx}\usepackage[]{color} +% \makeatletter +% \def\maxwidth{ % +% \ifdim\Gin@nat@width>\linewidth +% \linewidth +% \else +% \Gin@nat@width +% \fi +% } +% \makeatother + +\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345} +\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}% +\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}% +\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}% +\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}% +\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}% +\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}% +\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}% +\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}% +\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}% + +\usepackage{framed} +\makeatletter +\newenvironment{kframe}{% + \def\at@end@of@kframe{}% + \ifinner\ifhmode% + \def\at@end@of@kframe{\end{minipage}}% +\begin{minipage}{\columnwidth}% + \fi\fi% + \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep + \colorbox{shadecolor}{##1}\hskip-\fboxsep + % There is no \\@totalrightmargin, so: + \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}% + \MakeFramed {\advance\hsize-\width + \@totalleftmargin\z@ \linewidth\hsize + \@setminipage}}% +{\par\unskip\endMakeFramed% + \at@end@of@kframe} +\makeatother + +\definecolor{shadecolor}{rgb}{.97, .97, .97} +\definecolor{messagecolor}{rgb}{0, 0, 0} +\definecolor{warningcolor}{rgb}{1, 0, 1} +\definecolor{errorcolor}{rgb}{1, 0, 0} +\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX + +\usepackage{alltt} + %----------------------------------------------------------------------- \usepackage{graphicx} @@ -132,6 +185,8 @@ \setlength{\droptitle}{-2em} +%----------------------------------------------------------------------- + \title{Apostila Git} \pretitle{\vspace{\droptitle}} \posttitle{} @@ -142,13 +197,52 @@ \date{2015} \predate{}\postdate{} -\usepackage{wrapfig} - \usepackage{tikz} % Color used in the title page. \definecolor[named]{color01}{rgb}{.2,.4,.6} +\usepackage{wrapfig} \usepackage{wallpaper} +\usepackage{menukeys} +\usepackage{pdflscape} +\usepackage{multicol} +\usepackage{cleveref} + +\usepackage[labelsep=colon]{caption} + +%----------------------------------------------------------------------- +% Define ambiente para os Exemplos de Rotina. + +\usepackage{float} % Controla e define objetos flutuantes. +\usepackage{tocloft} % Controla lista de objetos flutuantes. + +% Nome dessa lista. +\newcommand{\listofprogramname}{Rotinas} + +% Configura os arquivos auxiliares para fazer a lista. +\newlistof{program}{lol}{\listofprogramname} + +\makeatletter +\newcommand\floatc@simple[2]{{\@fs@cfont #1 #2}\par} +\newcommand\fs@simple{ + \def\@fs@cfont{}\let\@fs@capt\floatc@simple + \def\@fs@pre{}% + \def\@fs@post{}% + \def\@fs@mid{\kern8pt}% + \let\@fs@iftopcapt\iftrue +} +\makeatother + +\floatstyle{simple} +\newfloat{program}{thp}{lol}[chapter] % Define ambiente +\floatname{program}{Rotina} % Rótulo na legenda. + +%% Aparencia do sumário de rotinas +\renewcommand*\cftprogrampresnum{Rotina~} +\settowidth{\cftprogramnumwidth}{\cftprogrampresnum} +\setlength{\cftprogramindent}{0cm} +\renewcommand{\cftprogramaftersnumb}{\qquad} +\renewcommand{\cftprogramaftersnum}{:} %----------------------------------------------------------------------- @@ -170,40 +264,47 @@ % http://www.latextemplates.com/template/ebook % https://www.overleaf.com/3861001pgjtwv#/11122365/ \thispagestyle{empty} -\ThisCenterWallPaper{0.9}{./images/git-agasalho.png} +\ThisCenterWallPaper{0.9}{./images/apostila_capa.pdf} % Add the background image, the first argument is the scaling - adjust % this as necessary so the image fits the entire page. -\begin{tikzpicture}[remember picture, overlay] -\node [rectangle, rounded corners, fill=white, opacity=0.75, - anchor=south west, minimum width=5cm, minimum height=4cm] - (box) at (-0.5,-10) (box){}; -% White rectangle - "minimum width/height" adjust the width and height -% of the box; "(-0.5,-10)" adjusts the position on the page. - -\node[anchor=west, - color01, - font=\sffamily\bfseries\scshape\Large, - xshift=-1.5cm, yshift=-1cm, text width=4cm] - at (box.north){\thetitle}; -% "Text width" adjusts the wrapping width, "xshift/yshift" adjust the -% position relative to the white rectangle. - -\node[anchor=west, - color01, - font=\sffamily\bfseries, - xshift=-1.5cm, yshift=-2.5cm, text width=4cm] - at (box.north){\theauthor}; -% "Text width" adjusts the wrapping width, "xshift/yshift" adjust the -% position relative to the white rectangle. -\end{tikzpicture} +% \begin{tikzpicture}[remember picture, overlay] +% \node [rectangle, rounded corners, fill=white, opacity=0.75, +% anchor=south west, minimum width=5cm, minimum height=4cm] +% (box) at (-0.5,-10) (box){}; +% % White rectangle - "minimum width/height" adjust the width and height +% % of the box; "(-0.5,-10)" adjusts the position on the page. +% +% \node[anchor=west, +% color01, +% font=\sffamily\bfseries\scshape\Large, +% xshift=-1.5cm, yshift=-1cm, text width=4cm] +% at (box.north){\thetitle}; +% % "Text width" adjusts the wrapping width, "xshift/yshift" adjust the +% % position relative to the white rectangle. +% +% \node[anchor=west, +% color01, +% font=\sffamily\bfseries, +% xshift=-1.5cm, yshift=-2.5cm, text width=4cm] +% at (box.north){\theauthor}; +% % "Text width" adjusts the wrapping width, "xshift/yshift" adjust the +% % position relative to the white rectangle. +% \end{tikzpicture} + +$\phantom{0}$ \end{titlepage} %----------------------------------------------------------------------- % Dedicatórias. -\newpage{} +\clearpage +$\phantom{0}$ +\thispagestyle{empty} + +\pagebreak +% \newpage \thispagestyle{empty} \vspace*{2cm} @@ -222,7 +323,11 @@ } \end{center} -\newpage +\clearpage +$\phantom{0}$ +\thispagestyle{empty} + +\pagebreak %----------------------------------------------------------------------- % Agradecimentos. @@ -237,17 +342,36 @@ %----------------------------------------------------------------------- % CapÃtulos. -% \input{cap01.tex} -% \input{cap02.tex} -% \input{cap03.tex} -% \input{cap04.tex} -% \chapter{Serviços Web para Projetos Git} -% \input{cap05.tex} -% \input{cap06.tex} -% \input{cap07.tex} +\chapter{Sistemas de controle de versão} +\input{cap01.tex} + +\chapter{Instalação e Configuração} +\input{cap02.tex} + +\chapter{Repositórios Locais} +\input{cap03.tex} + +\chapter{Projetos Remotos} +\input{cap04.tex} + +\chapter{Serviços Web para Projetos Git} +\input{cap05.tex} + +\chapter{Ferramentas gráficas} +\input{cap06.tex} + +\chapter{Trabalhando em equipe} +\input{cap07.tex} + % \input{cap08.tex} % \input{cap09.tex} +\addcontentsline{toc}{chapter}{Apêndice} +\input{./cap08/cap08_er.tex} + +\chapter{Dicionário de termos} +\input{./cap08/cap08_dt.tex} + \end{document} %----------------------------------------------------------------------- \ No newline at end of file diff --git a/cap01.Rmd b/cap01.Rmd index 6a8eac637416a17fc8a9fd4e934b3b7968cfe673..9904436532d319063177b0332d71c74bdf6e65aa 100644 --- a/cap01.Rmd +++ b/cap01.Rmd @@ -2,56 +2,53 @@ title: "Tutorial de Git" author: "PET EstatÃstica UFPR" output: - html_document: - highlight: pygments + pdf_document: + template: + highlight: default toc: true - theme: flatly - keep_md: true + toc_depth: 2 + keep_tex: true + number_sections: true --- - - -Sistemas de controle de versão - -Inicialmente, podemos dizer que Git é um Sistema de Controle de Versão, -que permite ao programador armazenar diversas cópias de versão do seu -trabalho, restaurar versões anteriores, sincronizar entre diversos -computadores de trabalho e trabalhar colaborativamente com outros -programadores. Só com essas possibilidades já faz do Git uma ferramenta -muito útil a quem programa. Mas o Git é muito mais! É possÃvel utilizar -o Git através do Shell (linha de comando) ou através de diversas -interfaces gráficas e até mesmo dentro do Rstudio. Você pode integrar -seu projeto com o Github ou Gitlab e disponibilizar os arquivos na web. -Assim, você pode acessá-los e até editar seus arquivos via navegador. -Pode deixar os arquivos públicos e disponibilizar seu código à -comunidade de programadores. Outras pessoas podem até vir a colaborar -nos seus projetos. Neste conceito, você pode fazer uso ou colaborar com -projetos de outros programadores! Acompanhar o desenvolvimento de -projetos que sequer foram lançados, fazer sugestões, tirar dúvidas e +Inicialmente, podemos dizer que Git é um Sistema de Controle de Versão, +que permite ao programador armazenar diversas cópias de versão do seu +trabalho, restaurar versões anteriores, sincronizar entre diversos +computadores de trabalho e trabalhar colaborativamente com outros +programadores. Só com essas possibilidades já faz do Git uma ferramenta +muito útil a quem programa. Mas o Git é muito mais! É possÃvel utilizar +o Git através do Shell (linha de comando) ou através de diversas +interfaces gráficas e até mesmo dentro do Rstudio. Você pode integrar +seu projeto com o Github ou Gitlab e disponibilizar os arquivos na web. +Assim, você pode acessá-los e até editar seus arquivos via navegador. +Pode deixar os arquivos públicos e disponibilizar seu código à +comunidade de programadores. Outras pessoas podem até vir a colaborar +nos seus projetos. Neste conceito, você pode fazer uso ou colaborar com +projetos de outros programadores! Acompanhar o desenvolvimento de +projetos que sequer foram lançados, fazer sugestões, tirar dúvidas e entrar em contato direto com equipes e desenvolvedores. Isso transforma o Github e Gitlab numa rede social de programadores! -O Git não é o único sistema de controle de versão. Nem foi o primeiro. -Os primeiros sistemas de controle de versão foram lançados na década -de 70. Há sistemas abertos e proprietários. E também, sistemas que -trabalham somente de forma local, cliente-servidor ou sistema -distribuÃdo. Dentre os sistemas abertos, os mais conhecidos são o -Apache Subversion (SVN), Mercurial, Git, Veracity e Bazzar. Mas, porque -tantos sistemas foram desenvolvidos? Cada sistema foi desenvolvido -buscando resolver os mesmos problemas de diferentes formas. A comunidade -desenvolvedora do kernel (núcleo) do Linux utilizava o BitKeeper, um -software proprietário que decidiu revogar a licença gratuita. Linus -Torvalds, desenvolvedor do primeiro kernel, estudou os diversos -softwares de controle de versão para ser o substituto do BitKeeper. -Mas nenhum software atendia as necessidades, principalmente na -performance de um projeto tão grande. Então, ele iniciou o -desenvolvimento do software que ele chamou de Git e em menos de dois -meses todo o gerenciamento do kernel já estava transferido para o -novo sistema. +O Git não é o único sistema de controle de versão. Nem foi o primeiro. +Os primeiros sistemas de controle de versão foram lançados na década +de 70. Há sistemas abertos e proprietários. E também, sistemas que +trabalham somente de forma local, cliente-servidor ou sistema +distribuÃdo. Dentre os sistemas abertos, os mais conhecidos são o Apache +Subversion (SVN), Mercurial, Git, Veracity e Bazzar. Mas, porque tantos +sistemas foram desenvolvidos? Cada sistema foi desenvolvido buscando +resolver os mesmos problemas de diferentes formas. A comunidade +desenvolvedora do kernel (núcleo) do Linux utilizava o BitKeeper, um +software proprietário que decidiu revogar a licença gratuita. Linus +Torvalds, desenvolvedor do primeiro kernel, estudou os diversos +softwares de controle de versão para ser o substituto do BitKeeper. Mas +nenhum software atendia as necessidades, principalmente na performance +de um projeto tão grande. Então, ele iniciou o desenvolvimento do +software que ele chamou de Git e em menos de dois meses todo o +gerenciamento do kernel já estava transferido para o novo sistema. -Então, utilizar o Git é a garantia de um sistema robusto de controle de -versionamento. Um sistema aberto e muito utilizado por programadores, +Então, utilizar o Git é a garantia de um sistema robusto de controle de +versionamento. Um sistema aberto e muito utilizado por programadores, estatÃsticos e cientistas de dados. -Seja você mais um desenvolvedor a resolver os seus problemas e -participar desta comunidade. \ No newline at end of file +Seja você mais um desenvolvedor a resolver os seus problemas e +participar desta comunidade. diff --git a/cap01.md b/cap01.md deleted file mode 100644 index c9cf86e7716365643d277fb6260129819d8f71e8..0000000000000000000000000000000000000000 --- a/cap01.md +++ /dev/null @@ -1,49 +0,0 @@ -# Tutorial de Git -PET EstatÃstica UFPR - - - -Sistemas de controle de versão - -Inicialmente, podemos dizer que Git é um Sistema de Controle de Versão, -que permite ao programador armazenar diversas cópias de versão do seu -trabalho, restaurar versões anteriores, sincronizar entre diversos -computadores de trabalho e trabalhar colaborativamente com outros -programadores. Só com essas possibilidades já faz do Git uma ferramenta -muito útil a quem programa. Mas o Git é muito mais! É possÃvel utilizar -o Git através do Shell (linha de comando) ou através de diversas -interfaces gráficas e até mesmo dentro do Rstudio. Você pode integrar -seu projeto com o Github ou Gitlab e disponibilizar os arquivos na web. -Assim, você pode acessá-los e até editar seus arquivos via navegador. -Pode deixar os arquivos públicos e disponibilizar seu código à -comunidade de programadores. Outras pessoas podem até vir a colaborar -nos seus projetos. Neste conceito, você pode fazer uso ou colaborar com -projetos de outros programadores! Acompanhar o desenvolvimento de -projetos que sequer foram lançados, fazer sugestões, tirar dúvidas e -entrar em contato direto com equipes e desenvolvedores. Isso transforma -o Github e Gitlab numa rede social de programadores! - -O Git não é o único sistema de controle de versão. Nem foi o primeiro. -Os primeiros sistemas de controle de versão foram lançados na década -de 70. Há sistemas abertos e proprietários. E também, sistemas que -trabalham somente de forma local, cliente-servidor ou sistema -distribuÃdo. Dentre os sistemas abertos, os mais conhecidos são o -Apache Subversion (SVN), Mercurial, Git, Veracity e Bazzar. Mas, porque -tantos sistemas foram desenvolvidos? Cada sistema foi desenvolvido -buscando resolver os mesmos problemas de diferentes formas. A comunidade -desenvolvedora do kernel (núcleo) do Linux utilizava o BitKeeper, um -software proprietário que decidiu revogar a licença gratuita. Linus -Torvalds, desenvolvedor do primeiro kernel, estudou os diversos -softwares de controle de versão para ser o substituto do BitKeeper. -Mas nenhum software atendia as necessidades, principalmente na -performance de um projeto tão grande. Então, ele iniciou o -desenvolvimento do software que ele chamou de Git e em menos de dois -meses todo o gerenciamento do kernel já estava transferido para o -novo sistema. - -Então, utilizar o Git é a garantia de um sistema robusto de controle de -versionamento. Um sistema aberto e muito utilizado por programadores, -estatÃsticos e cientistas de dados. - -Seja você mais um desenvolvedor a resolver os seus problemas e -participar desta comunidade. diff --git a/cap02.Rmd b/cap02.Rmd index 6aeb102eda8f2e6a5155e4a599b3a8fb8a570d61..318d7bf19512dca67a8f0a26d106b34eb2756324 100644 --- a/cap02.Rmd +++ b/cap02.Rmd @@ -1,11 +1,11 @@ --- -title: 'CapÃtulo 2: Instalação e Configuração' -author: +title: "Instalação e Configuração" +author: "PET EstatÃstica UFPR" date: "29/10/2015" graphics: yes output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -17,23 +17,23 @@ output: knitr::opts_chunk$set(echo = TRUE) ``` -\chapter{Instalação e Configuração} - Agora, devidamente apresentados ao sistema de versionamento Git vamos -utilizá-lo. Porém, antes de começarmos a entender os comandos Git, é -necessário sua instalação e configuração. Neste capÃtulo veremos -primeiramente como instalar o programa Git em diferentes sistemas operacionais -e posteriormente como configurar algumas opções para viabilizar e -facilitar seu uso. +utilizá-lo. Porém, antes de começarmos a entender os comandos Git, é +necessário sua instalação e configuração. Neste capÃtulo veremos +primeiramente como instalar o programa Git em diferentes sistemas +operacionais e posteriormente como configurar algumas opções para +viabilizar e facilitar seu uso. # Instalação ## Windows -Usuários Windows devem visitar Git for Windows\footnote{\url{https://git-for-windows.github.io/}}, clicar em + +Usuários Windows devem visitar Git for +Windows\footnote{\url{https://git-for-windows.github.io/}}, clicar em "Download" e baixar o arquivo ".exe". -Após o download, execute o arquivo e você terá a tela conforme figura -\ref{fig:inst01}: +Após o download, execute o arquivo e você terá a tela conforme figura +\ref{fig:inst01}: \begin{figure} \begin{center} @@ -43,13 +43,13 @@ Após o download, execute o arquivo e você terá a tela conforme figura \label{fig:inst01} \end{figure} -Como de costume, clique em "Next". Para dar continuidade a instalação +Como de costume, clique em "Next". Para dar continuidade a instalação aceite a licença do Git. -O diretório apresentado na figura \ref{fig:inst02} vem como default, porém é -possÃvel alterar a instalação para um diretório de sua preferência. -Depois de selecionado o caminho da instalação, clique em "Next" para -prosseguir. +O diretório apresentado na figura \ref{fig:inst02} vem como default, +porém é possÃvel alterar a instalação para um diretório de sua +preferência. Depois de selecionado o caminho da instalação, clique em +"Next" para prosseguir. \begin{figure} \begin{center} @@ -59,16 +59,15 @@ prosseguir. \label{fig:inst02} \end{figure} -Na tela de componentes (figura \ref{fig:inst03}) podemos definir atalhos, integração ao menu de -contexto do Windows Explorer, associação de arquivos e uso de font -TrueType. -O Git Bash é o prompt de comandos próprio, que além dos comandos Git -também fornece alguns comandos Unix que podem ser bem úteis. Já o Git -GUI é uma interface gráfica para trabalhar com Git. É recomendável a -seleção de ambos os itens. +Na tela de componentes (figura \ref{fig:inst03}) podemos definir +atalhos, integração ao menu de contexto do Windows Explorer, associação +de arquivos e uso de font TrueType. O Git Bash é o prompt de comandos +próprio, que além dos comandos Git também fornece alguns comandos Unix +que podem ser bem úteis. Já o Git GUI é uma interface gráfica para +trabalhar com Git. É recomendável a seleção de ambos os itens. -Depois de selecionado os componentes de sua preferência, clique em “Next†-para dar continuidade. +Depois de selecionado os componentes de sua preferência, clique em +"Next" para dar continuidade. \begin{figure} \begin{center} @@ -78,9 +77,9 @@ para dar continuidade. \label{fig:inst03} \end{figure} -No passo 4, representado pela figura \ref{fig:inst04}, o instalador nos oferece a oportunidade de mudar o nome da pasta -no menu iniciar, recomenda-se deixar o padrão para fácil localização -posteriormente. +No passo 4, representado pela figura \ref{fig:inst04}, o instalador nos +oferece a oportunidade de mudar o nome da pasta no menu iniciar, +recomenda-se deixar o padrão para fácil localização posteriormente. \begin{figure} \begin{center} @@ -90,15 +89,14 @@ posteriormente. \label{fig:inst04} \end{figure} -Na tela de configuração "PATH environment",conforme a figura -\ref{fig:inst05}, podemos escolher as formas de integração do Git com o -sistema. -A primeira opção nos permite usar o Git apenas pelo "Git Bash" (é o -prompt de comando do Git), a segunda opção nos possibilita executar os -comandos no "Git Bash" e no prompt de comando do Windows (cmd.exe), e a -terceira opção é a junção das duas de cima, porém alguns comandos do -Windows serão substituÃdos por comandos Unix com mesmo nome. -Essa última opção não é recomendada, a primeira opção é a desejável. +Na tela de configuração "PATH environment",conforme a figura +\ref{fig:inst05}, podemos escolher as formas de integração do Git com o +sistema. A primeira opção nos permite usar o Git apenas pelo "Git Bash" +(é o prompt de comando do Git), a segunda opção nos possibilita executar +os comandos no "Git Bash" e no prompt de comando do Windows (cmd.exe), e +a terceira opção é a junção das duas de cima, porém alguns comandos do +Windows serão substituÃdos por comandos Unix com mesmo nome. Essa +última opção não é recomendada, a primeira opção é a desejável. \begin{figure} \begin{center} @@ -108,20 +106,18 @@ Essa última opção não é recomendada, a primeira opção é a desejável. \label{fig:inst05} \end{figure} -Na figura \ref{fig:inst06}, temos a configuração de quebra de linha. -Windows e sistemas Unix (Linux, Mac) possuem formatos diferentes de quebra -de linha em arquivos de texto. Se você escreve um código com quebras de -linha no formato Windows, outra pessoa pode ter problemas ao abrir o -mesmo arquivo em um Linux, e vice-versa. Este passo, portanto, permite -normalizar isso. -A primeira opção converte automaticamente os arquivos para padrão Windows -quando receber algum arquivo e converterá para padrão Unix quando -“comitar†(enviar alterações) ao repositório. A segunda opção, -não faz nenhuma conversão ao receber arquivos, mas convertem -para padrão Unix ao “comitarâ€. -Já a terceira opção, o Git não fará nenhuma conversão. -Recomenda-se a seleção da opção "Checkout Windows-style, -commit Unix-Style line endings". +Na figura \ref{fig:inst06}, temos a configuração de quebra de linha. +Windows e sistemas Unix (Linux, Mac) possuem formatos diferentes de +quebra de linha em arquivos de texto. Se você escreve um código com +quebras de linha no formato Windows, outra pessoa pode ter problemas ao +abrir o mesmo arquivo em um Linux, e vice-versa. Este passo, portanto, +permite normalizar isso. A primeira opção converte automaticamente os +arquivos para padrão Windows quando receber algum arquivo e converterá +para padrão Unix quando “comitar†(enviar alterações) ao repositório. A +segunda opção, não faz nenhuma conversão ao receber arquivos, mas +convertem para padrão Unix ao “comitarâ€. Já a terceira opção, o Git não +fará nenhuma conversão. Recomenda-se a seleção da opção "Checkout +Windows-style, commit Unix-Style line endings". \begin{figure} \begin{center} @@ -131,12 +127,11 @@ commit Unix-Style line endings". \label{fig:inst06} \end{figure} -No passo da figura \ref{fig:inst07}, temos a configuração do -emulador de terminal para usar com o Git Bash. -A primeira opção utiliza o terminal MSys2 (Shell), que permite utilizar -comandos Unix no Windows. Já a segunda opção, utiliza o terminal -padrão do Windows. Recomendamos a primeira opção. -Feito isso, dê continuidade a instalação. +No passo da figura \ref{fig:inst07}, temos a configuração do emulador de +terminal para usar com o Git Bash. A primeira opção utiliza o terminal +MSys2 (Shell), que permite utilizar comandos Unix no Windows. Já a +segunda opção, utiliza o terminal padrão do Windows. Recomendamos a +primeira opção. Feito isso, dê continuidade a instalação. \begin{figure} \begin{center} @@ -146,7 +141,7 @@ Feito isso, dê continuidade a instalação. \label{fig:inst07} \end{figure} -E por último, a figura \ref{fig:inst08}, que configura ajustes de +E por último, a figura \ref{fig:inst08}, que configura ajustes de performance. Essa opção é para habilitar o sistema de cache de arquivo. \begin{figure} @@ -157,29 +152,30 @@ performance. Essa opção é para habilitar o sistema de cache de arquivo. \label{fig:inst08} \end{figure} -Feito isso, “Nextâ€, “Finish†e o Git está instalado. - +Feito isso, "Next", "Finish" e o Git está instalado. ## Linux -Em qualquer sistema Linux, pode-se utilizar o gerenciador de pacotes da respectiva distribuição para instalar o Git. -Basta executar o código de instalação de sua respectiva distribuição. - +Em qualquer sistema Linux, pode-se utilizar o gerenciador de pacotes da +respectiva distribuição para instalar o Git. Basta executar o código de +instalação de sua respectiva distribuição. **Debian** -Em uma sessão de terminal Linux de distribuições Debian (Ubuntu, Mint), -execute o código abaixo. -Adicione o ppa para obter a versão mais recente do Git. +Em uma sessão de terminal Linux de distribuições Debian (Ubuntu, Mint), +execute o código abaixo. Adicione o ppa para obter a versão mais +recente do Git. + ```{r, engine="bash", eval=FALSE} sudo add-apt-repository ppa:git-core/ppa sudo apt-get update ``` -Agora, execute o comando abaixo para instalação do Git. -Siga as instruções do prompt de comando, primeiro confirmando a instalação -dos pacotes e suas dependências, depois confirmando a instalação -do pacote git-core. +Agora, execute o comando abaixo para instalação do Git. Siga as +instruções do prompt de comando, primeiro confirmando a instalação dos +pacotes e suas dependências, depois confirmando a instalação do pacote +git-core. + ```{r, engine="bash", eval=FALSE} sudo apt-get install git git-core git-man git-gui git-doc \ ssh openssh-server openssh-client @@ -187,11 +183,11 @@ git --version ``` Para adicionar ferramentas complementares, execute: + ```{r, engine="bash", eval=FALSE} sudo apt-get install gitk meld ``` - **Arch** ```{r, engine="bash", eval=FALSE} @@ -203,30 +199,31 @@ git --version **Fedora** ```{r, engine="bash", eval=FALSE} -Yum install git +yum install git git --version ``` -Usuários de outra versão do Linux podem visitar Download for Linux\footnote{\url{https://git-scm.com/download/linux}}. +Usuários de outra versão do Linux podem visitar Download for +Linux\footnote{\url{https://git-scm.com/download/linux}}. ## MacOS -Existem duas maneiras de instalar o Git no Mac, uma pelo instalador e + +Existem duas maneiras de instalar o Git no Mac, uma pelo instalador e outra através do MacPorts. **Utiizando o Instalador** O usuário deverá acessar Download for -Mac\footnote{\url{http://git-scm.com/downloads}}, clicar em "Download" -e baixar o arquivo ".dmg". +Mac\footnote{\url{http://git-scm.com/downloads}}, clicar em "Download" e +baixar o arquivo ".dmg". -Após o download, é necessário clicar duas vezes para ter acesso ao pacote -de instalação. Dentro do arquivo ".dmg", execute o arquivo ".pkg" para -iniciar a instalação. -Siga os passos até concluir a instalação. É recomendável utilizar a -instalação padrão. +Após o download, é necessário clicar duas vezes para ter acesso ao +pacote de instalação. Dentro do arquivo ".dmg", execute o arquivo ".pkg" +para iniciar a instalação. Siga os passos até concluir a instalação. É +recomendável utilizar a instalação padrão. -Para testar a instalação, abra o terminal e digite o comando “gitâ€. -A saÃda deverá ser similar a figura \ref{fig:inst09}: +Para testar a instalação, abra o terminal e digite o comando "git". A +saÃda deverá ser similar a figura \ref{fig:inst09}: \begin{figure} \begin{center} @@ -239,42 +236,43 @@ A saÃda deverá ser similar a figura \ref{fig:inst09}: **Utiizando o MacPorts** A maneira mais fácil de instalar Git no Mac é via -MacPorts\footnote{\url{http://www.macports.org}}, para isso basta -executar o seguinte -comando: +MacPorts\footnote{\url{http://www.macports.org}}, para isso basta +executar o seguinte comando: ```{r, engine="bash", eval=FALSE} sudo port install git-core ``` - # Configurando Perfil -As configurações vão determinar algumas opções globais do Git, sendo -necessário fazê-las apenas uma vez. +As configurações vão determinar algumas opções globais do Git, sendo +necessário fazê-las apenas uma vez. ## Usuário -Os comandos abaixo vão configurar o nome de usuário e endereço de e-mail. -Esta informação é importante pois é anexada aos commits que você realiza, -ou seja, as configurações ficarão associadas ao trabalho em desenvolvimento, -permitindo que os colaboradores/gestores do projeto identifiquem suas -contribuições. -Caso o projeto seja individual, a importância de configurar usuário e -e-mail se mantém. Uma vez que se trabalha com duas ou mais máquinas, -a maneira de identificar a pessoa que está desenvolvendo o trabalho é -pelo nome de usuário. +Os comandos abaixo vão configurar o nome de usuário e endereço de +e-mail. Esta informação é importante pois é anexada aos commits que +você realiza, ou seja, as configurações ficarão associadas ao trabalho +em desenvolvimento, permitindo que os colaboradores/gestores do projeto +identifiquem suas contribuições. Caso o projeto seja individual, a +importância de configurar usuário e e-mail se mantém. Uma vez que se +trabalha com duas ou mais máquinas, a maneira de identificar a pessoa +que está desenvolvendo o trabalho é pelo nome de usuário. Em um terminal Bash, execute o código abaixo: + ```{r, engine="bash", eval=FALSE} git config --global user.name "Knight Rider" git config --global user.email "batman@justiceleague.org" ``` -A opção `--global` usará essa informação para todo projeto Git da máquina. +A opção `--global` usará essa informação para todo projeto Git da +máquina. + +É possÃvel fazer definições para cada projeto, ou seja, não globais. +Para isso é necessário executar o comando a seguir sem a opção +`--global`. -É possÃvel fazer definições para cada projeto, ou seja, não globais. -Para isso é necessário executar o comando a seguir sem a opção `--global`. ```{r, engine="bash", eval=FALSE} git config user.name "Knight Rider" git config user.email "batman@justiceleague.org" @@ -282,35 +280,39 @@ git config user.email "batman@justiceleague.org" Uma vez configurado o perfil, o Git está pronto para uso. - ## Atalhos -Os atalhos no Git são chamados de *Alias*. Com ele podemos mapear comandos -que repetidamente usamos para algumas poucas teclas. Estes atalhos podem -ser criados de dois modos: através do comando no terminal ou editando -diretamente no arquivo `/.gitconfig`. +Os atalhos no Git são chamados de *Alias*. Com ele podemos mapear +comandos que repetidamente usamos para algumas poucas teclas. Estes +atalhos podem ser criados de dois modos: através do comando no terminal +ou editando diretamente no arquivo `/.gitconfig`. **Pelo terminal:** -Execute o comando abaixo com o atalho de sua preferência e o nome completo -do camando o qual deseja criar o alias. +Execute o comando abaixo com o atalho de sua preferência e o nome +completo do comando o qual deseja criar o alias. + ```{r, engine="bash", eval=FALSE} git config --global alias.nome_do_alias "comando inteiro" ``` Um exemplo bem simples é o seguinte: + ```{r, engine="bash", eval=FALSE} git config --global alias.st "status" ``` + Assim, ao executar git st é o mesmo que executar git status. -Pelo método citado acima, o alias é adicionado automaticamente no seu arquivo `/.gitconfig`. +Pelo método citado acima, o alias é adicionado automaticamente no seu +arquivo `/.gitconfig`. **Pelo arquivo `/.gitconfig`:** -Pode-se criar atalhos através de um bloco no seu arquivo de configuração. -Para isso, é necessário localizar o diretório do Git e adicionar a lista -de comandos desejada, como no exemplo: +Pode-se criar atalhos através de um bloco no seu arquivo de +configuração. Para isso, é necessário localizar o diretório do Git e +adicionar a lista de comandos desejada, como no exemplo: + ```{r, engine="bash", eval=FALSE} [alias] st = status @@ -320,68 +322,72 @@ de comandos desejada, como no exemplo: df = diff ``` -Assim que adicionar este bloco com os comandos de sua escolha, ele irá +Assim que adicionar este bloco com os comandos de sua escolha, ele irá funcionar imediatamente. -Segue abaixo os caminhos para encontrar o arquivo `/.gitconfig` nos sistemas operacionais: - -+ Windows: -1 - C:\\Pasta_do_seu_projeto\\.git\\config -2 – C:\\Documents and Settings\\Seu_usuario\\.gitconfig -3 – C:\\Arquivos de programas\\Git\\etc\\gitconfig +Segue abaixo os caminhos para encontrar o arquivo `/.gitconfig` nos +sistemas operacionais: + + + Windows: + 1. `C:\\Pasta_do_seu_projeto\\.git\\config` + 2. `C:\\Documents and Settings\\Seu_usuario\\.gitconfig` + 3. `C:\\Arquivos de programas\\Git\\etc\\gitconfig` + + Mac: + 1. `/Pasta_do_seu_projeto/.git/config` + 2. `/Users/Seu_usuario/.gitconfig` + 3. `/usr/local/git/etc/gitconfig` + + Linux: + 1. Crie um arquivo como _sudo_ dentro da pasta etc/ com nome de + gitconfig e coloque os atalhos de sua escolha. -+ Mac: -1 - /Pasta_do_seu_projeto/.git/config -2 – /Users/Seu_usuario/.gitconfig -3 – /usr/local/git/etc/gitconfig Obs: Os arquivos de configuração do Git não tem extensão. -+ Linux: -Crie um arquivo como _sudo_ dentro da pasta etc/ com nome de gitconfig e -coloque os atalhos de sua escolha. - -Não importa o método você utilize, suas configurações sempre ficarão +Não importa o método você utilize, suas configurações sempre ficarão salvas no arquivo `/.gitconfig`. ## Ignorar Arquivos -Usando o arquivo `.gitignore` podemos ignorar arquivos que não desejamos +Usando o arquivo `.gitignore` podemos ignorar arquivos que não desejamos versionar no repositório, pode ser feito por projeto e por usuário. -Configurar um arquivo `.gitignore` antes de começar a trabalhar, -é importante, pois evita commits acidentais de arquivos que não deveriam +Configurar um arquivo `.gitignore` antes de começar a trabalhar, é +importante, pois evita commits acidentais de arquivos que não deveriam ir para o seu repositório Git. **Ignorar Arquivos por Projeto:** -Em todos os projetos que necessitam de um controle de versão há sempre -casos em que arquivos não precisam ser versionados. Para isso é preciso -criar um arquivo `.gitignore` no diretório raiz do projeto, o qual contém -padrões (pattern) que serão ignorados, cada padrão fica em uma linha -como no exemplo: +Em todos os projetos que necessitam de um controle de versão há sempre +casos em que arquivos não precisam ser versionados. Para isso é preciso +criar um arquivo `.gitignore` no diretório raiz do projeto, o qual +contém padrões (pattern) que serão ignorados, cada padrão fica em uma +linha como no exemplo: + ```{r, engine="bash", eval=FALSE} $ cat .gitignore *.[oa] *~ ``` -A primeira linha fala para o Git ignorar qualquer arquivo finalizado -em **.o** ou **.a** e a segunda linha ignora todos os arquivos que -terminam com um til **(~)**. Esses padrões podem serem feitos de acordo -com a necessidade de cada projeto. +A primeira linha fala para o Git ignorar qualquer arquivo finalizado em +**.o** ou **.a** e a segunda linha ignora todos os arquivos que terminam +com um til **(~)**. Esses padrões podem serem feitos de acordo com a +necessidade de cada projeto. **Ignorar Arquivos por Usuário (Globalmente):** -Para não precisar criar uma lista de comandos para serem ignorados em cada -projeto, é possÃvel ignorar arquivos em todos os repositórios. Para isso, -basta criar um arquivo `.gitignore` em seu diretório _home_ contendo os -padrões os quais deseja ignorar e executar o comando abaixo no terminal -a partir da pasta onde está localizado o arquivo `.gitignore`: +Para não precisar criar uma lista de comandos para serem ignorados em +cada projeto, é possÃvel ignorar arquivos em todos os repositórios. Para +isso, basta criar um arquivo `.gitignore` em seu diretório _home_ +contendo os padrões os quais deseja ignorar e executar o comando abaixo +no terminal a partir da pasta onde está localizado o arquivo +`.gitignore`: + ```{r, engine="bash", eval=FALSE} git config --global core.excludesfile ~/.gitignore ``` -A partir disso, todos os arquivos que estão na lista serão ignorados pelo usuário. +A partir disso, todos os arquivos que estão na lista serão ignorados +pelo usuário. -Finalmente com a instalação, configuração essencial (usuário e e-mail) -e configurações adicionais concluÃdos, podemos começar a utilizar o Git -para versionar nossos projetos. \ No newline at end of file +Finalmente com a instalação, configuração essencial (usuário e e-mail) e +configurações adicionais concluÃdas, podemos começar a utilizar o Git +para versionar nossos projetos. diff --git a/cap02.md b/cap02.md deleted file mode 100644 index dd9c69341c6caf05b149480a6c889ad4c511ff70..0000000000000000000000000000000000000000 --- a/cap02.md +++ /dev/null @@ -1,336 +0,0 @@ -# CapÃtulo 2: Instalação e Configuração -Jhenifer -29/10/2015 - - - -## Instalação - -#### Windows -Usuários Windows devem visitar [Git for Windows](https://git-for-windows.github.io/ "Git"), clicar em "Download" e baixar o arquivo ".exe". - -Após o download, execute o arquivo e você terá essa tela: - - - - - -Como de costume, clique em "Next". Para dar continuidade a instalação -aceite a licença do Git. - -O diretório apresentado na figura abaixo vem como default, porém é -possÃvel alterar a instalação para um diretório de sua preferência. -Depois de selecionado o caminho da instalação, clique em "Next" para -prosseguir. - - - - - -Na tela de componentes podemos definir atalhos, integração ao menu de -contexto do Windows Explorer, associação de arquivos e uso de font -TrueType. - -O Git Bash é o prompt de comandos próprio, que além dos comandos Git -também fornece alguns comandos Unix que podem ser bem úteis. Já o Git -GUI é uma interface gráfica para trabalhar com Git. É recomendável a -seleção de ambos os itens. - -Depois de selecionado os componentes de sua -preferência, clique em “Next†para dar continuidade. - - - - - -Aqui, o instalador nos oferece a oportunidade de mudar o nome da pasta -no menu iniciar, recomenda-se deixar o padrão para fácil localização -posteriormente. - - - - - -Na tela de configuração "PATH environment", podemos escolher as formas -de integração do Git com o sistema. -A primeira opção nos permite usar o Git apenas pelo "Git Bash" (é o -prompt de comando do Git), a segunda opção nos possibilita executar os -comandos no "Git Bash" e no prompt de comando do Windows (cmd.exe), e a -terceira opção é a junção das duas de cima, porém alguns comandos do -Windows serão substituÃdos por comandos Unix com mesmo nome. -Essa última opção não é recomendada, e a primeira opção é a -desejável. - - - - - -Abaixo, a configuração de quebra de linha. Windows e sistemas Unix -(Linux, Mac) possuem formatos diferentes de quebra de linha em arquivos -de texto. Se você escreve um código com quebras de linha no formato -Windows, outra pessoa pode ter problemas ao abrir o mesmo arquivo em -um Linux, e vice-versa. Esta opção, portanto, permite normalizar isso. -A primeira opção converte automaticamente os arquivos para padrão Windows -quando receber algum arquivo e converterá para padrão Unix quando -“comitar†(enviar alterações) ao repositório. A segunda opção, -não faz nenhuma conversão ao receber arquivos, mas convertem -para padrão Unix ao “comitarâ€. -Já a terceira opção, o Git não fará nenhuma conversão. -Recomenda-se a seleção da opção "Checkout Windows-style, -commit Unix-Style line endings". - - - - - -Aqui, a configuração do emulador de terminal para usar com o Git Bash. -A primeira opção utiliza o terminal MSys2 (Shell), que permite utilizar -comandos Unix no Windows. Já a segunda opção, utiliza o terminal -padrão do Windows. Recomendamos a primeira opção. -Feito isso, dê continuidade a instalação. - - - - -E por último, configurando ajustes de performance. Essa opção é para -habilitar o sistema de cache de arquivo. - - - - -Feito isso, “Nextâ€, “Finish†e o Git está instalado. - - -#### Linux - -Em qualquer sistema Linux, pode-se utilizar o gerenciador de pacotes da respectiva distribuição para instalar o Git. -Basta executar o código de instalação de sua respectiva distribuição. - - -**Debian** - -Em uma sessão de terminal Linux de distribuições Debian (Ubuntu, Mint), -execute o código abaixo. -Adicione o ppa para obter a versão mais recente do Git. - -```sh -sudo add-apt-repository ppa:git-core/ppa -sudo apt-get update -``` - -Agora, execute o comando abaixo para instalação do Git. -Siga as instruções do prompt de comando, primeiro confirmando a instalação -dos pacotes e suas dependências, depois confirmando a instalação -do pacote git-core. - -```sh -sudo apt-get install git git-core git-man git-gui git-doc \ - ssh openssh-server openssh-client -git --version -``` - -Para adicionar ferramentas complementares, execute: - -```sh -sudo apt-get install gitk meld -``` - - -**Arch** - - -```sh -pacman -S git openssh meld -git --version -``` - - -**Fedora** - - -```sh -Yum install git -git --version -``` - -Usuários de outra versão do Linux podem visitar [Download for Linux](https://git-scm.com/download/linux). - - -#### MacOS -Exitem duas maneiras de instalar o Git no Mac, uma pelo instalador e -outra através do MacPorts. - -**Utiizando o Instalador** - -O usuário deverá acessar [Download for Mac](http://git-scm.com/downloads), -clicar em "Download" e baixar o arquivo ".dmg". - -Após o download, é necessário clicar duas vezes para ter acesso ao pacote -de instalação. Dentro do arquivo ".dmg", execute o arquivo ".pkg" para -iniciar a instalação. -Siga os passos até concluir a instalação. É recomendável utilizar a -instalação padrão. - -Para testar a instalação, abra o terminal e digite o comando “gitâ€. -A saÃda deverá ser similar à imagem: - - - -**Utiizando o MacPorts** - -A maneira mais fácil de instalar Git no Mac é via -[MacPorts](http://www.macports.org), para isso basta executar o seguinte -comando: - - -```sh -sudo port install git-core -``` - - -## Configurando Perfil -As configurações vão determinar algumas opções globais do Git, sendo -necessário fazê-las apenas uma vez. - -**Usuário** - -Os comandos abaixo vão configurar o nome de usuário e endereço de e-mail. -Esta informação é importante pois é anexada aos commits que você realiza, -ou seja, as configurações ficarão associadas ao trabalho em desenvolvimento, -permitindo que os colaboradores/gestores do projeto identifiquem suas -contribuições. - -Caso o projeto seja individual, a importância de configurar usuário e -e-mail se mantém. Uma vez que se trabalha com duas ou mais máquinas, -a maneira de identificar a pessoa que está desenvolvendo o trabalho é -pelo nome de usuário. - -Em um terminal Bash, execute o código abaixo: - -```sh -git config --global user.name "Knight Rider" -git config --global user.email "batman@justiceleague.org" -``` - -A opção `--global` usará essa informação para todo projeto Git da máquina. -É possÃvel fazer definições para cada projeto, ou seja, não globais. -Para isso é necessário executar o comando a seguir sem a opção `--global`. - - -```sh -git config user.name "Knight Rider" -git config user.email "batman@justiceleague.org" -``` - -Uma vez configurado o perfil, o Git está pronto para uso. - - -**Atalhos** - -Os atalhos no Git são chamados de *Alias*. Com ele podemos mapear comandos -que repetidamente usamos para algumas poucas teclas. Estes atalhos podem -ser criados de dois modos: através do comando no terminal ou editando -diretamente no arquivo `/.gitconfig`. - -* Pelo terminal: - -Execute o comando abaixo com o atalho de sua preferência e o nome completo -do camando o qual deseja criar o alias. - - -```sh -git config --global alias.nome_do_alias "comando inteiro" -``` - -Um exemplo bem simples é o seguinte: - - -```sh -git config --global alias.st "status" -``` - -Assim, ao executar git st é o mesmo que executar git status. - -Pelo método citado acima, o alias é adicionado automaticamente no seu arquivo `/.gitconfig`. - -* Pelo arquivo `/.gitconfig`: - -Pode-se criar atalhos através de um bloco no seu arquivo de configuração. -Para isso, é necessário localizar o diretório do Git e adicionar a lista -de comandos desejada, como no exemplo: - - -```sh -[alias] - st = status - ci = commit - br = branch - co = checkout - df = diff -``` - -Assim que adicionar este bloco com os comandos de sua escolha, ele irá -funcionar imediatamente. - -Segue abaixo os caminhos para encontrar o arquivo `/.gitconfig` nos sistemas operacionais: - -+ Windows: -1 - C:\\Pasta_do_seu_projeto\\.git\\config -2 – C:\\Documents and Settings\\Seu_usuario\\.gitconfig -3 – C:\\Arquivos de programas\\Git\\etc\\gitconfig - -+ Mac: -1 - /Pasta_do_seu_projeto/.git/config -2 – /Users/Seu_usuario/.gitconfig -3 – /usr/local/git/etc/gitconfig -Obs: Os arquivos de configuração do Git não tem extensão. - -+ Linux: -Crie um arquivo como _sudo_ dentro da pasta etc/ com nome de gitconfig e -coloque os atalhos de sua escolha. - -Não importa o método você utilize, suas configurações sempre ficarão -salvas no arquivo `/.gitconfig`. - -**Ignorar Arquivos** - -Usando o arquivo `.gitignore` podemos ignorar arquivos que não desejamos -versionar no repositório, pode ser feito por projeto e por usuário. -Configurar um arquivo `.gitignore` antes de começar a trabalhar, -é importante, pois evita commits acidentais de arquivos que não deveriam -ir para o seu repositório Git. - -* Ignorar Arquivos por Projeto: - -Em todos os projetos que necessitam de um controle de versão há sempre -casos em que arquivos não precisam ser versionados. Para isso é preciso -criar um arquivo `.gitignore` no diretório raiz do projeto, o qual contém -padrões (pattern) que serão ignorados, cada padrão fica em uma linha -como no exemplo: - - -```sh -$ cat .gitignore -*.[oa] -*~ -``` - -A primeira linha fala para o Git ignorar qualquer arquivo finalizado -em **.o** ou **.a** e a segunda linha ignora todos os arquivos que -terminam com um til **(~)**. Esses padrões podem serem feitos de acordo -com a necessidade de cada projeto. - -* Ignorar Arquivos por Usuário (Globalmente): - -Para não precisar criar uma lista de comandos para serem ignorados em cada -projeto, é possÃvel ignorar arquivos em todos os repositórios. Para isso, -basta criar um arquivo `.gitignore` em seu diretório _home_ contendo os -padrões os quais deseja ignorar e executar o comando abaixo no terminal -a partir da pasta onde está localizado o arquivo `.gitignore`: - - -```sh -git config --global core.excludesfile ~/.gitignore -``` - -A partir disso, todos os arquivos que estão na lista serão ignorados pelo usuário. diff --git a/cap02.pdf b/cap02.pdf deleted file mode 100644 index a81a822fa724a638bba9673c5cf65ffc8688581d..0000000000000000000000000000000000000000 Binary files a/cap02.pdf and /dev/null differ diff --git a/cap03.Rmd b/cap03.Rmd index 1f5611ced58a900e16d0ca0f7c65dc2e22f6b132..c725951c5117f89c8fcc0c34a94818ff3aea3bbb 100644 --- a/cap03.Rmd +++ b/cap03.Rmd @@ -1,11 +1,11 @@ --- -title: 'CapÃtulo 3: Repositório Local' -author: +title: "Repositórios Locais" +author: "PET EstatÃstica UFPR" date: "15/12/2015" graphics: yes output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -13,28 +13,27 @@ output: number_sections: true --- - ```{r, include=FALSE} library(knitr) opts_chunk$set(comment=NA) ``` -\chapter{Repositório Local} - -### Instruções do Git +# Instruções do Git # Neste capÃtulo, as instruções serão todas feitas no terminal mesmo que existam alternativas gráficas para as mesmas. Isso enfatiza no que está sendo feito além do fato de que no terminal todos devem ter os mesmos recursos e os comandos irão produzir os mesmos resultados, o que faz -esse tutorial algo reproduzÃvel. Casos você queira usufruir das ferramentas gráficas vá para o capÃtulo 6. +esse tutorial algo reproduzÃvel. Casos você queira usufruir das +ferramentas gráficas vá para o capÃtulo 6. -Sabendo que você executou os comandos de perfil que no capÃtulo anterior, temos o Git devidamente configurado, com credenciais (nome e e-mail) e -configurações aplicadas. Vamos então ver como o sistema de controle de -versão acontece. +Sabendo que você executou os comandos de perfil que no capÃtulo +anterior, temos o Git devidamente configurado, com credenciais (nome e +e-mail) e configurações aplicadas. Vamos então ver como o sistema de +controle de versão acontece. -```{r, engine = "bash"} -# Apenas verificando o cadastro +```{r, engine="bash", eval=FALSE} +## Apenas verificando o cadastro. git config user.name "Knight Rider" git config user.email "batman@justiceleague.org" ``` @@ -71,12 +70,10 @@ ls -a ``` - ```{r, engine="bash"} cd meu1repo ## Diretório de teste de comandos ``` - ```{r, engine="bash", echo=-c(1:2), eval=FALSE} cd meu1repo @@ -94,7 +91,7 @@ cd meu1repo git help -a ``` -### Meu Primeiro Repositório +# Meu Primeiro Repositório # ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -102,7 +99,7 @@ cd meu1repo git init ``` -O Git retorna a mensagem de inicilização do repositório. Nesse momento +O Git retorna a mensagem de inicializaçã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 @@ -117,7 +114,7 @@ estrutura. cd meu1repo ## Mostra todo conteúdo do diretório. -tree -a +tree --charset=ascii -a ``` **NOTA**: o `tree` é um programa instalado a parte (*third party @@ -132,7 +129,7 @@ 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, Bloco de Notas, Notepad++, etc) e faça algo mais criativo. +RStudio, Bloco de Notas, Notepad++, etc) e faça algo mais criativo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -141,7 +138,7 @@ cd meu1repo echo "Meu primeiro repositório Git" > README.txt ## Lista os arquivos do diretório. -tree +## tree --charset=ascii ``` ```{r, engine="bash", echo=-c(1:2)} @@ -154,15 +151,15 @@ git status E o que o Git "acha" de tudo isso? O comando *status* é o mais usado do Git, principalmente nas etapas de aprendizado. Uma caracterÃstica diferente do Git, se comparado a outras aplicações de uso por terminal, -é que ele é realmente camarada. Nas mensagens de *output*, o Git -informa o que aconteceu e também sugere o que fazer. +é que ele é realmente camarada. Nas mensagens de *output*, o Git informa +o que aconteceu e também sugere o que fazer. Este diretório agora é um diretório sob versionamento Git, portanto todas as alterações realizadas serão observadas pelo sistema. Ao -criarmos o arquivo e pedirmos a situação (*status*), o Git indica que -existe um arquivo não rastreado (*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 +criarmos o arquivo e pedirmos a situação (*status*), o Git indica que +existe um arquivo não rastreado (*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. \begin{figure} @@ -173,13 +170,14 @@ traduzidos. \label{fig:cap03_pversion} \end{figure} -De forma geral temos 3 estágios \ref{fig:cap03_pversion} de arquivos considerados no sistema de -controle de versionamento Git. São eles *working directory*, *Staged -Area* e *Committed*, os discutiremos ao logo do texto. Todo arquivo -criado em um diretório versionado deve necessariamente passar pelos três -estágios. Voltando para a nossa situação temos o arquivo `README.txt` -criado e atualmente ele está no estágio *working directory*, faremos -todo o procedimento para que chegue ao estágio *committed*. +De forma geral temos 3 estágios \ref{fig:cap03_pversion} de arquivos +considerados no sistema de controle de versionamento Git. São eles +*working directory*, *Staged Area* e *Committed*, os discutiremos ao +logo do texto. Todo arquivo criado em um diretório versionado deve +necessariamente passar pelos três estágios. Voltando para a nossa +situação temos o arquivo `README.txt` criado e atualmente ele está no +estágio *working directory*, faremos todo o procedimento para que chegue +ao estágio *committed*. Alterações em arquivos no *working directory* não são armazenadas, por isso o sugestivo nome "diretório de trabalho". Portanto, para que o @@ -202,7 +200,7 @@ 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 +leitura/escrita/execução dos arquivos são contempladas no versionamento. ```{r, engine="bash", echo=-c(1:2)} @@ -217,26 +215,25 @@ 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 +*commit*, reflita as modificações feitas. São as mensagens que serão consultadas quando você precisar desfazer/voltar. Ela deve ser curta (<= 72 caracteres) e ao mesmo tempo informativa. A minha primeira mensagem não será, todavia. - Boas Práticas de commit: \begin{itemize} -\item Verbo no indicativo} -\item Frases curtas -\item Dizer o que fez e não como fez + \item Verbo no indicativo + \item Frases curtas + \item Dizer o que fez e não como fez \end{itemize} Evite mensagens de commit como: \begin{itemize} -\item "Modificações realizadas" -\item "Trabalhei muito hoje" -\item "Terminando este trabalho na madruga" + \item "Modificações realizadas" + \item "Trabalhei muito hoje" + \item "Terminando este trabalho na madruga" \end{itemize} ```{r engine="bash", echo =-c(1:2)} @@ -256,7 +253,7 @@ projeto. São mostrados apenas os 7 primeiros dÃgitos porque são suficientes para diferenciar *commits*, seja de projetos pequenos ou até mesmo de projetos moderados ou grandes. -### Complementos +# Complementos # Para o registro de desenvolvimento, existe marcação por tags, que seriam commits especiais, geralmente usado para marcar pontos de @@ -278,10 +275,12 @@ git tag git tag -d versao1 ``` -Caso haja mudança no nome do arquivo que você esteja versionado, deve ser alterado pelo próprio git, para que fique no atual estágio de versionamento. +Caso haja mudança no nome do arquivo que você esteja versionado, deve +ser alterado pelo próprio Git, para que fique no atual estágio de +versionamento. ```{r, engine = "bash", eval = FALSE} -# git mv antigo novo +## git mv antigo novo git mv -f README.txt LEIAME.txt ``` @@ -291,7 +290,7 @@ Caso você queira excluir o arquivo git rm README.txt ``` -## Versões de Arquivos Diferentes +# Versões de Arquivos Diferentes # Vamos criar mais arquivos e acrescentar conteúdo ao já rastreado pelo Git para percebermos o funcionamento. Escrever uma lista de razões para @@ -369,10 +368,9 @@ cd meu1repo git diff ``` - -Vamos aplicar o primeiro *add* ao `porqueLinux.txt` para que ele começe +Vamos aplicar o primeiro *add* ao `porqueLinux.txt` para que ele comece 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 +criação do arquivo com conteúdo, já são separadas para receber registro (*changes to be commited*). ```{r, engine="bash", echo=-c(1:2)} @@ -397,12 +395,12 @@ 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 +agora. Pode continuar editando 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á +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)} @@ -421,8 +419,8 @@ 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*. +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 @@ -435,20 +433,18 @@ modificações entre dois *commits*, não necessariamente consecutivos, por exemplo. Também podemos retroceder (*checkout*, *reset*, *revert*) o projeto para alguns desses pontos. - ```{r, engine="bash", echo=-c(1:2)} cd meu1repo git diff HEAD@{1} ``` -InstruÃmos o Git mostrar as diferenças para um *commit* atrás. A -cabeça (*HEAD*) é o que se entende como estado mais recente. Usa-se o -termo *HEAD* (cabeça) pois considera-se um crescimento do histórico -debaixo para cima no qual um novo *commit* é colocado em cima dos demais +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. - +feito. Não é necessário escrever o último `HEAD` na instrução abaixo. Agora inspecionado uma distância de 2 *commits* a partir do último. Aqui tem-se os dois arquivos envolvidos nesse intervalo de 2 *commits*. Com @@ -495,7 +491,7 @@ 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 +desfazê-las, abandonar a correção/inclusão das palavras usando `checkout`. Vamos aplicá-lo para ver como funciona. ```{r, engine="bash", echo=-c(1:2)} @@ -557,15 +553,15 @@ 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 +(ú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 +em que `n` é um número inteiro não negativo. Cada sufixo tem uma finalidade que não detalharemos agora. Visite: [git-caret-and-tilde][]. ```{r, engine="bash", echo=-c(1:2)} @@ -599,7 +595,7 @@ git diff HEAD@{2} HEAD@{0} Para ficar claro daqui em diante, você pode ao invés de pedir `log`, pedir o `reflog` que incluà as referências em termos da sequência do -mais rencente para os seus ancestrais. +mais recente para os seus ancestrais. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -627,26 +623,27 @@ cd meu1repo git blame README.txt ``` -## Trabalhando com Ramos +# Trabalhando com Ramos # -Existem várias formas de se trabalham com ramos veja a figura \ref{fig:cap03_work}. Geralmente os ramos são feitos sob demandas para adicionar uma caracterÃstica ao projeto -(*feature*) ou corrigir um *bug*. Alguns ramos, por outro lado, são -ramos fixos destinados a receber o desenvolvimento dos ramos de -demanda. Esses ramos são geralmente chamados de *devel* (*development*) -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. +Existem várias formas de se trabalham com ramos veja a figura +\ref{fig:cap03_work}. Geralmente os ramos são feitos sob demandas para +adicionar uma caracterÃstica ao projeto (*feature*) ou corrigir um +*bug*. Alguns ramos, por outro lado, são ramos fixos destinados a +receber o desenvolvimento dos ramos de demanda. Esses ramos são +geralmente chamados de *devel* (*development*) 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. \begin{figure} \begin{center} \includegraphics [width=8cm]{./images/git_workflow.png} \end{center} - \caption{\textit{Printscreen} do passo 8} + \caption{Exemplo de esquema de ramificação de um projeto Git} \label{fig:cap03_work} \end{figure} -Para criar um ramo, usandos `git branch` seguido do nome que se +Para criar um ramo, usamos `git branch` seguido do nome que se deseja. Vamos criar um ramo para adicionar mais arquivos ou modificações ao projeto. @@ -699,8 +696,9 @@ 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. [\footnote{\url{http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R}} +variância (*vif*, _variance inflation factor_) usado em modelos de +regressão, disponÃvel na página da Professora Suely +Giolo\footnote{\url{http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R}}. ```{r, engine="bash", include=FALSE} ## Tenta ir para o diretório downloads, se não conseguir é porque não @@ -772,7 +770,7 @@ git commit -m "Adiciona função R para VIF." cd meu1repo ## Estrutura do diretório. -tree +tree --charset=ascii ``` ```{r, engine="bash", echo=-c(1:2)} @@ -804,7 +802,7 @@ git checkout master cd meu1repo ## Estrutura do diretório. -tree +tree --charset=ascii ``` O arquivo `vif.R` não sumiu. Ele está no ramo `feature01` e só passará @@ -843,11 +841,9 @@ 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. - - +É 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 @@ -960,7 +956,7 @@ else cd downloads fi -## Se não existir o aquivo pimentel_racoes.txt, então baixar da internet. +## Se não existir o aquivo pimentel_racoes.txt, então baixe da internet. if [ ! -f pimentel_racoes.txt ] then echo "Arquivo pimentel_racoes.txt não existe. Baixando..." @@ -1032,7 +1028,7 @@ No nosso projeto temos o *master* e o *feature01* em igual condição, sem nenhuma diferença. O *commit* recém feito indica um novo seguimento a partir daquele onde adicionamos novos itens na lista. Vamos criar um novo ramo porque atualmente estamos em um ramos suspenso (*detached -HEAD*) que não é persistênte. +HEAD*) que não é persistente. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -1061,8 +1057,8 @@ git log --graph --oneline --decorate --date=relative --all Vamos explorar bem a funcionalidade. Vamos voltar para o `feature01` e criar mais coisas lá. Você já deve estar pensando que tudo isso é -absurdo e jamais alguém firaria indo e voltando assim. Você está certo, -porém, quando o projeto envolve mais pessoas, cerrtamente as coisas irão +absurdo e jamais alguém ficaria indo e voltando assim. Você está certo, +porém, quando o projeto envolve mais pessoas, certamente as coisas irão bifurcar em algum ponto. ```{r, engine="bash", echo=-c(1:2)} @@ -1177,11 +1173,10 @@ git log --graph --oneline --decorate --date=relative --all ```{r, engine="bash", echo=-c(1:2)} cd meu1repo -tree +tree --charset=ascii ``` -**** -## Resolvendo conflitos +# 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 @@ -1189,7 +1184,7 @@ criar um ramo novo, modificar o arquivo na última linha e commitar. Vou voltar par ao *master* e fazer o mesmo mas vou usar um texto diferente para incluir no arquivo. Já que os ramos *feature01* e *feature02* não são mais necessários, podemos removê-los. No entanto, eles permanecem na -história do projeto e poder resurgir se você voltar no tempo. +história do projeto e poder ressurgir se você voltar no tempo. ```{r, engine="bash", echo=-c(1:2)} cd meu1repo @@ -1375,12 +1370,12 @@ 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 +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 +favorecer ninguém, ou seja, vamos encurtar para 4 dÃgitos e manter caixa alta. Dessa forma o aquivo fica assim. ```{r, engine="bash", echo=-c(1:2), include=FALSE} @@ -1416,8 +1411,6 @@ cd meu1repo git status ``` - - ```{r, engine="bash", echo=-c(1:2)} cd meu1repo # Fluxo de trabalho do repositório criado diff --git a/cap03.md b/cap03.md deleted file mode 100644 index 68c2dbcbaff505ae4d055140f031d7db1ad4992c..0000000000000000000000000000000000000000 --- a/cap03.md +++ /dev/null @@ -1,1724 +0,0 @@ -# Repositório Local -Gabriel Sartori -29/10/2015 - - -### Instruções do Git - -Neste capÃtulo, as instruções serão todas feitas no terminal mesmo que -existam alternativas gráficas para as mesmas. Isso enfatiza no que está -sendo feito além do fato de que no terminal todos devem ter os mesmos -recursos e os comandos irão produzir os mesmos resultados, o que faz -esse tutorial algo reproduzÃvel. Para usufruir das ferramentas gráfica va até o capitulo 6 **link*. - - -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. - - - - -```sh -cd meu1repo ## Diretório de teste de comandos -``` - -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. - - - -```sh -## Mostra as informações/definições do usuário. -git config --list -``` - -```sh -user.name=Knight Rider -user.email=batman@justiceleague.org -``` - -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 -``` - -``` - -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][]. - -## Minha Primeira Sessão - -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 um editor de texto favorito (Emacs, Gedit, Geany, -RStudio, Bloco de Notas, etc) e faça algo mais elaborado. - - -## Comandos De Verificação -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 -ref log - -``` -## On branch master -## Changes to be committed: -## (use "git reset HEAD <file>..." to unstage) -## -## new file: porqueLinux.txt -## -## Changes not staged for commit: -## (use "git add <file>..." to update what will be committed) -## (use "git checkout -- <file>..." to discard changes in working directory) -## -## modified: README.txt -``` - - -```bash -## Mensagem que registra as modificações adicionadas. -git commit -m "Lista de inicial de o porquê usar o Linux." -``` - -``` -## [master 448b201] Lista de inicial de o porquê usar o Linux. -## 1 file changed, 5 insertions(+) -## create mode 100644 porqueLinux.txt -``` - - -```bash -git status -``` - -``` -## On branch master -## Changes not staged for commit: -## (use "git add <file>..." to update what will be committed) -## (use "git checkout -- <file>..." to discard changes in working directory) -## -## modified: README.txt -## -## no changes added to commit (use "git add" and/or "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 -``` - -``` -## On branch master -## Changes to be committed: -## (use "git reset HEAD <file>..." to unstage) -## -## modified: README.txt -``` - - -```bash -## Atribui mensagem de notificação. -git commit -m "Adiciona frase do Linux Torvalds." -``` - -``` -## [master 41a3225] Adiciona frase do Linux Torvalds. -## 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 -``` - -``` -## 41a3225 Adiciona frase do Linux Torvalds. -## 448b201 Lista de inicial de o porquê usar o Linux. -## ffc1d12 Cria arquivo com tÃtulo. -``` - -Por meio dos *sha1*, podemos aplicar o *diff* para visitarmos as -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 -``` - -``` -## On branch master -## Changes not staged for commit: -## (use "git add <file>..." to update what will be committed) -## (use "git checkout -- <file>..." to discard changes in working directory) -## -## modified: porqueLinux.txt -## -## no changes added to commit (use "git add" and/or "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 -``` - -``` -## On branch master -## nothing to commit, working directory clean -``` - -Vamos seguir com as modificações em `porqueLinux.txt` que corrigem o -texto e acrescentam itens novos. - - - - -```bash -git status -``` - -``` -## On branch master -## Changes not staged for commit: -## (use "git add <file>..." to update what will be committed) -## (use "git checkout -- <file>..." to discard changes in working directory) -## -## modified: porqueLinux.txt -## -## no changes added to commit (use "git add" and/or "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 -``` - -``` -## 41a3225 HEAD@{0}: commit: Adiciona frase do Linux Torvalds. -## 448b201 HEAD@{1}: commit: Lista de inicial de o porquê usar o Linux. -## ffc1d12 HEAD@{2}: commit (initial): Cria arquivo com tÃtulo. -``` - - -```bash -## Adiciona e commita. -git add porqueLinux.txt -git commit -m "Novos argumentos." -``` - -``` -## [master a2c3f0d] Novos argumentos. -## 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 -``` - -``` -## ^ffc1d12 (gabriel sartori 2015-11-24 14:31:29 -0200 1) Meu primeiro repositório Git -## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 2) -## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 3) A filosofia do Linux é 'Ria na face do perigo'. -## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 4) Ôpa. Errado. 'Faça você mesmo'. É, é essa. -## 41a32255 (gabriel sartori 2015-11-24 14:31:30 -0200 5) -- Lunus Torvalds -``` - - -## Fazendo cópias e trabalhando com ramos - -Existem várias formas de se trabalham com ramos. Geralmente os ramos são -feitos sob demandas para adicionar uma caracterÃstica ao projeto -(*feature*) ou corrigir um *bug*. Alguns ramos, por outro lado, são -ramos fixos destinados a receber o desenvolvimento dos ramos de -demanda. Esses ramos são geralmente chamados de *devel* (*development*) -e *release*. O ramo *master* é o default e em geral, para projetos -grandes, o *master* só recebe versões funcionais do projeito, livre de -bugs. - -Para criar um ramo, usandos `git branch` seguido do nome que se -deseja. Vamos criar um ramo para adicionar mais arquivos ou modificações -ao projeto. - - -```bash -## Lista ramos (all), locais e remotos. -## git branch ## Só ramos locais -## git branch -r ## Só ramos remotos -git branch -a ## Todos os ramos. -``` - -``` -## * master -``` - - -```bash -## Cria um ramo para adição de conteúdo, novo segmento. -git branch feature01 -``` - - -```bash -## Novo ramo criado aparece. -git branch -``` - -``` -## feature01 -## * master -``` - - -```bash -## Muda o HEAD de ramo. -git checkout feature01 -``` - -``` -## Switched to branch 'feature01' -``` - - -```bash -## Situação no novo ramo. -git status -``` - -``` -## On branch feature01 -## nothing to commit, working directory clean -``` - - -```bash -## Histórico de commits. -git log --oneline -``` - -``` -## a2c3f0d Novos argumentos. -## 41a3225 Adiciona frase do Linux Torvalds. -## 448b201 Lista de inicial de o porquê usar o Linux. -## ffc1d12 Cria arquivo com tÃtulo. -``` - -Veja que o novo ramo não começa no zero ou vazio (sem arquivos) e sim a -partir do ramo que é seu ancestral, ou seja, ele começa a partir do -último *commit* existente, por padrão. Vamos adicionar um arquivo e -commitar. O comando `wget` permite baixar arquivos pelo terminal. Será -baixado um arquivo com um função para calcular o fator de inflação de -variância (*vif*, variance inflation factor) usado em modelos de -regressão, disponÃvel na página da [Professora Suely Giolo][]. - - - - -```bash -## Baixando arquivo da internet. Uma função do R. -wget 'http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R' -``` - - -``` -## --2015-11-24 14:31:30-- http://people.ufpr.br/~giolo/CE071/Exemplos/vif.R -## Resolving people.ufpr.br (people.ufpr.br)... ???.??.???.??, 2801:82:8020:0:8377:0:100:20 -## Connecting to people.ufpr.br (people.ufpr.br)|???.??.???.??|:80... connected. -## HTTP request sent, awaiting response... 200 OK -## Length: 560 -## Saving to: ‘vif.R’ -## -## 0K 100% 44,0M=0s -## -## 2015-11-24 14:31:30 (44,0 MB/s) - ‘vif.R’ saved [560/560] -``` - - -```bash -## Situação do repositório após o download. -git status -``` - -``` -## On branch feature01 -## Untracked files: -## (use "git add <file>..." to include in what will be committed) -## -## vif.R -## -## nothing added to commit but untracked files present (use "git add" to track) -``` - - -```bash -git add vif.R -git commit -m "Adiciona função R para VIF." -``` - -``` -## [feature01 ed304f7] Adiciona função R para VIF. -## 1 file changed, 20 insertions(+) -## create mode 100644 vif.R -``` - - -```bash -## Estrutura do diretório. -tree -``` - -``` -## . -## ├── porqueLinux.txt -## ├── README.txt -## └── vif.R -## -## 0 directories, 3 files -``` - - -```bash -## Histórico de commits. -git reflog -``` - -``` -## ed304f7 HEAD@{0}: commit: Adiciona função R para VIF. -## a2c3f0d HEAD@{1}: checkout: moving from master to feature01 -## a2c3f0d HEAD@{2}: commit: Novos argumentos. -## 41a3225 HEAD@{3}: commit: Adiciona frase do Linux Torvalds. -## 448b201 HEAD@{4}: commit: Lista de inicial de o porquê usar o Linux. -## ffc1d12 HEAD@{5}: commit (initial): Cria arquivo com tÃtulo. -``` - - -```bash -git status -``` - -``` -## On branch feature01 -## nothing to commit, working directory clean -``` - -Então acabamos de acrescentar um novo aquivo ao projeto. Agora que as -modificações foram salvas (*commit* feito) podemos trocar de ramo. Você -vai ver que ao voltarmos para o ramo *master* o arquivo baixado da -internet vai "desaparecer". - - -```bash -## Volta para o ramo master. -git checkout master -``` - -``` -## Switched to branch 'master' -``` - - -```bash -## Estrutura do diretório. -tree -``` - -``` -## . -## ├── 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 a2c3f0d..ed304f7 -## Fast-forward -## vif.R | 20 ++++++++++++++++++++ -## 1 file changed, 20 insertions(+) -## create mode 100644 vif.R -``` - - -```bash -git log --oneline -``` - -``` -## ed304f7 Adiciona função R para VIF. -## a2c3f0d Novos argumentos. -## 41a3225 Adiciona frase do Linux Torvalds. -## 448b201 Lista de inicial de o porquê usar o Linux. -## ffc1d12 Cria arquivo com tÃtulo. -``` - -É possÃvel criar um ramo a partir de um *commit* ancestral ao atual. Isso -é extremamente útil para resolver os bugs. Vamos fazer um segundo ramo a -partir do *commit* anterior a inclusão do arquivo R. - - -```bash -## Referencias aos commits. -git reflog -``` - -``` -## ed304f7 HEAD@{0}: merge feature01: Fast-forward -## a2c3f0d HEAD@{1}: checkout: moving from feature01 to master -## ed304f7 HEAD@{2}: commit: Adiciona função R para VIF. -## a2c3f0d HEAD@{3}: checkout: moving from master to feature01 -## a2c3f0d HEAD@{4}: commit: Novos argumentos. -## 41a3225 HEAD@{5}: commit: Adiciona frase do Linux Torvalds. -## 448b201 HEAD@{6}: commit: Lista de inicial de o porquê usar o Linux. -## ffc1d12 HEAD@{7}: commit (initial): Cria arquivo com tÃtulo. -``` - - -```bash -## Volta para antes do arquivo de baixar o vif.R. -git checkout HEAD@{4} -``` - -``` -## Note: checking out 'HEAD@{4}'. -## -## You are in 'detached HEAD' state. You can look around, make experimental -## changes and commit them, and you can discard any commits you make in this -## state without impacting any branches by performing another checkout. -## -## If you want to create a new branch to retain commits you create, you may -## do so (now or later) by using -b with the checkout command again. Example: -## -## git checkout -b new_branch_name -## -## HEAD is now at a2c3f0d... Novos argumentos. -``` - - -```bash -## Qual a situação. -git status -``` - -``` -## HEAD detached at a2c3f0d -## nothing to commit, working directory clean -``` - - -```bash -## O histório existente nesse ponto. -git log --name-only --oneline -``` - -``` -## a2c3f0d Novos argumentos. -## porqueLinux.txt -## 41a3225 Adiciona frase do Linux Torvalds. -## README.txt -## 448b201 Lista de inicial de o porquê usar o Linux. -## porqueLinux.txt -## ffc1d12 Cria arquivo com tÃtulo. -## README.txt -``` - -Já que o *commit* mais recente dessa história aponta para o arquivo -compras, vamos checar o seu conteúdo apenas por medida de segurança. - - -```bash -## Mostra o conteúdo do arquivo. -less porqueLinux.txt -``` - -``` -## Por que usar o Linux? -## -## * É livre -## * É seguro -## * É customizável -## * Tem repositórios de software -## * Atualização constante -## * Desempenho -``` - -Dito e feito! Voltamos no tempo para o instante logo após o *commit* que -incluà novos itens na lista. Podemos voltar para o presente se -estivermos satisfeitos com o passeio mas também podemos criar um ramo -aqui, caso isso seja necessário. Primeiro vamos voltar para o presente -depois mostramos como criar o ramo. - - -```bash -## Mostra onde estamos. -git branch -``` - -``` -## * (detached from a2c3f0d) -## feature01 -## master -``` - -Se não fizemos nenhuma modificação, voltar é bem simples. Se -modificações foram feitas é necessário saber se precisam ser mantidas e -onde ou se devem ser descartadas. - - -```bash -## Volta para o presente. -git checkout master -``` - -``` -## Previous HEAD position was a2c3f0d... Novos argumentos. -## Switched to branch 'master' -``` - - -```bash -git status -``` - -``` -## On branch master -## nothing to commit, working directory clean -``` - - -```bash -git log --oneline -``` - -``` -## ed304f7 Adiciona função R para VIF. -## a2c3f0d Novos argumentos. -## 41a3225 Adiciona frase do Linux Torvalds. -## 448b201 Lista de inicial de o porquê usar o Linux. -## ffc1d12 Cria arquivo com tÃtulo. -``` - - -```bash -## Fenda no tempo fechada. Sem sinal do detached HEAD. -git branch -``` - -``` -## feature01 -## * master -``` - - -```bash -## Sinal do passeio no tempo. -git reflog -``` - -``` -## ed304f7 HEAD@{0}: checkout: moving from a2c3f0d2a344bf7c680ec67982efca4f5cdf164c to master -## a2c3f0d HEAD@{1}: checkout: moving from master to HEAD@{4} -## ed304f7 HEAD@{2}: merge feature01: Fast-forward -## a2c3f0d HEAD@{3}: checkout: moving from feature01 to master -## ed304f7 HEAD@{4}: commit: Adiciona função R para VIF. -## a2c3f0d HEAD@{5}: checkout: moving from master to feature01 -## a2c3f0d HEAD@{6}: commit: Novos argumentos. -## 41a3225 HEAD@{7}: commit: Adiciona frase do Linux Torvalds. -## 448b201 HEAD@{8}: commit: Lista de inicial de o porquê usar o Linux. -## ffc1d12 HEAD@{9}: commit (initial): Cria arquivo com tÃtulo. -``` - -Vamos começar a ser ousados. Vamos voltar no passado, adicionar um -arquivo, commitar e ver o que acontece, como o histórico é representado. - - -```bash -## Volta no tempo, após commit que aumenta porqueLinux.txt. -git checkout HEAD@{6} -``` - -``` -## Note: checking out 'HEAD@{6}'. -## -## You are in 'detached HEAD' state. You can look around, make experimental -## changes and commit them, and you can discard any commits you make in this -## state without impacting any branches by performing another checkout. -## -## If you want to create a new branch to retain commits you create, you may -## do so (now or later) by using -b with the checkout command again. Example: -## -## git checkout -b new_branch_name -## -## HEAD is now at a2c3f0d... Novos argumentos. -``` - - - - -```bash -## Baixa arquivo de dados da internet. -wget 'http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt' -``` - - -``` -## --(date +"%Y-%m-%d %H:%M:%S")-- http://www.leg.ufpr.br/~walmes/data/pimentel_racoes.txt -## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? -## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. -## HTTP request sent, awaiting response... 200 OK -## Length: 217 [text/plain] -## Saving to: ‘pimentel_racoes.txt’ -## -## 0K 100% 68,9M=0s -## -## (date +"%Y-%m-%d %H:%M:%S") (68,9 MB/s) - ‘pimentel_racoes.txt’ saved [217/217] -## -## ‘pimentel_racoes.txt’ -> ‘../meu1repo/pimentel_racoes.txt’ -``` - - -```bash -git status -``` - -``` -## HEAD detached at a2c3f0d -## Untracked files: -## (use "git add <file>..." to include in what will be committed) -## -## pimentel_racoes.txt -## -## nothing added to commit but untracked files present (use "git add" to track) -``` - - -```bash -## Adiciona para registrar a inclusão do arquivo. -git add pimentel_racoes.txt -git commit -m "Adiciona aquivo de dados de experimento com rações." -``` - -``` -## [detached HEAD 344674a] Adiciona aquivo de dados de experimento com rações. -## 1 file changed, 24 insertions(+) -## create mode 100644 pimentel_racoes.txt -``` - - -```bash -git status -``` - -``` -## HEAD detached from a2c3f0d -## nothing to commit, working directory clean -``` - - -```bash -## Log num formato gráfico ASCII para mostrar o novo ramo. -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 344674a (HEAD) Adiciona aquivo de dados de experimento com rações. -## | * ed304f7 (master, feature01) Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - -No nosso projeto temos o *master* e o *feature01* em igual condição, sem -nenhuma diferença. O *commit* recém feito indica um novo seguimento a -partir daquele onde adicionamos novos itens na lista. Vamos criar um -novo ramo porque atualmente estamos em um ramos suspenso (*detached -HEAD*) que não é persistênte. - - -```bash -git branch -``` - -``` -## * (detached from a2c3f0d) -## feature01 -## master -``` - - -```bash -## Um novo ramo a partir do atual HEAD. -git checkout -b feature02 -``` - -``` -## Switched to a new branch 'feature02' -``` - - -```bash -git branch -``` - -``` -## feature01 -## * feature02 -## master -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 344674a (HEAD, feature02) Adiciona aquivo de dados de experimento com rações. -## | * ed304f7 (master, feature01) Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - -Vamos explorar bem a funcionalidade. Vamos voltar para o `feature01` e -criar mais coisas lá. Você já deve estar pensando que tudo isso é -absurdo e jamais alguém firaria indo e voltando assim. Você está certo, -porém, quando o projeto envolve mais pessoas, cerrtamente as coisas irão -bifurcar em algum ponto. - - -```bash -git checkout feature01 -``` - -``` -## Switched to branch 'feature01' -``` - - -``` -## Diretório existe. -## Arquivo brasilCopa2014.txt já existe. -## ‘brasilCopa2014.txt’ -> ‘../meu1repo/brasilCopa2014.txt’ -``` - - -```bash -wget 'http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt' -``` - - -``` -## --2015-11-24 14:31:31-- http://www.leg.ufpr.br/~walmes/cursoR/geneticaEsalq/brasilCopa2014.txt -## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? -## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. -## HTTP request sent, awaiting response... 200 OK -## Length: 1254 (1,2K) [text/plain] -## Saving to: ‘brasilCopa2014.txt’ -## -## 0K . 100% 69,6M=0s -## -## 2015-11-24 14:31:31 (69,6 MB/s) - ‘brasilCopa2014.txt’ saved [1254/1254] -``` - - -```bash -git add brasilCopa2014.txt -git commit -m "Arquivo sobre copa 2014 celeção brasileira." -``` - -``` -## [feature01 78a7842] Arquivo sobre copa 2014 celeção brasileira. -## 1 file changed, 22 insertions(+) -## create mode 100644 brasilCopa2014.txt -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 78a7842 (HEAD, feature01) Arquivo sobre copa 2014 celeção brasileira. -## * ed304f7 (master) Adiciona função R para VIF. -## | * 344674a (feature02) Adiciona aquivo de dados de experimento com rações. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - -Agora nos temos o *feature01* na frente do master e o *feature02* ao -lado. O conteúdo dos dois ramos terá que ser incorporado ao *master* em -algum momento porque é assim que funciona. Mas não há razões para -preocupação pois o propósito do Git é justamente facilitar esse -processo. Nesse caso, por exemplo, como as diferenças nos ramos consiste -na adição de arquivos diferentes, incorporar as modificações no *master* -será uma tarefa simples para o Git. O agravante é quando em dois ramos -(ou duas pessoas) o mesmo arquivo é modificado no mesmo intervalo de -linhas. Nessa situação o *merge* nos arquivos deve ser supervisionado e -não automático. Vamos incorporar as modificações dos ramos ao master -então. - - -```bash -## Volta para o master. -git checkout master -``` - -``` -## Switched to branch 'master' -``` - - -```bash -## Mescla o feature01. -git merge feature01 master -``` - -``` -## Updating ed304f7..78a7842 -## Fast-forward -## brasilCopa2014.txt | 22 ++++++++++++++++++++++ -## 1 file changed, 22 insertions(+) -## create mode 100644 brasilCopa2014.txt -``` - - -```bash -## Mescla o feature02. -git merge feature02 master -``` - -``` -## Merge made by the 'recursive' strategy. -## pimentel_racoes.txt | 24 ++++++++++++++++++++++++ -## 1 file changed, 24 insertions(+) -## create mode 100644 pimentel_racoes.txt -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 0bac2be (HEAD, master) Merge branch 'feature02' -## |\ -## | * 344674a (feature02) Adiciona aquivo de dados de experimento com rações. -## * | 78a7842 (feature01) Arquivo sobre copa 2014 celeção brasileira. -## * | ed304f7 Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - - -```bash -tree -``` - -``` -## . -## ├── brasilCopa2014.txt -## ├── pimentel_racoes.txt -## ├── porqueLinux.txt -## ├── README.txt -## └── vif.R -## -## 0 directories, 5 files -``` - -**** -## Resolvendo conflitos - -Agora vamos de propósito mostrar uma situação em que não é possÃvel -fazer o merge automaticamente. Vamos criar um conflito. Para isso vou -criar um ramo novo, modificar o arquivo na última linha e commitar. Vou -voltar par ao *master* e fazer o mesmo mas vou usar um texto diferente -para incluir no arquivo. Já que os ramos *feature01* e *feature02* não -são mais necessários, podemos removê-los. No entanto, eles permanecem na -história do projeto e poder resurgir se você voltar no tempo. - - -```bash -## Remove ramos. -git branch -d feature01 -git branch -d feature02 -git branch -``` - -``` -## Deleted branch feature01 (was 78a7842). -## Deleted branch feature02 (was 344674a). -## * master -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 0bac2be (HEAD, master) Merge branch 'feature02' -## |\ -## | * 344674a Adiciona aquivo de dados de experimento com rações. -## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. -## * | ed304f7 Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - -Agora vou criar um novo ramo, adicionar um arquivo e encurtar o nome das -colunas no cabeçalho. - - -```bash -## Muda para um ramo criado na hora. -git checkout -b feature03 -``` - -``` -## Switched to a new branch 'feature03' -``` - - - - -```bash -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' -``` - - -``` -## --2015-11-24 14:31:31-- http://www.leg.ufpr.br/~walmes/data/bib1.txt -## Resolving www.leg.ufpr.br (www.leg.ufpr.br)... ???.??.???.?? -## Connecting to www.leg.ufpr.br (www.leg.ufpr.br)|???.??.???.??|:80... connected. -## HTTP request sent, awaiting response... 200 OK -## Length: 535 [text/plain] -## Saving to: ‘bib1.txt’ -## -## 0K 100% 35,0M=0s -## -## 2015-11-24 14:31:31 (35,0 MB/s) - ‘bib1.txt’ saved [535/535] -``` - - -```bash -## Mostra as 4 primeiras linhas. -head -4 bib1.txt -``` - -``` -## repetição variedade bloco y -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -``` - -Ao encurtar o nome para quatro dÃgitos, fica assim. - - -```bash -## Substitui o conteúdo da primeira linha pelos nomes truncados em 4 -## dÃgidos e separados por tabulação. Etapa que você pode fazer no seu -## editor de texto. -sed -i "1s/.*/rept\tvari\tbloc\ty/" bib1.txt -head -4 bib1.txt -``` - -``` -## rept vari bloc y -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -``` - - -```bash -git add bib1.txt -git commit -m "Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos." -``` - -``` -## [feature03 ef648bb] Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -## 1 file changed, 58 insertions(+) -## create mode 100644 bib1.txt -``` - -Baixamos e modificamos o arquivo. Adicionamos e fizemos o registro das -modificações. Agora vamos voltar ao *master* e baixar o arquivo também, -fazendo de conta que é outra pessoa trabalhando no mesmo projeto, mas -essa pessoa vai passar a cabeçalho para caixa alta. - - -```bash -git checkout master -``` - -``` -## Switched to branch 'master' -``` - - - - -```bash -## Baixa o arquivo. -wget 'http://www.leg.ufpr.br/~walmes/data/bib1.txt' -``` - -Ao encurtar o nome para quatro dÃgitos, fica assim. - - -```bash -## Substitui o conteúdo da primeira linha pelo mesmo em caixa alta. Faça -## isso no seu editor de texto de preferido. -sed -i '1s/.*/\U&/' bib1.txt -head -4 bib1.txt -``` - -``` -## REPETIÇÃO VARIEDADE BLOCO Y -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -``` - - -```bash -git add bib1.txt -git commit -m "Arquivo de experimento em BIB. Cabeçalho em caixa alta." -``` - -``` -## [master 87e8601] Arquivo de experimento em BIB. Cabeçalho em caixa alta. -## 1 file changed, 58 insertions(+) -## create mode 100644 bib1.txt -``` - - -```bash -git diff master feature03 -``` - -``` -## diff --git a/bib1.txt b/bib1.txt -## index a8dfaa6..b5f5963 100644 -## --- a/bib1.txt -## +++ b/bib1.txt -## @@ -1,4 +1,4 @@ -## -REPETIÇÃO VARIEDADE BLOCO Y -## +rept vari bloc y -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * ef648bb (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -## | * 87e8601 (HEAD, master) Arquivo de experimento em BIB. Cabeçalho em caixa alta. -## |/ -## * 0bac2be Merge branch 'feature02' -## |\ -## | * 344674a Adiciona aquivo de dados de experimento com rações. -## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. -## * | ed304f7 Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - - -```bash -## Dá mensagem de erro que informa o conflito. -git merge feature03 master -``` - - -``` -## Auto-merging bib1.txt -## CONFLICT (add/add): Merge conflict in bib1.txt -## Automatic merge failed; fix conflicts and then commit the result. -``` - - -```bash -git status -``` - -``` -## On branch master -## You have unmerged paths. -## (fix conflicts and run "git commit") -## -## Unmerged paths: -## (use "git add <file>..." to mark resolution) -## -## both added: bib1.txt -## -## no changes added to commit (use "git add" and/or "git commit -a") -``` - - -```bash -## `less` printa o conteúdo do arquivo mas `head` limita para 10 linhas. -less bib1.txt | head -10 -``` - -``` -## <<<<<<< HEAD -## REPETIÇÃO VARIEDADE BLOCO Y -## ======= -## rept vari bloc y -## >>>>>>> feature03 -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -## 1 4 2 16 -## 1 5 3 14 -``` - -Então deu conflito e o Git informa que ele deve ser resolvido. Resolver -o conflito aqui significa abrir os arquivos com problema listados no git -status e editar de tal forma a desconflitar. Nas regiões de conflito o -Git sinaliza de forma especial, indicando por divisórias (`<<<<<<<`, -`=======` e `>>>>>>>`) as versões no HEAD (ramo *master*) e no ramos a -ser incorporado (*feature03*). Então vamos resolver o conflito sem -favorecer ninguém, ou seja, vamos encurtar para 4 digitos e manter caixa -alta. Dessa forma o aquivo fica assim. - - - - -```bash -## Arquivo depois da edição que resolve o conflito. -head -6 bib1.txt -``` - -``` -## REPT VARI BLOC Y -## 1 1 1 20 -## 1 2 1 18 -## 1 3 2 15 -## 1 4 2 16 -## 1 5 3 14 -``` - - -```bash -git status -``` - -``` -## On branch master -## You have unmerged paths. -## (fix conflicts and run "git commit") -## -## Unmerged paths: -## (use "git add <file>..." to mark resolution) -## -## both added: bib1.txt -## -## no changes added to commit (use "git add" and/or "git commit -a") -``` - - -```bash -git add bib1.txt -git commit -m "Resolve conflito, trunca com caixa alta." -``` - -``` -## [master 52b1f76] Resolve conflito, trunca com caixa alta. -``` - - -```bash -git status -``` - -``` -## On branch master -## nothing to commit, working directory clean -``` - - -```bash -git log --graph --oneline --decorate --date=relative --all -``` - -``` -## * 52b1f76 (HEAD, master) Resolve conflito, trunca com caixa alta. -## |\ -## | * ef648bb (feature03) Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -## * | 87e8601 Arquivo de experimento em BIB. Cabeçalho em caixa alta. -## |/ -## * 0bac2be Merge branch 'feature02' -## |\ -## | * 344674a Adiciona aquivo de dados de experimento com rações. -## * | 78a7842 Arquivo sobre copa 2014 celeção brasileira. -## * | ed304f7 Adiciona função R para VIF. -## |/ -## * a2c3f0d Novos argumentos. -## * 41a3225 Adiciona frase do Linux Torvalds. -## * 448b201 Lista de inicial de o porquê usar o Linux. -## * ffc1d12 Cria arquivo com tÃtulo. -``` - - -```bash -git reflog -``` - -``` -## 52b1f76 HEAD@{0}: commit (merge): Resolve conflito, trunca com caixa alta. -## 87e8601 HEAD@{1}: commit: Arquivo de experimento em BIB. Cabeçalho em caixa alta. -## 0bac2be HEAD@{2}: checkout: moving from feature03 to master -## ef648bb HEAD@{3}: commit: Arquivo de experimento em BIB. Trunca cabeçalho 4 digitos. -## 0bac2be HEAD@{4}: checkout: moving from master to feature03 -## 0bac2be HEAD@{5}: merge feature02: Merge made by the 'recursive' strategy. -## 78a7842 HEAD@{6}: merge feature01: Fast-forward -## ed304f7 HEAD@{7}: checkout: moving from feature01 to master -## 78a7842 HEAD@{8}: commit: Arquivo sobre copa 2014 celeção brasileira. -## ed304f7 HEAD@{9}: checkout: moving from feature02 to feature01 -## 344674a HEAD@{10}: checkout: moving from 344674a37125d278b22320956316e7df2e939fdc to feature02 -## 344674a HEAD@{11}: commit: Adiciona aquivo de dados de experimento com rações. -## a2c3f0d HEAD@{12}: checkout: moving from master to HEAD@{6} -## ed304f7 HEAD@{13}: checkout: moving from a2c3f0d2a344bf7c680ec67982efca4f5cdf164c to master -## a2c3f0d HEAD@{14}: checkout: moving from master to HEAD@{4} -## ed304f7 HEAD@{15}: merge feature01: Fast-forward -## a2c3f0d HEAD@{16}: checkout: moving from feature01 to master -## ed304f7 HEAD@{17}: commit: Adiciona função R para VIF. -## a2c3f0d HEAD@{18}: checkout: moving from master to feature01 -## a2c3f0d HEAD@{19}: commit: Novos argumentos. -## 41a3225 HEAD@{20}: commit: Adiciona frase do Linux Torvalds. -## 448b201 HEAD@{21}: commit: Lista de inicial de o porquê usar o Linux. -## ffc1d12 HEAD@{22}: commit (initial): Cria arquivo com tÃtulo. -``` - - - diff --git a/cap04.Rmd b/cap04.Rmd index a261909aa523ba83dc1b2924abc381cf97eb706d..38200c85ca9cc3e48a8d409a8c3ef494c4d99802 100644 --- a/cap04.Rmd +++ b/cap04.Rmd @@ -2,10 +2,11 @@ title: "Projetos Remotos" author: "PET EstatÃstica UFPR" graphics: yes -header-includes: \usepackage{menukeys} +header-includes: + \usepackage{menukeys} output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -13,8 +14,6 @@ output: number_sections: true --- -\chapter{Projetos Remotos} - Nos capÃtulos anteriores descrevemos como instalar o Git e ter projetos versionados. No entanto, o uso do Git até então foi apenas local. Os arquivos eram mantidos na sua máquina de trabalho e disponÃveis só para @@ -25,7 +24,7 @@ vários segmentos sejam conduzidos de forma independente e no futuro, quando apropriado, reunidos em um único *branch*. Isso é exatamente o que precisamos para trabalhar em equipe, certo? Se cada colaborador pudesse ter um ramo separado do projeto para trabalhar, todos poderiam -trabalhar simultâneamente. Quando oportuno, bastaria fazer merges para +trabalhar simultaneamente. Quando oportuno, bastaria fazer merges para reunir o trabalho. A questão é: como deixar o projeto disponÃvel para os colaboradores? @@ -38,7 +37,7 @@ desktop do *escritório*. O repositório remoto serve de centro do seu repositório Git. Como ele está em um servidor que você tem acesso, você pode compartilhar o -repositório com outras máquinas, clonado de lá. Ele serve como *backup* +repositório com outras máquinas, clonando de lá. Ele serve como *backup* do repositório. Aqui não se trabalha em colaboração mas o processo permite acessar o @@ -67,7 +66,7 @@ Caso queira, você também pode usar `git init`. A diferença entre eles é só onde ficam os arquivos do versionamento. Com `git init`, um diretório oculto `.git/` é o repositório Git e os arquivos de trabalho, como o `README.md`, ficam ao lado dele na estrutura de diretório. Com `git ---bare init` o conteúdo do repositório Git fica na raÃz. Essa última +--bare init` o conteúdo do repositório Git fica na raiz. Essa última opção é justamente para criar repositórios remotos que vão justamente manter a parte repositório e não os arquivos. @@ -99,7 +98,7 @@ git remote -v ``` Esse endereço pode ter IP, porque na realidade, todo servidor tem um -IP. Por exemplo, o servidor do <github.com> tem o IP +IP. Por exemplo, o servidor do `github.com` tem o IP 192.30.252.129. Para saber o IP é só dar um *ping* no endereço. ```{r, engine="bash", eval=FALSE} @@ -180,20 +179,20 @@ ssh eu@111.22.333.44\ # Repositório remoto coletivo -A única diferença é recomendamos a você criar um novo usuário e adicionar -as chaves públicas de todos os membros. Evite adicionar chaves públicas -para usuários na sua conta porque isso expõe seus documentos, alguma -operação desastrosa por parte de alguém pode comprometê-los. Por isso, -crie um usuário, por exemplo `gitusers`, para nesta conta manter o +A única diferença é recomendamos a você criar um novo usuário e +adicionar as chaves públicas de todos os membros. Evite adicionar chaves +públicas para usuários na sua conta porque isso expõe seus documentos, +alguma operação desastrosa por parte de alguém pode comprometê-los. Por +isso, crie um usuário, por exemplo `gitusers`, para nesta conta manter o repositório remoto. Solicite que os colaboradores gerem as chaves públicas e te enviem o arquivo `id_rsa.pub`. Depois você adiciona cada chave ao `authorized_keys` de conta `gitusers`. Com chaves autorizadas, os -colaboradores podem transferir arquivos, podem logar no servidor mas -não podem instalar nada, a menos que você passe a senha do usuário -`gitusers`. Para crias usuários no servidor, você precisa de -privilégios de *admin*. +colaboradores podem transferir arquivos, podem logar no servidor mas não +podem instalar nada, a menos que você passe a senha do usuário +`gitusers`. Para crias usuários no servidor, você precisa de privilégios +de *admin*. ```{r, engine="bash", eval=FALSE} ## Logar na servidora. @@ -221,7 +220,6 @@ ssh gitusers@111.22.333.44\ "cat >> ~/.ssh/authorized_keys2" < todos.pub ``` - # Fluxo de trabalho com repositório remoto, do clone ao push ## Git clone @@ -230,8 +228,10 @@ Este comando é usado para clonar um repositório do servidor remoto para um servidor local, caso você queira copiar um repositório que já existe para realizar colaborações em um projeto que queira participar. Você terá acesso a todos os arquivos e poderá verificar as diferentes versões -destes. Supondo que sua equipe de trabalho possui uma biblioteca Git **Teste Clone**, onde são armazenados todos os arquivos. Você pode clonar estes arquivos para o seu diretório de trabalho e assim modificá-los conforme deseja. - +destes. Supondo que sua equipe de trabalho possui uma biblioteca Git +**Teste Clone**, onde são armazenados todos os arquivos. Você pode +clonar estes arquivos para o seu diretório de trabalho e assim +modificá-los conforme deseja. **Exemplo:** ```{r, engine="bash", eval=FALSE} @@ -252,10 +252,13 @@ git clone git@gitlab.c3sl.ufpr.br:pet-estatistica/TesteClone.git DirTeste ## Git Push -Após clonar e realizar contribuições ao projeto, você pode enviá-los para o repositório remoto. Estes arquivos, após o `Git push`, estarão prontos para serem integrados ao projeto com o `merge`. -Usado para transferência de arquivos entre repositório local e o -servidor remoto. Como o nome já diz, o comando empurra os arquivos para -o servidor remoto. No exemplo abaixo enviaremos a ramificação `Branch Master` para o servidor chamado `origin`: +Após clonar e realizar contribuições ao projeto, você pode enviá-los +para o repositório remoto. Estes arquivos, após o `Git push`, estarão +prontos para serem integrados ao projeto com o `merge`. Usado para +transferência de arquivos entre repositório local e o servidor +remoto. Como o nome já diz, o comando empurra os arquivos para o +servidor remoto. No exemplo abaixo enviaremos a ramificação `Branch +Master` para o servidor chamado `origin`: **Exemplo:** ```{r, engine="bash", eval=FALSE} @@ -269,11 +272,12 @@ realizou o push por último serão desconsideradas. ## Git Pull -Para obter todos os arquivos presentes no projeto, você pode importar os arquivos do branch `master`. -Toda vez que você utilizar o `Git pull` a última versão de todos os arquivos estarão no seu diretório. -Também usado para transferência de arquivos, o comando puxa os -arquivos do servidor remoto para o repositório local e faz o merge do -mesmo, fundindo a última versão com a versão atualizada. +Para obter todos os arquivos presentes no projeto, você pode importar os +arquivos do branch `master`. Toda vez que você utilizar o `Git pull` a +última versão de todos os arquivos estarão no seu diretório. Também +usado para transferência de arquivos, o comando puxa os arquivos do +servidor remoto para o repositório local e faz o merge do mesmo, +fundindo a última versão com a versão atualizada. **Exemplo:** ```{r, engine="bash", eval=FALSE} @@ -300,11 +304,10 @@ basta utilizar o comando `git diff`: git diff master origin/master ``` - # Listar branches locais/remotos -O comando `git remote` é usado para -verificar quais repositórios estão configurados. +O comando `git remote` é usado para verificar quais repositórios estão +configurados. **Exemplo:** para retornar a lista de repositórios: @@ -316,13 +319,12 @@ No comando acima é possÃvel visualizar o remoto padrão **origin** (URL SSH para onde será possÃvel enviar os seus arquivos). **Exemplo:** para retornar o nome dos repositórios com a URL onde foram -armazanados: +armazenados: ```{r, engine="bash", echo=TRUE, eval=FALSE} git remote -v ``` - # Adicionar, renomear, deletar remote ## Adicionando repositórios remotos @@ -335,8 +337,10 @@ como exemplo o projeto **Apostila-git**. **Exemplo:** ```{r, engine="bash", echo=TRUE, eval=FALSE} -git remote add MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git -# Quando executamos novamente o comando para obter a lista de repositórios: +git remote add MeuRepo \ + git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git + +## A lista de repositórios agora é: git remote -v ``` @@ -376,18 +380,20 @@ removido o repositório renomeado anteriormente `RenameRepo`. ## Deletar ramos no servidor -Quando houver um branch que não está sendo utilizado ou está concluÃdo, há a opção de excluÃ-lo do servidor. -Se for necessário apagar branches remotos, podemos utilizar o comando a seguir: +Quando houver um branch que não está sendo utilizado ou está concluÃdo, +há a opção de excluÃ-lo do servidor. Se for necessário apagar branches +remotos, podemos utilizar o comando a seguir: **Exemplo:** ```{r, engine="bash", eval=FALSE} git push origin --delete <branch> ``` - ## Clonar apenas um *branch*, *commit* ou *tag*. -É possÃvel clonar apenas um branch e não o repositório Git completo. Supondo que no repositório há um branch chamado `MeuBranch` dentro do repositório `MeuRepo`, clonaremos o branch. +É possÃvel clonar apenas um branch e não o repositório Git +completo. Supondo que no repositório há um branch chamado `MeuBranch` +dentro do repositório `MeuRepo`, clonaremos o branch. **Exemplo:** ```{r, engine="bash", eval=FALSE} @@ -398,13 +404,13 @@ O Git ainda permite clonar um commit ou tag. **Exemplo:** ```{r, engine="bash", eval=FALSE} -# Para uma tag: +## Para uma tag: git -e: //git.myproject.org/MyProject.git@v1.0#egg=MyProject -# Para um commit: + +## Para um commit: git -e: //git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject ``` - # Criando um Repositório Git # Primeiramente é necessário ter acesso a um servidor Linux com chave SSH, @@ -423,8 +429,8 @@ mkdir MeuRepo.git git --bare init ``` -As configurações do servidor estão completas. A partir de agora você pode -realizar os primeiros comandos para iniciar o repositório criado. +As configurações do servidor estão completas. A partir de agora você +pode realizar os primeiros comandos para iniciar o repositório criado. # Git no servidor # @@ -439,10 +445,10 @@ não contém um diretório de trabalho. ``` Acima foi criado um repositório limpo `MeuRepo.git`, no qual está -armazenada a cópia de todos os arquivos do diretorio Git. +armazenada a cópia de todos os arquivos do diretório Git. Após este primeiro passo o repositório limpo será colocado no Servidor e -configurado os protolocos. No exemplo abaixo, supondo que você tem +configurado os protocolos. No exemplo abaixo, supondo que você tem configurado um servidor `git.servidor.com`, e um diretório `/dir/git`no qual você quer armazenar seus repositórios. Ao copiar o seu repositório limpo, você pode configurar seu novo repositório. @@ -485,10 +491,17 @@ Para visualizar a chave basta digitar o seguinte comando: cat ~/.ssh/id_rsa.pub ``` -A chave está no arquivo `id_rsa.pub`. O usuário deve copiar o texto deste arquivo na Ãntegra. -Para gerar a conexão ssh com o servidor, deve visitar o site [https://gitlab.c3sl.ufpr.br/profile/keys](https://gitlab.c3sl.ufpr.br/profile/keys) e clicar em [Add SSH Key](https://gitlab.c3sl.ufpr.br/profile/keys/new). É necessário escrever um tÃtulo para a sua nova chave, no campo `key` colar o texto copiado do arquivo `id_rsa.pub` e adicionar sua nova chave. +A chave está no arquivo `id_rsa.pub`. O usuário deve copiar o texto +deste arquivo na Ãntegra. Para gerar a conexão ssh com o servidor, deve +visitar o site +[https://gitlab.c3sl.ufpr.br/profile/keys](https://gitlab.c3sl.ufpr.br/profile/keys) +e clicar em +[Add SSH Key](https://gitlab.c3sl.ufpr.br/profile/keys/new). É +necessário escrever um tÃtulo para a sua nova chave, no campo `key` +colar o texto copiado do arquivo `id_rsa.pub` e adicionar sua nova +chave. -Para checar a configuração da sua máquina com o sevidor basta realizar o +Para checar a configuração da sua máquina com o servidor basta realizar o seguinte comando: **Exemplo:** @@ -517,9 +530,10 @@ como no exemplo a seguir. **Exemplo:** ```{r, engine="bash", eval=FALSE} -# chave do primeiro usuário +## Chave do primeiro usuário. cat /tmp/id_rsa1.pub >> ~/.ssh/authorized_keys -# chave do segundo usuário + +## Chave do segundo usuário. cat /tmp/id_rsa2.pub >> ~/.ssh/authorized_keys ... ``` @@ -538,5 +552,6 @@ git -bare init Agora os usuários, cujas chaves foram salvas no arquivo `authorized_keys` podem compartilhar arquivos no repositório com os -comando `git init`, `git add`, `git commit`, `git remote add` e `git push origin master`. +comando `git init`, `git add`, `git commit`, `git remote add` e `git +push origin master`. diff --git a/cap04.md b/cap04.md deleted file mode 100644 index ffec6bbf3b1fff90a93a431044d25623b375eaba..0000000000000000000000000000000000000000 --- a/cap04.md +++ /dev/null @@ -1,335 +0,0 @@ -# 4. Projetos remotos -PET EstatÃstica -29/11/2015 - - - -## Introdução - -Para colaborar em projetos coletivos no Git é preciso ter um repositório remoto. Este repositório conterá todo o histórico das versões dos arquivos editados. A seguir serão abordados como adicionar, remover e gerenciar repositórios remotos. - -Primeiramente será apresentado o comando `git remote`, este é usado para verificar quais repositórios estão configurados. - -**Exemplo:** para retornar a lista de repositórios: - - -```bash -git remote -``` - -``` -## MeuRepo -## RenameRepo -## origin -``` - -No comando acima é possÃvel visualizar o remoto padrão **origin** (URL SSH para onde será possÃvel enviar os seus arquivos). - -**Exemplo:** para retornar o nome dos repositórios com a URL onde foram armazanados: - - -```bash -git remote -v -``` - -``` -## MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -## RenameRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## RenameRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -## origin git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## origin git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -``` - - -### Adicionando repositórios remotos - -O comando `git remote add` adiciona um repositório remoto. No exemplo a seguir será adicionado um repositório chamado **MeuRepo** ao qual será vinculado a URL `git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git`. Usaremos como exemplo o projeto Git **Apostila-git**. - -**Exemplo:** - -```bash -git remote add MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git -# Quando executamos novamente o comando para obter a lista de repositórios: -git remote -v -``` - -``` -## fatal: remote MeuRepo already exists. -## MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -## RenameRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## RenameRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -## origin git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (fetch) -## origin git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git (push) -``` - -Pare acessar localmente o branch master do projeto **Apostila-git** será usado `MeuRepo/master`. - -### Obtendo informações de um Remoto - -Você pode acessar as informações de qualquer repositório remoto com o comando `git remote show`, que retornará a URL e os `branches`. - -**Exemplo:** - -```bash -git remote show origin -``` - -``` -## * remote origin -## Fetch URL: git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git -## Push URL: git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git -## HEAD branch: devel -## Remote branches: -## Issue#49 tracked -## devel tracked -## issue#15 new (next fetch will store in remotes/origin) -## issue#23 tracked -## issue#36 tracked -## issue#48 tracked -## issue#50 tracked -## issue#51 tracked -## issue#53 new (next fetch will store in remotes/origin) -## issue#54 new (next fetch will store in remotes/origin) -## issue#56 new (next fetch will store in remotes/origin) -## issue#57 new (next fetch will store in remotes/origin) -## master tracked -## refs/remotes/origin/Issue#39 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#10 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#11 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#12 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#13 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#17 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#21 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#27 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#37 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#38 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#40 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#43 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#44 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#45 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#47 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#7 stale (use 'git remote prune' to remove) -## refs/remotes/origin/issue#9 stale (use 'git remote prune' to remove) -## Local branch configured for 'git pull': -## devel merges with remote devel -## Local ref configured for 'git push': -## devel pushes to devel (up to date) -``` - -### Renomeado Remotos - -O comando `git remote rename` pode modificar o nome de um repositório remoto. A seguir o repositório `MeuRepo`será renomeado para `RenameRepo`. - -**Exemplo:** - -```sh -git remote rename MeuRepo RenameRepo -``` - -### Removendo Remotos - -Para remover remotos é utilizado o comando `git remote rm`, agora será removido o repositório renomeado anteriormente `RenameRepo`. - -**Exemplo:** - -```sh - git remote rm RenameRepo -``` - -**Protocolos Git** - -Há quatro tipos diferentes de protocolos Git (Local, Git, HTTP e SSH). - -Nesta apostila será abordado apenas o Secure Shell (SSH). Por ser fácil de fazer a configuração do acesso deste protocolo aos servidores, este é o mais usual. - -## Criando um Repositório Git - -Primeiramente é necessário ter acesso a um servidor Linux com chave SSH, no qual você poderá ter seus repositórios. É definido um diretório no qual será armazenado o repositório remoto. -No próximo exemplo é preciso criar um repositório remoto chamado `MeuRepo` e o armazenar em um diretório `~/git`: - -**Exemplo:** - - ```sh - # Para criar um diretório git na sua home: - mkdir ~/git - # Para criar um repositório git: - mkdir MeuRepo.git - # Para definir MeuRepo como um repositório remoto: - git --bare init - ``` - -As configurações do servidor estão completas. A partir você pode realizar os primeiros comandos para iniciar o repositório criado. - - -## Git no servidor - -Primeiramente, para configurar o Git no Servidor e configurar os protocolos, clonaremos o repositório existente em um repositório limpo. -**Observação:** você poderá colocar um repositório no Servidor se este não contém um diretório de trabalho. - -**Exemplo:** - -```sh - git clone --bare MeuRepo MeuRepo.git -``` - -Acima foi criado um repositório limpo `MeuRepo.git`, no qual está armazenada a cópia de todos os arquivos do diretorio Git. - -Após este primeiro passo o repositório limpo será colocado no Servidor e configurado os protolocos. -No exemplo abaixo, supondo que você tem configurado um servidor `git.servidor.com`, e um diretório `/dir/git`no qual você quer armazenar seus repositórios. Ao copiar o seu repositório limpo, você pode configurar seu novo repositório. - -**Exemplo:** - - ```sh - scp -r MeuRepo.git usuario@git.example.com:/dir/git - ``` - -Agora o repositório pode ser clonado por outros usuários, que podem ter acesso de escrita e de envio de arquivos `push` no diretório. - - - ```sh - git clone usuario@git.example.com:/dir/git/MeuRepo.git - ``` - - -## Configuração de Conexão SSH com Servidor - -O Git possibilita ao usuário realizar uma chave SSH que fará uma conexão segura da sua máquina com o servidor. Para isso começamos com o seguinte comando no terminal: - -**Exemplo:** - - ```sh - ## Gerando uma chave ssh - ssh-keygen -t rsa -C "usuario@email.com" - ``` - -A partir deste comando, será possÃvel alterar o diretório onde será salva a chave SSH. O usuário tem a opção de permanecer com o diretório padrão, para isso basta apertar Enter. -A partir disso, são criados dois arquivos no diretório, o `id_rsa` e o `id_rsa.pub`. -Após escolher o diretório onde serão salvos os arquivos, você terá a opção de digitar uma senha ou deixar o espaço em branco. - -Para visualizar a chave basta digitar o seguinte comando: - -**Exemplo:** - - ```sh - cat ~/.ssh/id_rsa.pub - ``` - -A chave está no arquivo `id_rsa.pub`. O usuário deve copiar o texto deste arquivo na Ãntegra. -Para gerar a conexão ssh com o servidor, deve visitar o site [https://gitlab.c3sl.ufpr.br/profile/keys](https://gitlab.c3sl.ufpr.br/profile/keys) e clicar em [Add SSH Key](https://gitlab.c3sl.ufpr.br/profile/keys/new). É necessário escrever um tÃtulo para a sua nova chave, no campo `key` colar o texto copiado do arquivo `id_rsa.pub` e adicionar sua nova chave. - -Para checar a configuração da sua máquina com o sevidor basta realizar o seguinte comando: - -**Exemplo:** - - ```sh - ssh -T git@gitlab.c3sl.ufpr.br - ``` - - -**Configurando o servidor** - -Agora será abordado como configurar o acesso SSH do ponto de vista do servidor. -Você precisa criar um usuário Git e um diretório `.ssh` para este usuário. - -**Exemplo:** criar usuário e diretório. - - ```sh - sudo adduser git - su git - cd - mkdir .ssh - ``` - -Agora, você terá um arquivo chamado `authorized_keys` onde será adicionado uma chave pública de algum desenvolvedor. Após obter chaves de alguns usuários, você pode salvá-las no arquivo `authorized_keys`, como no exemplo a seguir. - -**Exemplo:** - -```sh -cat /tmp/id_rsa1.pub >> ~/.ssh/authorized_keys # chave do primeiro usuário -cat /tmp/id_rsa2.pub >> ~/.ssh/authorized_keys # chave do segundo usuário -... -``` - -Depois de armazenar as chaves dos usuários, basta criar um repositório limpo (sem um diretório de trabalho) para eles. Como visto anteriormente: - -**Exemplo:** - -```sh -cd/dir/git -mkdir NovoProjeto.git -cd NovoProjeto.git -git –bare init -``` - -Agora os usuários, cujas chaves foram salvas no arquivo `authorized_keys` podem compartilhar arquivos no repositório com os comando `git init`, `git add`, `git commit`, `git remote add` e `git push origin master`. - - -## Comandos clone, push, pull e fetch - -### Git clone - -Este comando é usado para clonar um repositório do servidor remoto para um servidor local, caso você queira copiar um repositório que já existe para realizar colaborações em um projeto que queira participar. -Você terá acesso a todos os arquivos e poderá verificar as diferentes versões destes. -No exemplo abaixo temos uma bibliotaca Git, chamada **TesteClone**, que será clonado da seguinte forma: - -**Exemplo:** - - ```sh - git clone git@gitlab.c3sl.ufpr.br:pet-estatistica/TesteClone.git - ``` - -Desta forma você terá um diretório `TesteClone` em seu computador, onde estarão todos os arquivos do projeto nele. - -O usuário também terá a opção de clonar o repositório `TesteClone` em um diretório diferente do padrão Git, que no próximo exemplo denominaremos de `DirTeste`: - -**Exemplo:** - - ```sh - git clone git@gitlab.c3sl.ufpr.br:pet-estatistica/TesteClone.git DirTeste - ``` - - -### Git Push - -Usado para transferência de arquivos entre repositório local e o servidor remoto. Como o nome já diz, o comando empurra os arquivos para o servidor remoto. -No exemplo abaixo enviaremos a ramificação `Branch Master` para o servidor chamado `origin`: - -**Exemplo:** - - ```sh - git push origin master - ``` - -É importante ressaltar que se dois usuários clonarem ao mesmo tempo, realizarem modificações e enviarem os arquivos atualizados ao repositório utilizando o `Git push`, as modificações do usuário que realizou o push por último serão desconsideradas. - -### Git Pull - -Também utilizado para transferência de arquivos. O comando puxa os arquivos do servidor remoto para o repositório local e faz o merge do mesmo, fundindo a última versão com a versão atualizada. - -**Exemplo:** - - ```sh - git pull origin master - ``` - -### Git fetch - -Assim como o comando `Git pull`, o `Git fetch` transfere arquivos do repositório remoto para o local, porém ele não realiza automaticamente o merge dos arquivos transferidos, o usuário deve fazer o merge manualmente. - -**Exemplo:** - - ```sh - git fetch origin master - ``` - -Para verificar as modificações realizadas entre versões de um arquivo basta utilizar o comando `git diff`: - -**Exemplo:** - -```sh -git diff master origin/master -``` - - diff --git a/cap04.pdf b/cap04.pdf deleted file mode 100644 index 6984cb4113aa0d7ccb8e7f130859d2fc45eb1985..0000000000000000000000000000000000000000 Binary files a/cap04.pdf and /dev/null differ diff --git a/cap04.tex b/cap04.tex deleted file mode 100644 index 3882bff3e020e874a60d9384226591e7a2c4d3a8..0000000000000000000000000000000000000000 --- a/cap04.tex +++ /dev/null @@ -1,805 +0,0 @@ -% \documentclass[ -% ]{article} - -\documentclass[ - a5paper, - pagesize, - 9pt, - % bibtotoc, - pointlessnumbers, - normalheadings, - % DIV=9, - twoside=false -]{book} - -\usepackage[brazil]{babel} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} - -\usepackage[sc]{mathpazo} -% \usepackage{palatino} -% \linespread{1.05} -\usepackage[scaled=0.85]{beramono} - -%----------------------------------------------------------------------- - -\usepackage{amssymb, amsmath} -\usepackage{ifxetex, ifluatex} - -\usepackage{fixltx2e} % provides \textsubscript -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \usepackage[T1]{fontenc} - \usepackage[utf8]{inputenc} -\else % if luatex or xelatex - \ifxetex - \usepackage{mathspec} - \usepackage{xltxtra,xunicode} - \else - \usepackage{fontspec} - \fi - \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} - \newcommand{\euro}{€} -\fi - -% use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -% use microtype if available -\IfFileExists{microtype.sty}{% -\usepackage{microtype} -\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} - - - - - - -\usepackage{color} -\usepackage{fancyvrb} -\newcommand{\VerbBar}{|} -\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} -\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} -% Add ',fontsize=\small' for more characters per line -\usepackage{framed} -\definecolor{shadecolor}{RGB}{248,248,248} -\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}} -\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{{#1}}}} -\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{{#1}}} -\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{{#1}}} -\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{{#1}}} -\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{{#1}}} -\newcommand{\CharTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{{#1}}} -\newcommand{\StringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{{#1}}} -\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{{#1}}}} -\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{{#1}}} -\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.94,0.16,0.16}{{#1}}} -\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{{#1}}} -\newcommand{\RegionMarkerTok}[1]{{#1}} -\newcommand{\ErrorTok}[1]{\textbf{{#1}}} -\newcommand{\NormalTok}[1]{{#1}} - - - -\usepackage{graphicx} -\makeatletter -\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} -\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} -\makeatother -% Scale images if necessary, so that they will not overflow the page -% margins by default, and it is still possible to overwrite the defaults -% using explicit options in \includegraphics[width, height, ...]{} -\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} - -\ifxetex - \usepackage[setpagesize=false, % page size defined by xetex - unicode=false, % unicode breaks when used with xetex - xetex]{hyperref} -\else - \usepackage[unicode=true]{hyperref} -\fi - -\hypersetup{breaklinks=true, - bookmarks=true, - pdfauthor={PET EstatÃstica UFPR}, - pdftitle={Projetos Remotos}, - colorlinks=true, - citecolor=blue, - urlcolor=blue, - linkcolor=magenta, - pdfborder={0 0 0}} -\urlstyle{same} % don't use monospace font for urls - - - -\setlength{\parindent}{0pt} -\setlength{\parskip}{6pt plus 2pt minus 1pt} -\setlength{\emergencystretch}{3em} % prevent overfull lines - -\setcounter{secnumdepth}{5} - - -%%% Use protect on footnotes to avoid problems with footnotes in titles -\let\rmarkdownfootnote\footnote% -\def\footnote{\protect\rmarkdownfootnote} - -%%% Change title format to be more compact -\usepackage{titling} - -% Create subtitle command for use in maketitle -\newcommand{\subtitle}[1]{ - \posttitle{ - \begin{center}\large#1\end{center} - } -} - -\setlength{\droptitle}{-2em} - - \title{Projetos Remotos} - \pretitle{\vspace{\droptitle}\centering\huge} - \posttitle{\par} - - \author{PET EstatÃstica UFPR} - \preauthor{\centering\large\emph} - \postauthor{\par} - - \date{} - \predate{}\postdate{} - -\usepackage{menukeys} - -\begin{document} - -\maketitle - - -{ -\hypersetup{linkcolor=black} -\setcounter{tocdepth}{2} -\tableofcontents -} - - - -\chapter{Projetos Remotos} - -Nos capÃtulos anteriores descrevemos como instalar o Git e ter projetos -versionados. No entanto, o uso do Git até então foi apenas local. Os -arquivos eram mantidos na sua máquina de trabalho e disponÃveis só para -você. - -Os recursos do Git, como o desenvolvimento em \emph{branches}, permite -que vários segmentos sejam conduzidos de forma independente e no futuro, -quando apropriado, reunidos em um único \emph{branch}. Isso é exatamente -o que precisamos para trabalhar em equipe, certo? Se cada colaborador -pudesse ter um ramo separado do projeto para trabalhar, todos poderiam -trabalhar simultâneamente. Quando oportuno, bastaria fazer merges para -reunir o trabalho. A questão é: como deixar o projeto disponÃvel para os -colaboradores? - -A resposta é simples: mantenha o projeto em um servidor onde os -colaboradores tenham acesso. Isso inclusive vai permitir que você acesse -o projeto de várias outras máquinas, como o \emph{notebook} de casa e o -desktop do \emph{escritório}. - -\section{Repositório remoto pessoal}\label{repositorio-remoto-pessoal} - -O repositório remoto serve de centro do seu repositório Git. Como ele -está em um servidor que você tem acesso, você pode compartilhar o -repositório com outras máquinas, clonado de lá. Ele serve como -\emph{backup} do repositório. - -Aqui não se trabalha em colaboração mas o processo permite acessar o -repositório, transferir arquivos de várias máquinas suas. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Autenticar no servidor (logar).} -\KeywordTok{ssh} \NormalTok{eu@servidor} - -\CommentTok{## Verificar se a máquina tem o Git, se não instalar.} -\KeywordTok{git} \NormalTok{--version} - -\CommentTok{## Criar um diretório para conter o projeto.} -\KeywordTok{mkdir} \NormalTok{-p ~/meusProjetos/meu1repo} -\KeywordTok{cd} \NormalTok{~/meusProjetos/meu1repo} - -\CommentTok{## Começar um projeto Git remoto. Note a opção --bare.} -\KeywordTok{git} \NormalTok{--bare init} -\end{Highlighting} -\end{Shaded} - -Apenas isso precisa ser feito no servidor. Você não cria nenhum arquivo -pelo servidor. Inclusive, muitos dos comandos Git, como -\texttt{git status} não funcionam para repositório iniciados com a opção -\texttt{git -\/-bare init}. - -Caso queira, você também pode usar \texttt{git init}. A diferença entre -eles é só onde ficam os arquivos do versionamento. Com -\texttt{git init}, um diretório oculto \texttt{.git/} é o repositório -Git e os arquivos de trabalho, como o \texttt{README.md}, ficam ao lado -dele na estrutura de diretório. Com \texttt{git -\/-bare init} o -conteúdo do repositório Git fica na raÃz. Essa última opção é justamente -para criar repositórios remotos que vão justamente manter a parte -repositório e não os arquivos. - -\begin{verbatim} -git init git --bare init -. . -|-- .git |-- branches -| |-- branches |-- config -| |-- config |-- description -| |-- description |-- HEAD -| |-- HEAD |-- hooks -| |-- hooks |-- info -| |-- info |-- objects -| |-- objects +-- refs -| +-- refs -+-- README.md -\end{verbatim} - -Uma vez iniciado o repositório no servidor, todo trabalho passa ser -local. É a vez de adicionar o endereço do diretório no servidor e -transferir arquivos. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Agora na sua máquina local, adicione o endereço do remoto.} -\KeywordTok{git} \NormalTok{remote add eu@server:~/meusProjetos/meu1repo} - -\CommentTok{## Exibir os endereços remotos.} -\KeywordTok{git} \NormalTok{remote -v} -\end{Highlighting} -\end{Shaded} - -Esse endereço pode ter IP, porque na realidade, todo servidor tem um IP. -Por exemplo, o servidor do tem o IP 192.30.252.129. Para saber o IP é só -dar um \emph{ping} no endereço. - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{ping} \NormalTok{github.com} -\KeywordTok{ping} \NormalTok{gitlab.com} -\KeywordTok{ping} \NormalTok{google.com} -\KeywordTok{ping} \NormalTok{cran.r-project.org} -\end{Highlighting} -\end{Shaded} - -Normalmente, servidores de escritório não tem um endereço nominal, -apenas o IP (numérico). É necessário registrar domÃnio para ter nominal. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Agora na sua máquina local, adicione o endereço do remoto.} -\KeywordTok{git} \NormalTok{remote add eu@111.22.333.44:~/meusProjetos/meu1repo} -\end{Highlighting} -\end{Shaded} - -Nesse processo, toda transferência de arquivos vai pedir senha do seu -usuário no servidor. Para facilitar, pode-se trabalhar com chaves -públicas. - -O arquivo \texttt{id\_rsa.pub} é a sua chave pública. O \texttt{id\_rsa} -é o seu par. RSA é o tipo de encriptação. O nome e caminho do arquivo e -a encriptação podem ser outros, depende do que você escolher ao gerar o -par de chaves. Normalmente usa-se RSA e as chaves são criadas no -diretório \texttt{\textasciitilde{}/.ssh}. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Exibir chaves públicas.} -\KeywordTok{cat} \NormalTok{~/.ssh/id_rsa.pub} - -\CommentTok{## Caso não tenha, gerar.} -\KeywordTok{ssh-keygen} \NormalTok{-t rsa -C }\StringTok{"eu@dominio.com"} -\end{Highlighting} -\end{Shaded} - -No servidor, o arquivo \texttt{authorized\_keys2} contém as chaves -públicas das máquinas com acesso permitido sem senha. Esse arquivo nada -mais é que uma coleção de chaves. O conteúdo dele são as chaves das suas -máquinas, ou das máquinas de outros usuários, conteúdo do -\texttt{id\_rsa.pub}, uma embaixo da outra, conforme o exemplo -abaixo\footnote{O Flash foi o -primeiro a transferir as chaves para o servidor porque ele é mais -rápido}. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## `authorized_keys` do servidor da Liga da Justiça.} -\KeywordTok{ssh-rsa} \NormalTok{IyBUrjvUdSMY... flash@justiceleague.org} -\KeywordTok{ssh-rsa} \NormalTok{AAAAB3NzaC1y... batman@justiceleague.org} -\KeywordTok{ssh-rsa} \NormalTok{Mdju17IdXhSd... superman@justiceleague.org} -\end{Highlighting} -\end{Shaded} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Logar no servidor} -\KeywordTok{ssh} \NormalTok{eu@111.22.333.44} - -\CommentTok{## Criar o diretório/arquivo para as chaves públicas.} -\KeywordTok{mkdir} \NormalTok{~/.ssh} - \KeywordTok{>} \KeywordTok{authorized_keys2} -\end{Highlighting} -\end{Shaded} - -Agora é preciso transferir o conteúdo do seu arquivo local -\texttt{id\_rsa.pub} para o \texttt{authorized\_keys2} que fica no -servidor. O jeito mais simples de fazer isso é com transferência -\emph{scp} mas a instrução \emph{ssh} abaixo também resolve. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Transfere arquivo para diretório temporário.} -\KeywordTok{scp} \NormalTok{~/.ssh/id_rsa.pub eu@111.22.333.44:/tmp} - -\CommentTok{## Cola o conteúdo do *.pub no final do authorized_keys.} -\KeywordTok{ssh} \NormalTok{eu@111.22.333.44\textbackslash{}} - \StringTok{"cat /tmp/id_rsa.pub ~/.ssh/authorized_keys"} - -\CommentTok{## Faz os dois passos anteriores de uma vez só.} -\KeywordTok{ssh} \NormalTok{eu@111.22.333.44\textbackslash{}} - \StringTok{"cat >> ~/.ssh/authorized_keys2"} \KeywordTok{<} \NormalTok{~/.ssh/id_rsa.pub} -\end{Highlighting} -\end{Shaded} - -\section{Repositório remoto coletivo}\label{repositorio-remoto-coletivo} - -A única diferença é recomendamos a você criar um novo usuário e -adicionar as chaves públicas de todos os membros. Evite adicionar chaves -públicas para usuários na sua conta porque isso expõe seus documentos, -alguma operação desastrosa por parte de alguém pode comprometê-los. Por -isso, crie um usuário, por exemplo \texttt{gitusers}, para nesta conta -manter o repositório remoto. - -Solicite que os colaboradores gerem as chaves públicas e te enviem o -arquivo \texttt{id\_rsa.pub}. Depois você adiciona cada chave ao -\texttt{authorized\_keys} de conta \texttt{gitusers}. Com chaves -autorizadas, os colaboradores podem transferir arquivos, podem logar no -servidor mas não podem instalar nada, a menos que você passe a senha do -usuário \texttt{gitusers}. Para crias usuários no servidor, você precisa -de privilégios de \emph{admin}. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Logar na servidora.} -\KeywordTok{ssh} \NormalTok{eu@servidor} - -\CommentTok{## No servidor, criar uma conta para o projeto.} -\KeywordTok{sudo} \NormalTok{adduser gitusers} -\end{Highlighting} -\end{Shaded} - -Vamos assumir que você têm os arquivos \texttt{*.pub} dos colaboradores -no diretório \texttt{/chaves} devidamente identificados pelo nome deles. -O comando abaixo acrescenta as chaves deles uma embaixo da outra no -\texttt{authorized\_keys}. - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Entra no diretório com os arquivos *.pub.} -\CommentTok{## Existem várias: angela.pub, jhenifer.pub, ...} -\KeywordTok{cd} \NormalTok{chaves} - -\CommentTok{## Juntar as chaves em um único arquivo.} -\KeywordTok{cat} \NormalTok{*.pub }\KeywordTok{>} \NormalTok{todos.pub} - -\CommentTok{## Copiar o conteúdo do arquivo pro authorized_keys2.} -\KeywordTok{ssh} \NormalTok{gitusers@111.22.333.44\textbackslash{}} - \StringTok{"cat >> ~/.ssh/authorized_keys2"} \KeywordTok{<} \NormalTok{todos.pub} -\end{Highlighting} -\end{Shaded} - -\section{Fluxo de trabalho com repositório remoto, do clone ao -push}\label{fluxo-de-trabalho-com-repositorio-remoto-do-clone-ao-push} - -\subsection{Git clone}\label{git-clone} - -Este comando é usado para clonar um repositório do servidor remoto para -um servidor local, caso você queira copiar um repositório que já existe -para realizar colaborações em um projeto que queira participar. Você -terá acesso a todos os arquivos e poderá verificar as diferentes versões -destes. Supondo que sua equipe de trabalho possui uma biblioteca Git -\textbf{Teste Clone}, onde são armazenados todos os arquivos. Você pode -clonar estes arquivos para o seu diretório de trabalho e assim -modificá-los conforme deseja. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{clone git@gitlab.c3sl.ufpr.br:pet-estatistica/TesteClone.git} -\end{Highlighting} -\end{Shaded} - -Desta forma você terá um diretório \texttt{TesteClone} em seu -computador, onde estarão todos os arquivos do projeto nele. - -Você também terá a opção de clonar o repositório \texttt{TesteClone} em -um diretório diferente do padrão Git, que no próximo exemplo -denominaremos de \texttt{DirTeste}: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{clone git@gitlab.c3sl.ufpr.br:pet-estatistica/TesteClone.git DirTeste} -\end{Highlighting} -\end{Shaded} - -\subsection{Git Push}\label{git-push} - -Após clonar e realizar contribuições ao projeto, você pode enviá-los -para o repositório remoto. Estes arquivos, após o \texttt{Git push}, -estarão prontos para serem integrados ao projeto com o -\texttt{merge}.\\Usado para transferência de arquivos entre repositório -local e o servidor remoto. Como o nome já diz, o comando empurra os -arquivos para o servidor remoto. No exemplo abaixo enviaremos a -ramificação \texttt{Branch Master} para o servidor chamado -\texttt{origin}: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{push origin master} -\end{Highlighting} -\end{Shaded} - -É importante ressaltar que se dois usuários clonarem ao mesmo tempo, -realizarem modificações e enviarem os arquivos atualizados ao -repositório utilizando o \texttt{Git push}, as modificações do usuário -que realizou o push por último serão desconsideradas. - -\subsection{Git Pull}\label{git-pull} - -Para obter todos os arquivos presentes no projeto, você pode importar os -arquivos do branch \texttt{master}. Toda vez que você utilizar o -\texttt{Git pull} a última versão de todos os arquivos estarão no seu -diretório. Também usado para transferência de arquivos, o comando puxa -os arquivos do servidor remoto para o repositório local e faz o merge do -mesmo, fundindo a última versão com a versão atualizada. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{pull origin master} -\end{Highlighting} -\end{Shaded} - -\subsection{Git fetch}\label{git-fetch} - -Assim como o comando \texttt{Git pull}, o \texttt{Git fetch} transfere -arquivos do repositório remoto para o local, porém ele não realiza -automaticamente o merge dos arquivos transferidos, o usuário deve fazer -o merge manualmente. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{fetch origin master} -\end{Highlighting} -\end{Shaded} - -Para verificar as modificações realizadas entre versões de um arquivo -basta utilizar o comando \texttt{git diff}: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{diff master origin/master} -\end{Highlighting} -\end{Shaded} - -\section{Listar branches -locais/remotos}\label{listar-branches-locaisremotos} - -O comando \texttt{git remote} é usado para verificar quais repositórios -estão configurados. - -\textbf{Exemplo:} para retornar a lista de repositórios: - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{remote} -\end{Highlighting} -\end{Shaded} - -No comando acima é possÃvel visualizar o remoto padrão \textbf{origin} -(URL SSH para onde será possÃvel enviar os seus arquivos). - -\textbf{Exemplo:} para retornar o nome dos repositórios com a URL onde -foram armazanados: - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{remote -v} -\end{Highlighting} -\end{Shaded} - -\section{Adicionar, renomear, deletar -remote}\label{adicionar-renomear-deletar-remote} - -\subsection{Adicionando repositórios -remotos}\label{adicionando-repositorios-remotos} - -O comando \texttt{git remote add} adiciona um repositório remoto. No -exemplo a seguir será adicionado um repositório chamado \textbf{MeuRepo} -ao qual será vinculado a URL -\texttt{git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git}. -Usaremos como exemplo o projeto \textbf{Apostila-git}. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{remote add MeuRepo git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git} -\CommentTok{# Quando executamos novamente o comando para obter a lista de repositórios:} -\KeywordTok{git} \NormalTok{remote -v} -\end{Highlighting} -\end{Shaded} - -Pare acessar localmente o branch master do projeto \textbf{Apostila-git} -será usado \texttt{MeuRepo/master}. - -\subsection{Obtendo informações de um -Remoto}\label{obtendo-informacoes-de-um-remoto} - -Você pode acessar as informações de qualquer repositório remoto com o -comando \texttt{git remote show}, que retornará a URL e os -\texttt{branches}. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{remote show origin} -\end{Highlighting} -\end{Shaded} - -\subsection{Renomeado Remotos}\label{renomeado-remotos} - -O comando \texttt{git remote rename} pode modificar o nome de um -repositório remoto. A seguir o repositório \texttt{MeuRepo}será -renomeado para \texttt{RenameRepo}. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{remote rename MeuRepo RenameRepo} -\end{Highlighting} -\end{Shaded} - -\subsection{Removendo Remotos}\label{removendo-remotos} - -Para remover remotos é utilizado o comando \texttt{git remote rm}, agora -será removido o repositório renomeado anteriormente \texttt{RenameRepo}. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] - \KeywordTok{git} \NormalTok{remote rm RenameRepo} -\end{Highlighting} -\end{Shaded} - -\subsection{Deletar ramos no servidor}\label{deletar-ramos-no-servidor} - -Quando houver um branch que não está sendo utilizado ou está concluÃdo, -há a opção de excluÃ-lo do servidor.\\Se for necessário apagar branches -remotos, podemos utilizar o comando a seguir: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{push origin --delete }\KeywordTok{<}\NormalTok{branch}\KeywordTok{>} -\end{Highlighting} -\end{Shaded} - -\subsection{Clonar apenas um \emph{branch}, \emph{commit} ou -\emph{tag}.}\label{clonar-apenas-um-branch-commit-ou-tag.} - -É possÃvel clonar apenas um branch e não o repositório Git completo. -Supondo que no repositório há um branch chamado \texttt{MeuBranch} -dentro do repositório \texttt{MeuRepo}, clonaremos o branch. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{clone -b MeuBranch --single-branch git://sub.domain.com/MeuRepo.git} -\end{Highlighting} -\end{Shaded} - -O Git ainda permite clonar um commit ou tag. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{# Para uma tag:} -\KeywordTok{git} \NormalTok{-e: //git.myproject.org/MyProject.git@v1.0#egg=MyProject} -\CommentTok{# Para um commit:} -\KeywordTok{git} \NormalTok{-e: //git.myproject.org/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject} -\end{Highlighting} -\end{Shaded} - -\section{Criando um Repositório Git}\label{criando-um-repositorio-git} - -Primeiramente é necessário ter acesso a um servidor Linux com chave SSH, -no qual você poderá ter seus repositórios. É definido um diretório no -qual será armazenado o repositório remoto. No próximo exemplo é preciso -criar um repositório remoto chamado \texttt{MeuRepo} e o armazenar em um -diretório \texttt{\textasciitilde{}/git}: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{# Para criar um diretório git na sua home:} -\KeywordTok{mkdir} \NormalTok{~/git} -\CommentTok{# Para criar um repositório git:} -\KeywordTok{mkdir} \NormalTok{MeuRepo.git} -\CommentTok{# Para definir MeuRepo como um repositório remoto:} -\KeywordTok{git} \NormalTok{--bare init} -\end{Highlighting} -\end{Shaded} - -As configurações do servidor estão completas. A partir de agora você -pode realizar os primeiros comandos para iniciar o repositório criado. - -\section{Git no servidor}\label{git-no-servidor} - -Primeiramente, para configurar o Git no Servidor e configurar os -protocolos, clonaremos o repositório existente em um repositório limpo. -\textbf{Observação:} você poderá colocar um repositório no Servidor se -este não contém um diretório de trabalho. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] - \KeywordTok{git} \NormalTok{clone --bare MeuRepo MeuRepo.git} -\end{Highlighting} -\end{Shaded} - -Acima foi criado um repositório limpo \texttt{MeuRepo.git}, no qual está -armazenada a cópia de todos os arquivos do diretorio Git. - -Após este primeiro passo o repositório limpo será colocado no Servidor e -configurado os protolocos. No exemplo abaixo, supondo que você tem -configurado um servidor \texttt{git.servidor.com}, e um diretório -\texttt{/dir/git}no qual você quer armazenar seus repositórios. Ao -copiar o seu repositório limpo, você pode configurar seu novo -repositório. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{scp} \NormalTok{-r MeuRepo.git usuario@git.example.com:/dir/git} -\end{Highlighting} -\end{Shaded} - -Agora o repositório pode ser clonado por outros usuários, que podem ter -acesso de escrita e de envio de arquivos \texttt{push} no diretório. - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{git} \NormalTok{clone usuario@git.example.com:/dir/git/MeuRepo.git} -\end{Highlighting} -\end{Shaded} - -\section{Configuração de Conexão SSH com -Servidor}\label{configuracao-de-conexao-ssh-com-servidor} - -O Git possibilita ao usuário realizar uma chave SSH que fará uma conexão -segura da sua máquina com o servidor. Para isso começamos com o seguinte -comando no terminal: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{## Gerando uma chave ssh} -\KeywordTok{ssh-keygen} \NormalTok{-t rsa -C }\StringTok{"usuario@email.com"} -\end{Highlighting} -\end{Shaded} - -A partir deste comando, será possÃvel alterar o diretório onde será -salva a chave SSH. O usuário tem a opção de permanecer com o diretório -padrão, para isso basta apertar Enter. A partir disso, são criados dois -arquivos no diretório, o \texttt{id\_rsa} e o \texttt{id\_rsa.pub}. Após -escolher o diretório onde serão salvos os arquivos, você terá a opção de -digitar uma senha ou deixar o espaço em branco. - -Para visualizar a chave basta digitar o seguinte comando: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{cat} \NormalTok{~/.ssh/id_rsa.pub} -\end{Highlighting} -\end{Shaded} - -A chave está no arquivo \texttt{id\_rsa.pub}. O usuário deve copiar o -texto deste arquivo na Ãntegra. Para gerar a conexão ssh com o servidor, -deve visitar o site -\href{https://gitlab.c3sl.ufpr.br/profile/keys}{\url{https://gitlab.c3sl.ufpr.br/profile/keys}} -e clicar em \href{https://gitlab.c3sl.ufpr.br/profile/keys/new}{Add SSH -Key}. É necessário escrever um tÃtulo para a sua nova chave, no campo -\texttt{key} colar o texto copiado do arquivo \texttt{id\_rsa.pub} e -adicionar sua nova chave. - -Para checar a configuração da sua máquina com o sevidor basta realizar o -seguinte comando: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{ssh} \NormalTok{-T git@gitlab.c3sl.ufpr.br} -\end{Highlighting} -\end{Shaded} - -\textbf{Configurando o servidor} - -Agora será abordado como configurar o acesso SSH do ponto de vista do -servidor. Você precisa criar um usuário Git e um diretório \texttt{.ssh} -para este usuário. - -\textbf{Exemplo:} criar usuário e diretório. - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{sudo} \NormalTok{adduser git} -\KeywordTok{su} \NormalTok{git} -\KeywordTok{cd} -\KeywordTok{mkdir} \NormalTok{.ssh} -\end{Highlighting} -\end{Shaded} - -Agora, você terá um arquivo chamado \texttt{authorized\_keys} onde será -adicionado uma chave pública de algum desenvolvedor. Após obter chaves -de alguns usuários, você pode salvá-las no arquivo -\texttt{authorized\_keys}, como no exemplo a seguir. - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{# chave do primeiro usuário} -\KeywordTok{cat} \NormalTok{/tmp/id_rsa1.pub }\KeywordTok{>>} \NormalTok{~/.ssh/authorized_keys} -\CommentTok{# chave do segundo usuário} -\KeywordTok{cat} \NormalTok{/tmp/id_rsa2.pub }\KeywordTok{>>} \NormalTok{~/.ssh/authorized_keys} -\KeywordTok{...} -\end{Highlighting} -\end{Shaded} - -Depois de armazenar as chaves dos usuários, basta criar um repositório -limpo (sem um diretório de trabalho) para eles. Como visto -anteriormente: - -\textbf{Exemplo:} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{cd/dir/git} -\KeywordTok{mkdir} \NormalTok{NovoProjeto.git} -\KeywordTok{cd} \NormalTok{NovoProjeto.git} -\KeywordTok{git} \NormalTok{-bare init} -\end{Highlighting} -\end{Shaded} - -Agora os usuários, cujas chaves foram salvas no arquivo -\texttt{authorized\_keys} podem compartilhar arquivos no repositório com -os comando \texttt{git init}, \texttt{git add}, \texttt{git commit}, -\texttt{git remote add} e \texttt{git push origin master}. %%--------------------------------------------------------------- - -\end{document} diff --git a/cap05.Rmd b/cap05.Rmd index e0428f114ce298bc0d8d51dcb51277a80124e687..858389951631cfdf6ad91a8462e6851ef056c93f 100644 --- a/cap05.Rmd +++ b/cap05.Rmd @@ -7,7 +7,7 @@ header-includes: \usepackage{menukeys} output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -20,20 +20,18 @@ library(knitr) opts_chunk$set(comment=NA) ``` -\chapter{Serviços Web para Projetos Git} - # Serviços Web para Git # No capÃtulo anterior vimos como configurar um repositório remoto em um servidor. Esse procedimento possibilita trabalho em equipe pois centraliza o repositório remoto em um servidor que todos têm acesso. Assim, todos podem clonar, criar branches, subir as -contruibuições, etc. Apesar do servidor centralizar o trabalho de todos +contribuições, etc. Apesar do servidor centralizar o trabalho de todos os usuários, estes terão que se comunicar e fazer a gestão de tarefas -sobre o projeto de outra forma, como por email direto, lista de +sobre o projeto de outra forma, como por e-mail direto, lista de emails/discussão ou chats coletivos. Para que um desenvolvedor veja o que os outros fizeram, ele terá que periodicamente dar `fetch`, ver os -braches do repositório, navegar no histórico de commits, ver *diffs* +branches do repositório, navegar no histórico de commits, ver *diffs* entre arquivos. Se por um lado existe recurso para um fluxo de desenvolvimento orientado dessa forma, também existem recursos para tornar o trabalho coletivo mais simples e centralizado. Eles são os @@ -41,7 +39,7 @@ serviços web para projetos Git. O Git tem vários serviços web voltados para ter um local que centralize o projeto bem como ofereça recursos administrativos e colaborativos. -Esses serviços possuem contas *free*, algums planos pagos e diversos +Esses serviços possuem contas *free*, alguns planos pagos e diversos recursos para todo tipo de projeto e equipe. Os objetivos desse capÃtulo são: apresentar os serviços web para @@ -85,12 +83,12 @@ mesmo sendo desconhecidas. Dentre os principais recursos disponÃveis, têm-se: * README: é um arquivo que funciona como capa do seu repositório. O - seu conteúdo é texto escrito em liguagem de marcação (Markdown, RST, + seu conteúdo é texto escrito em linguagem de marcação (Markdown, RST, Textile, Org, etc) renderizada para exibição pelo GitHub. Como capa, o conteúdo do README está na *home* do projeto e serve para informar o visitante dos objetivos do repositório, seus desenvolvedores, instruções de instalação/uso e formas de colaboração. - * Wiki: a Wiki de cada repositório são um conjunto de páginas que + * Wiki: a Wiki de cada repositório é um conjunto de páginas que serve para divulgação e documentação do repositório. Estas também são escritas em linguagem de marcação, tornando fácil e rápida a escrita pelo desenvolvedor e simples para o visitante ler e @@ -102,11 +100,11 @@ têm-se: gerenciamento de tarefas. Os usuários criam *issues* para notificar um *bug* encontrado de forma que ele possa ser rapidamente corrigido. Criar *issues* também serve como ferramenta de - admistração de tarefas nas quais eles descrevem algo a ser + administração de tarefas nas quais eles descrevem algo a ser feito por alguém. * *Milestones*: são pedras de milha, ou seja, marcam um ponto a ser alcançado. São usadas para descrever o que precisa ser desenvolvido - para que ocorra uma mundança de versão e estabalecer um prazo para + para que ocorra uma mudança de versão e estabelecer um prazo para conclusão, por exemplo. As *milestones* agrupam *issues* que indicam as etapas a serem percorridas. * *Pull request* ou *merge request* (MR): é uma requisição de @@ -115,7 +113,7 @@ têm-se: responsável por avaliar o MR pode ver os *diffs* nos arquivos e fazer o merge direto pela interface, de dentro do serviço sem precisar baixar (*fetch*) o ramo, aplicar o merge (*merge*) e - subÃ-lo (*push*). Então os desenvolvedores não precisam interromper + subi-lo (*push*). Então os desenvolvedores não precisam interromper o trabalho local para fazer um merge já que ele pode ser feito no serviço sem modificações no *workspace*. * *Fork*: é uma forma de se fazer uma cópia do projeto de alguém para @@ -132,7 +130,7 @@ Finley\footnote{\url{http://techcrunch.com/2012/07/14/what-exactly-is-github-any mantenedor recebe um MR ele pode ver o perfil do contribuidor onde estão listados todos os projetos no qual este contribuiu. Ao aceitar o MR, é acrescentado mais uma colaboração a reputação do colaborador. Esse -mecanÃsmo, então, beneficia as duas partes. +mecanismo, então, beneficia as duas partes. Além dessas caracterÃsticas chave, o GitHub permite que você acompanhe (*watch*) e favorite (*star*) repositórios. Também dá para seguir @@ -155,7 +153,7 @@ coleções de funções que podem ser carregadas com um `source()`. Com o plano *free* do GitHub, você pode ter inúmeros repositórios públicos, inúmeros colaboradores, ter o *fork* de quantos repositórios quiser e participar de quantas organizações precisar. Para ter -repositórios privados, o plano mais básico custa U$ 7 e dá direito à 5 +repositórios privados, o plano mais básico custa U$ 7 por mês e dá direito à 5 repositórios. Existem outros planos individuais, e também planos organizacionais, para todos os tamanhos de projeto e equipe. Além dessas opções, pode-se ter o GitHub em um servidor próprio, o GitHub @@ -181,7 +179,7 @@ básico. O GitLab e o Bitbucket estão entre os 5 mais populares e permitem, por exemplo, ter alguns repositórios privados com a conta *free*. -Como hopedamos nossos projetos coletivos do PET-EstatÃstica no GitLab do +Como hospedamos nossos projetos coletivos do PET-EstatÃstica no GitLab do C3SL\footnote{\url{https://gitlab.c3sl.ufpr.br/explore}}, não podemos deixar de falar sobre ele. @@ -189,9 +187,9 @@ deixar de falar sobre ele. O GitLab\footnote{\url{https://about.gitlab.com/}}, assim como o GitHub, é um serviço web para repositórios Git. O GitLab é um projeto *open -source* desenvolvido em Ruby que teve inÃcio em 2011 pelo ucrâniano +source* desenvolvido em Ruby que teve inÃcio em 2011 pelo ucraniano Dmitriy Zaporozhets. Em 2013, a Companhia GitLab tinha uma equipe de 11 -funcionios e mais de 10 mil organizações usando o serviço. +funcionários e mais de 10 mil organizações usando o serviço. <!-- \begin{wrapfigure}{r}{0.4\textwidth} --> \begin{figure}[h] @@ -202,8 +200,8 @@ funcionios e mais de 10 mil organizações usando o serviço. \end{figure} <!-- \end{wrapfigure} --> -O GitLab, além de ser um serviço gratuito (com planos extras) -colaboração, é também um programa que você pode instalar em servidor +O GitLab, além de ser um serviço gratuito (com planos extras), é também +um programa que você pode instalar em servidor local para ter seus repositórios na intraweb. Esse é o caso do GitLab do C3SL e do GitLab do LEG\footnote{\url{http://git.leg.ufpr.br/explore}}. @@ -230,7 +228,7 @@ Geoinformação). Estes GitLabs dão suporte à colaboração em código dentro dos departamentos de Informática e EstatÃstica para alunos e professores (C3SL) e para a equipe e colaboradores do LEG. -Em termos finaceiros, custa menos um servidor na nuvem da Digital +Em termos financeiros, custa menos um servidor na nuvem da Digital Ocean\footnote{\url{https://www.digitalocean.com/community/tutorials/how-to-use-the-gitlab-one-click-install-image-to-manage-git-repositories}} com o GitLab CE (U$ 5/mês) do que ter uma conta para repositórios privados no GitHub (U$ 7/mês) por 5 repositórios privados). No entanto, @@ -242,35 +240,35 @@ Além das caracterÃsticas essenciais e comuns aos demais serviços, como 5 nÃveis de acesso aos repositórios (*owner*, *master*, *developer*, *report* e *guess*), 2) revisão comentada de código nos *diffs*, 3) importação repositórios de outros serviços, 4) adição de *web hooks* -e 5) integração contÃnua nativa apartir da versão 8.0. +e 5) integração contÃnua nativa a partir da versão 8.0. # Criar um perfil # -Criar uma conta no Github é tão simples como uma conta de email ou numa +Criar uma conta no Github é tão simples como uma conta de e-mail ou numa rede social. Acesse o endereço <https://github.com/join> para preencher seus dados pessoais e escolher um plano. Nenhum dos planos tem limitação quanto ao número de repositórios ou colaboradores. O que muda é a -quantidade de reposiórios privados. No plano *free*, só são criados +quantidade de repositórios privados. No plano *free*, só são criados repositórios públicos enquanto que nos planos pagos, o menor deles -permite 5 repositórios privados por um custo de U$ 5 por mês. Acesse +permite 5 repositórios privados por um custo de U$ 7 por mês. Acesse <https://github.com/pricing> para mais detalhes. -Ao preencher o formulário de criação de conta, você receberá um email -com uma ulr de ativação. Se optar por planos pagos, terá que informar o número +Ao preencher o formulário de criação de conta, você receberá um e-mail +com uma url de ativação. Se optar por planos pagos, terá que informar o número do cartão de crédito para que seja feito o pagamento mensalmente. Para criar uma conta gratuita no GitLab, acesse <https://gitlab.com/users/sign_in>. Os serviços GitLab que usamos são instalações em servidoras próprias (do C3SL e do LEG), no entanto, a -interface do usuário é a mesma, com excessão de alguns privilégios +interface do usuário é a mesma, com exceção de alguns privilégios administrativos. ## Habilitar comunição ## -http://www.vogella.com/tutorials/GitHosting/article.html +<!-- http://www.vogella.com/tutorials/GitHosting/article.html --> -Geração e configuração das chaves públicas. -Incluir screenshots. +<!-- Geração e configuração das chaves públicas. --> +<!-- Incluir screenshots. --> Uma vez criada uma conta, é necessário habilitar a comunicação entre sua máquina e o (servidor do) GitHub. A comunicação é feita com protocolo @@ -330,7 +328,7 @@ qual você tem autenticação por chaves. Acesse <https://github.com/settings/ssh> para então adicionar chaves públicas (Figura \ref{github_sshkeys}) ao seu perfil. Clique em \menu{Add SSH key}, cole o conteúdo copiado do arquivo `*.pub` no campo -`key`. No campo `Title` identifique a máquina correspndente à quela +`key`. No campo `Title` identifique a máquina correspondente à quela chave. Use, por exemplo, `laptop` ou `trabalho` para facilitar o reconhecimento. É comum trabalhar-se com mais de um máquina, como uma em casa e outra no trabalho. @@ -345,7 +343,7 @@ casa e outra no trabalho. \label{github_sshkeys} \end{figure} -Para testar a comunição entre o GitHub e a sua máquina, execute: +Para testar a comunicação entre o GitHub e a sua máquina, execute: ```{r, engine="bash", eval=FALSE} ## Testa comunição. Retorna um "Welcome!" em caso positivo. ssh -T git@github.com @@ -356,7 +354,7 @@ ssh -vT git@github.com No GitLab, o cadastro de chaves públicas é um processo semelhante. Uma vez autenticado, acesse <https://gitlab.c3sl.ufpr.br/profile/keys> para -adicionar chaves públicas. Para testar a comunição entre o GitLab e a +adicionar chaves públicas. Para testar a comunicação entre o GitLab e a sua máquina, execute: ```{r, engine="bash", eval=FALSE} @@ -407,7 +405,7 @@ repositório e serve para documentar o seu objetivo, formas de colaboração, colaboradores, formas de instalação/uso. Você pode editar o arquivo `README.md` (ou qualquer outro) no próprio -GitHub. As moficações que fizer devem ser *commitadas* para serem +GitHub. As modificações que fizer devem ser *commitadas* para serem salvas. O arquivo `README.md`, que é linguagem de marcação MarkDown, é automaticamente renderizado pelo GitHub fazendo com que *urls* sejam clicáveis e códigos estejam em ambientes de fonte monoespaço, além de @@ -462,7 +460,7 @@ git push -u origin master O seu projeto é configurado em \menu{Settings}. Para renomear, deletar ou transferir o projeto para outro usuário ou organização, vá em \menu{Options}. Em \menu{Collaborators} você administra os colaboradores -do projeto. Para genrenciar os ramos de trabalho, como proteger ou +do projeto. Para gerenciar os ramos de trabalho, como proteger ou remover ramos, vá em \menu{Branches}. O uso de de serviços web é configurado no \menu{Webhooks \& services}. O \menu{Deploy keys} permite adicionar chaves públicas. @@ -583,11 +581,11 @@ descrever o procedimento de trabalho considerando tais interfaces. # Fluxo de trabalho # -TODO Deixar os chunks dessa sessão reproduzÃveis! TODO +<!-- TODO Deixar os chunks dessa sessão reproduzÃveis! TODO --> O fluxo de trabalho de um projeto Git local usando um servidor remoto foram apresentados no capÃtulo anterior. O fluxo com um repositório Git -mantido em um serviço, como o GitHub ou Gitlab, não muda muito. A maior +mantido em um serviço, como o GitHub ou GitLab, não muda muito. A maior diferença não é sobre o uso de novas instruções Git mas sim a adoção de uma estratégia de trabalho (*workflow*) baseada nos recursos desses serviços, como as *milestones* e *issues*. Esse modelos de trabalho @@ -598,7 +596,7 @@ acrescenta à queles necessários para se comunicar com o repositório. Alguns desses comandos, senão todos, já foram apresentados no capÃtulo anterior a esse. -Ao considerar um seviço web, você pode começar um repositório novo de +Ao considerar um serviço web, você pode começar um repositório novo de duas formas: localmente ou pelo serviço. Pelo serviço, qualquer que seja, crie um novo repositório. GitHub e @@ -610,7 +608,7 @@ de criar e *clonar* o repositório e também de criar local e adicionar a *url* do repositório remoto (`origin`). Localmente o repositório segue o ciclo normal de desenvolvimento que -minimamente contém as intruções `git add` e `git commit`. Os fluxos de +minimamente contém as instruções `git add` e `git commit`. Os fluxos de trabalho, em geral, preconizam o desenvolvimento a partir de *branches* de demanda cujo conteúdo será incorporado aos ramos permanentes (`master`, `devel`) quando forem concluÃdos. Abaixo ilustramos a @@ -679,7 +677,7 @@ default. No entanto, um projeto Git pode ter mais de um repositório remoto. Considere o caso simples de um repositório para arquivos de uma disciplina. Esse repositório contém tanto lista de exercÃcios para os alunos como também as provas com as soluções. Para não entregar as -provas de bandeija, o diretório de provas existe no ramo `secret` e é +provas de bandeja, o diretório de provas existe no ramo `secret` e é enviado somente para um repositório privado chamado `provas`. Já o conteúdo restante (lista de exercÃcios, notas de aula, scripts), disponibilizado para os alunos, fica no ramo `master`, mantido em um @@ -738,7 +736,7 @@ após o `fetch`. Para transferir o conteúdo `origin/devel` para o `devel` tem-se que usar o `git merge`. No entanto, sempre que haver necessidade, antes do *merge* pode-se verificar as diferenças que existem entre local e remoto, principalmente quando esse remoto traz -contribuições de algum colaborador. Os comandos abaixos exibem as +contribuições de algum colaborador. Os comandos abaixo exibem as diferenças entre os ramos e aplicam o merge entre eles. ```{r, engine="bash", eval=FALSE} @@ -767,7 +765,7 @@ git pull origin git pull origin devel ``` -Por fim, para subir o trabalho feito em um ramo, usa-se a intrução `git +Por fim, para subir o trabalho feito em um ramo, usa-se a instrução `git push`. Enviar o seu trabalho com frequência é a melhor forma de ter *backups*, exibir e disponibilizar suas contribuições para os seus colaboradores. A documentação do `git @@ -812,7 +810,7 @@ disponibilizar seu trabalho. No entanto, um dos principais objetivos dos serviços web é permitir a colaboração entre pessoas. Já mencionamos o básico sobre recursos de colaboração quando falamos de *issue*, *fork* e *merge request*. Nas sessões a seguir, vamos nos aprofundar nesses três -mecanÃsmos chave para a colaboração via serviços web para Git. +mecanismos chave para a colaboração via serviços web para Git. ## Issues ## @@ -827,7 +825,7 @@ que as pessoas abram um assunto/tópico referente ao projeto. Em geral, com os *issues* as pessoas externas ao projeto indicam um *bug* - uma falha a ser corrigida - ou sugerem que o projeto incorpore determinada caracterÃstica desejável. O dono do projeto avalia a proposta e pode -discutÃ-la logo em seguida, mantendo as mensagens reunidas e disponÃveis +discuti-la logo em seguida, mantendo as mensagens reunidas e disponÃveis para outros usuários que acompanham o projeto. Quando a proposta do *issue* for implementada, o *issue* é fechado. Mesmo assim, o *issue* continua disponÃvel e pode ser referenciado no futuro, tanto para novos @@ -886,7 +884,7 @@ Com o *fork* você pode colaborar como um terceiro em um projeto, ou seja, sem ser colaborador adicionado pelo dono. Nessa cópia você tem permissões de *owner* pois na realidade, embora seja uma cópia, ela é toda sua. Você faz sua cópia livre, trabalha como quiser e no prazo que -quiser, e submete ao projeto original o desenvido na sua cópia. O dono +quiser, e submete ao projeto original o desenvolvido na sua cópia. O dono do projeto não tem como saber por que você fez o *fork* (mas você pode criar um *issue*) nem quando irá concluir o que almeja. No entanto, quando concluir, para que seu trabalho seja incorporado ao original, @@ -937,14 +935,14 @@ git push origin issue#33 ``` Na interface web, o membro faz um *merge request* desse ramo para um -ramo permamente, no qual em projetos simples é o *master* mas em +ramo permanente, no qual em projetos simples é o *master* mas em projetos maiores é usualmente o *devel*. Ao clicar em *merge request*, uma caixa de diálogo abre para que você liste as colaborações que o *branch* leva. Em ambos os serviços, o *merge resquest* leva para um página na qual você escolhe que ramo de demanda (doador) será incorporado a um ramo -permamente (receptor). Ao confirmar os ramos envolvidos, tem-se uma +permanente (receptor). Ao confirmar os ramos envolvidos, tem-se uma caixa de texto destinada as informações sobre quais as modificações devem ser incorporadas. Elas servem para justificar, esclarecer e informar o responsável pelo *merge* sobre a incorporação. Quando o @@ -969,13 +967,13 @@ e portanto, o trabalho vai levar mais tempo. Os próprios serviços web fazem o *merge* diretamente quando não existe conflito (merge do tipo *fast forward*). Isso facilita bastante o trabalho. Porém, não haver conflito de *merge* não significa que as -modificações incorparadas estão funcionais, ou seja, as modificações +modificações incorporadas estão funcionais, ou seja, as modificações feitas precisam ser testadas localmente para verificar se surtiram efeito. É possÃvel habilitar o serviço Git para checar se o projeto é -executável ou funcional. Esse recurso se chama intergração contÃnua e +executável ou funcional. Esse recurso se chama integração contÃnua e veremos na próxima sessão. -Em caso de confito de *merge*, tem-se que baixar os ramos (`git +Em caso de conflito de *merge*, tem-se que baixar os ramos (`git fetch`). Localmente pode-se comparar as diferenças entre eles para entender as fontes de conflito. Para isso são recomendáveis as interfaces para Git que serão discutidas no próximo CapÃtulo. Uma vez @@ -1030,7 +1028,7 @@ aperfeiçoá-lo mas o tempo todo estamos sujeitos a fazer modificações que induzem erros e alguém encontra erros não esperados (*bugs*). Monitorar erros no projeto em desenvolvimento não é uma tarefa fácil, -principalmente em trabalhos coletivos nos quais cada colaborator tem um +principalmente em trabalhos coletivos nos quais cada colaborador tem um ambiente de trabalho. Em uma situação ideal, alguém teria que testar se o projeto corre sem erros (código executa, software instala) em uma máquina cliente (com os requisitos mÃnimos exigidos), toda vez que um @@ -1064,24 +1062,24 @@ IC\footnote{\url{https://about.gitlab.com/gitlab-ci/}} são: 3) Verificação em vários ambientes (sistemas operacionais, arquiteturas, dependências e versões); 4) Informação coletiva e imediata à equipe da causa de falha na hora - que ela ocorre, o que aumenta a visilibidade, facilita a + que ela ocorre, o que aumenta a visibilidade, facilita a comunicação e direcionamento de esforços. 5) Indicação de sucesso ou não na home do projeto e nos *branches* disponÃvel antes do merge; 6) Entrega de versões estáveis, documentação e arquivos acessórios com *continuous deployment*, o que facilita o empacotamento e - disponibização do projeto. + disponibilização do projeto. 7) Custo computacional reduzido já que é feito em um servidor dedicado. 8) Acaba saindo mais barato do que parar o projeto para corrigir um erro. -O que deve ficar claro é que a integração contÃnua não elinima erros, +O que deve ficar claro é que a integração contÃnua não elimina erros, mas faz com que eles sejam mais fáceis de identificar e corrigir. Sem a automação, os espaços entre verificações podem ficar longos. Encontrar um *bug* em tantos *commits* é mais difÃcil, encontrar no código é mais ainda. Pode atrasar a entrega do projeto e comprometer a -receita e popularidade. Integrações periodicas são mais fáceis e leves. +receita e popularidade. Integrações periódicas são mais fáceis e leves. O fluxo de trabalho de um repositório com IC é basicamente assim: @@ -1091,15 +1089,15 @@ O fluxo de trabalho de um repositório com IC é basicamente assim: 3) O serviço de IC monitora o repositório toda vez que modificações ocorrem; 4) O serviço de IC corre todos os testes de inspeção que foram - configurados (instala dependendencias, executa scripts, - cria/tranfere arquivos, etc); + configurados (instala dependências, executa scripts, + cria/transfere arquivos, etc); 5) O serviço de IC disponibiliza produtos da verificação, como binários de instalação e documentação (no caso de sucesso) ou log - de execussão (no caso de falha); + de execução (no caso de falha); 6) O serviço de IC assinala no repositório Git o *status* da verificação: sucesso/fracasso; 7) O serviço de IC informa a equipe dos resultados por mensagem de - email ou *web hooks*, como o Slack; + e-mail ou *web hooks*, como o Slack; 8) A equipe toma das providências cabÃveis na primeira oportunidade, como corrigir a falha ou anunciar o sucesso; 9) O serviço aguarda por mais modificações; @@ -1116,7 +1114,7 @@ Para vincular um projeto no GitHub com IC no Travis CI, você precisa logar no <https://travis-ci.org/> com a sua conta do GitHub. Assim que você logar, dê autorização para acessar seus repositórios e em uma lista você deve marcar os que usarão o serviço. A próxima etapa é criar um -arquivo `.travis.yml` na raÃz do seu repositório Git. Esse arquivo +arquivo `.travis.yml` na raiz do seu repositório Git. Esse arquivo oculto especifica todas as instruções que devem ser feitas a fim de verificar seu repositório. Se seu repositório é um pacote R, por exemplo, esse arquivo vai ter instruções de instalação do pacote. @@ -1129,7 +1127,7 @@ prática em ver exemplos em uso, como o `.travis.yml` dos pacotes R `devtools`\footnote{\url{https://github.com/hadley/devtools}} que estão na lista dos mais utilizados. -Para todas as liguagens e objetivos têm-se exemplos de arquivos +Para todas as linguagens e objetivos têm-se exemplos de arquivos `.trevis.yml`. Para o Emacs e bibliotecas lisp visite <https://github.com/rolandwalker/emacs-travis>, <https://github.com/Malabarba/elisp-bug-hunter> e @@ -1170,7 +1168,7 @@ realidade um *desktop* com Ubuntu Server 14.04. É patrimônio da UFPR de responsabilidade do LEG mas tem uso compartilhado com o PET EstatÃstica e colaboradores do Laboratório. Desde a disponibilização do GitLab, em julho de 2015, mantemos artigos, materiais de ensino (aulas, provas, -scripts), tutoriais e materias de blog em devolvimento colaborativo, +scripts), tutoriais e matérias de blog em devolvimento colaborativo, além de pacotes R. Nessa servidora, criamos um usuário chamado `gitlab-runner` com o qual @@ -1188,7 +1186,7 @@ pacotes R. A documentação oficial sobre como usar o arquivo `.gitlab-ci.yml` encontra-se em <http://doc.gitlab.com/ce/ci/yaml/README.html>. -O arquivo `.gitlab-ci.yml` fica na raÃz do projeto. Seu conteúdo define +O arquivo `.gitlab-ci.yml` fica na raiz do projeto. Seu conteúdo define todo o processo de verificação do seu repositório a partir de uma série de instruções, como execução de comandos diretos ou execução de scripts. Abaixo tem-se um exemplo simples de `.gitlab-ci.yml`. @@ -1204,7 +1202,7 @@ job2: ``` Neste exemplo existem dois *jobs* (tarefas). Cada um deles corre -independente e podem ser executados simultâneamente. O primeiro executa +independente e podem ser executados simultaneamente. O primeiro executa um *script* shell e o segundo comandos *shell* em uma lista. Porém, tais arquivos podem ser bem mais complexos, com campos além do `script:`. Os campos a seguir são todos opcionais: @@ -1213,7 +1211,7 @@ campos a seguir são todos opcionais: *docker*\footnote{\url{https://www.docker.com/}}. O tutorial de Alan Monger considera esse campo. * `services`: também refere ao *docker*. Tais campos são de uso menos - frequênte, porém existe uma série de vantagens neles. A documentação + frequente, porém existe uma série de vantagens neles. A documentação oficial sobre isso encontra-se em <http://doc.gitlab.com/ce/ci/docker/README.html>. * `before_script`: define comandos/scripts a serem executados antes @@ -1242,14 +1240,14 @@ campos a seguir são todos opcionais: script: "compacta_transfere.sh" stage: entrega ``` - * `variables`: serve para criar variaveis de ambiente que podem ser + * `variables`: serve para criar variáveis de ambiente que podem ser usados por todos os comandos e scripts. Tais variáveis podem - aramazenas senhas de acesso, necessárias por exemplo para instalação + armazenadas senhas de acesso, necessárias por exemplo para instalação de componentes e acesso à bancos de dados. * `cache`: indica os diretórios e arquivos que serão mantidos entre os *jobs* (builds), possivelmente porque são aproveitados futuramente. -Com excessão dos nomes listados acima, um *job* pode ter qualquer nome, +Com exceção dos nomes listados acima, um *job* pode ter qualquer nome, desde que seja exclusivo. Dentro de um *job* tem-se também uma lista de campos disponÃveis para configurá-lo: @@ -1259,7 +1257,7 @@ campos disponÃveis para configurá-lo: execução dos *jobs*. Vários *jobs* podem ser do mesmo estágio e nesse caso são executados paralelamente. * `only` e `except`: servem para restringir a execução do *job*, - incluindo ou excluindo, para uma lista de referências git, como + incluindo ou excluindo, para uma lista de referências Git, como *branches* ou *tags*. Esse campo permite expressões regulares, úteis para incluir (excluir) ramos representáveis por *regex*, como são os ramos de desenvolvimento do nosso workflow, iniciados com *issue*. @@ -1283,7 +1281,7 @@ campos disponÃveis para configurá-lo: estágio anterior falhou. * `on_success`: são instruções executadas quando todos os *jobs* do estágio anterior foram bem sucedidos. - * `always`: excutados sempre. + * `always`: executados sempre. * `cache`: especifica arquivos e diretórios mantidos entre um *job* e outro. @@ -1304,7 +1302,7 @@ job_R: Estas são instruções em *shell* que chamam o R com expressões passadas para `Rscript -e` para fazer a instalação do pacote. Na ocorrência da primeira falha, o processo é logicamente interrompido e os -colaboradoradores podem ver a causa em +colaboradores podem ver a causa em <http://git.leg.ufpr.br/leg/legTools/builds>. No caso do *build* correr sem falhas, tem-se uma estampa de *success*. Essa estampa também vai aparecer no `README.md` na página de rosto do projeto, basta para isso @@ -1323,7 +1321,7 @@ meio do GitLab CI. Um *runner* pode ser especÃfico de um projeto ou pode ser um *runner* compartilhado, disponÃvel à todos os projetos. Estes últimos são úteis à projetos que tem necessidades similares, como todos à queles projetos que são pacotes R, por exemplo. Isso facilita a -administação e atualização. Os especÃficos, por outro lado, atendem +administração e atualização. Os especÃficos, por outro lado, atendem projetos com demandas particulares. Apenas usuários com permissões de *admin* podem criar *runners* @@ -1338,9 +1336,9 @@ novas entradas no menu da esquerda: útil para passar senhas. * *Triggers*: servem para TODO * *CI Web Hooks*: esse *web hook* pode ser usado para criar eventos - quando o *build* é concluido. + quando o *build* é concluÃdo. * *CI Settings*: configurações gerais. - * *CI Services*: permite integrar o CI com outros serviços, como email + * *CI Services*: permite integrar o CI com outros serviços, como e-mail e Slack. Para habilitar um *runner*, é necessário instalar o @@ -1349,4 +1347,4 @@ Runner*\footnote{\url{https://gitlab.com/gitlab-org/gitlab-ci-multi-runner}} contém as instruções de instalação e configuração e a documentação oficial *runners*\footnote{\url{http://doc.gitlab.com/ce/ci/runners/README.html}} -indicando como tirar melhor proveito do recurso. \ No newline at end of file +indicando como tirar melhor proveito do recurso. diff --git a/cap06.Rmd b/cap06.Rmd index 89f65b36bae66a1949882ac1667ef9aff716baec..b8551af83231be404bdd2f7d6b4ccd357f59d3ed 100644 --- a/cap06.Rmd +++ b/cap06.Rmd @@ -8,7 +8,7 @@ header-includes: \usepackage{menukeys} output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -21,49 +21,49 @@ library(knitr) opts_chunk$set(comment = NA) ``` -\chapter{Ferramentas gráficas} - -No Git, todo o gerenciamento do projeto é realizado via -*CLI (Command line interface)*, linhas de comando interpretadas, geralmente -pelo *bash*. Isso confere um maior controle e segurança nas ações realizadas, -mas em muitas situações os comandos e *outputs* Git não se apresentam de -forma tão amigável, seja pela difÃcil memorização ou pela interatividade +No Git, todo o gerenciamento do projeto é realizado via *CLI (Command +line interface)*, linhas de comando interpretadas, geralmente pelo +*bash*. Isso confere um maior controle e segurança nas ações realizadas, +mas em muitas situações os comandos e *outputs* Git não se apresentam de +forma tão amigável, seja pela difÃcil memorização ou pela interatividade limitada. Os comandos mais usuais como `git add`e `git commit` se tornam simples, -pois mesmo para um usuário iniciante eles fazem parte do cotidiano em -um projeto sob versionamento Git. Porém, algumas situações não ocorrem -com frequência, como por exemplo voltar a versão de um arquivo ou do -repositório requerem comandos que são pouco utilizados e para realizá-las -é necessário a consulta de algum material. Outra situação em que -a utilização dos comandos é dificultada, ocorre em projetos grandes, uma vez que -muitos arquivos são alterados simultaneamente. Neste caso o procedimento de *commit* -se torna trabalhoso, pois é necessário listar todos os arquivos que fazem -parte de um *commit* no commando `git add`. Uma última situação exemplo -em que o uso de *CLI* não parece satisfatório é na comparação de arquivos, -já usamos o comando `git diff` no capÃtulo 3 e o *output* deste comando -foi de simples visualização, mas em arquivos grandes (com muitas linhas) -a navegação para verificar as alterações do arquivo não é tão amigável. Para -facilitar essas e outras situações surgem as *GUI's (Graphical User -Interfaces)*, interfaces gráficas para o usuário incorporar comandos -Git em *widgets*(botões, caixas de texto etc.) dispostos em uma janela -gráfica de seu sistema operacional. +pois mesmo para um usuário iniciante eles fazem parte do cotidiano em um +projeto sob versionamento Git. Porém, algumas situações não ocorrem com +frequência, como por exemplo voltar a versão de um arquivo ou do +repositório requerem comandos que são pouco utilizados e para +realizá-las é necessário a consulta de algum material. Outra situação em +que a utilização dos comandos é dificultada, ocorre em projetos grandes, +uma vez que muitos arquivos são alterados simultaneamente. Neste caso o +procedimento de *commit* se torna trabalhoso, pois é necessário listar +todos os arquivos que fazem parte de um *commit* no commando `git +add`. Uma última situação exemplo em que o uso de *CLI* não parece +satisfatório é na comparação de arquivos, já usamos o comando `git diff` +no capÃtulo 3 e o *output* deste comando foi de simples visualização, +mas em arquivos grandes (com muitas linhas) a navegação para verificar +as alterações do arquivo não é tão amigável. Para facilitar essas e +outras situações surgem as *GUI's (Graphical User Interfaces)*, +interfaces gráficas para o usuário incorporar comandos Git em +*widgets*(botões, caixas de texto etc.) dispostos em uma janela gráfica +de seu sistema operacional. Neste capÃtulo apresentamos as principais *GUI's* para projetos Git em diferentes plataformas, sistemas UNIX, Mac OS X e Windows. Seccionamos em dois conjuntos de interfaces. O primeiro chamado de **Interfaces Git** refere-se à s ferramentas para alterações e visualizações de -arquivos no repositório a fim de facilitar as atividades cotidianas. Já o -segundo, **Interfaces de comparação**, representam as que objetivam +arquivos no repositório a fim de facilitar as atividades cotidianas. Já +o segundo, **Interfaces de comparação**, representam as que objetivam facilitar a visualização e edição de arquivos com base em suas diferentes versões. Detalhes de download, instalação e exemplos da -utilização destas interfaces no fluxo de trabalho de um projeto são descritos. +utilização destas interfaces no fluxo de trabalho de um projeto são +descritos. # Interfaces Git # -Neste material chamaremos de **Interfaces GIT** as *GUI's* para gestão -de um repositório. Estas facilitam a utilização das principais -instruções **Git** (`git add`, `git commit`, `git push`, `git pull`), +Neste material chamaremos de **Interfaces GIT** as *GUI's* para gestão +de um repositório. Estas facilitam a utilização das principais +instruções **Git** (`git add`, `git commit`, `git push`, `git pull`), visualização dos arquivos e alterações no repositório. ## git-gui ## @@ -81,9 +81,9 @@ Baseada em *Tcl/Tk*, a *GUI* chamada `git gui` é mantida como projeto independente do Git, mas as versões estáveis são distribuÃdas junto com o programa principal, portanto não é necessário o download e instalação. A interface é voltada para realizar alterações no -repositório, desde as mais simples como *commitar* arquivos até as mais -especÃficas como voltar estágios ou reescrever o último *commit* (muito -útil quando notamos erros de gramática logo após a submissão). Nesta +repositório, desde as mais simples como *commitar* arquivos até as mais +especÃficas como voltar estágios ou reescrever o último *commit* (muito +útil quando notamos erros de gramática logo após a submissão). Nesta seção abordaremos apenas as alterações mais comuns no repositório. A `git gui` no Windows, pode ser aberta pelo menu iniciar. Nesta @@ -100,9 +100,9 @@ sudo apt-get install git-gui Ainda em sistemas Unix podemos criar um *alias* (criar ou editar adequadamente um arquivo em */usr/share/applications*) para que a `git -gui` fique listada junto à s aplicações do sistema. Porém, de forma geral, -independente da plataforma de trabalho, a `git gui` pode ser iniciada a -partir de um terminal `bash`, com o comando: +gui` fique listada junto à s aplicações do sistema. Porém, de forma +geral, independente da plataforma de trabalho, a `git gui` pode ser +iniciada a partir de um terminal `bash`, com o comando: ```{r, engine="bash", eval=FALSE} git gui @@ -165,7 +165,7 @@ interface `git gui`. \end{figure} A interface `git gui` se apresenta de forma simples, o que facilita sua -utilização. Na figura \ref{fig:gitgui} detacamos as quatro áreas que +utilização. Na figura \ref{fig:gitgui} destacamos as quatro áreas que compreendem a interface. Na primeira porção temos listados os arquivos presentes no *working directory*, os arquivos criados aparecem com Ãcone em branco e os modificados com linhas em azul, aqui a interface @@ -200,26 +200,27 @@ ser acessadas com um simples clique e são auto-explicativas. adição são caracterÃsticos das logos GIT} \end{wrapfigure} -Pioneira dentre as interfaces gráficas, `gitk` foi a primeira -*GUI* implementada. Também escrita em *Tcl/Tk*, esta *GUI* -tem como objetivo a apresentação do histórico de um projeto. A `gitk` -é incorporada ao principal repositório do Git, portanto nas instalações -completas, esta interface fica disponÃvel sem ser necessário -download e instalação. Nesta seção apresentamos a `gitk`, detalhando a -disposição dos elementos nesta interface que se mostra muito útil na -visualização de projetos. +Pioneira dentre as interfaces gráficas, `gitk` foi a primeira *GUI* +implementada. Também escrita em *Tcl/Tk*, esta *GUI* tem como objetivo a +apresentação do histórico de um projeto. A `gitk` é incorporada ao +principal repositório do Git, portanto nas instalações completas, esta +interface fica disponÃvel sem ser necessário download e +instalação. Nesta seção apresentamos a `gitk`, detalhando a disposição +dos elementos nesta interface que se mostra muito útil na visualização +de projetos. A `gitk` trabalha em conjunto com a `git gui`. Em `git gui` podemos fazer alterações de forma rápida e visual nos arquivos que estão na *staging area* e *working directory*, porém para visualizar o histórico completo de *commits* com ramificações, marcações e demais detalhes, -recorremos à `gitk`, uma prova disso é que no menu da `git gui` temos um atalho -para a `gitk` \menu{Repository > Visualize History}. Essa interface se -mostra muito útil também como ferramenta de aprendizagem Git, uma vez -que visualizar de forma gráfica as alterações que os comandos realizados -causam no projeto, torna mais fácil a compreensão dos mesmos. - -`gitk`, assim como a `git gui` pode ser chamada atráves da linha de +recorremos à `gitk`, uma prova disso é que no menu da `git gui` temos um +atalho para a `gitk` \menu{Repository > Visualize History}. Essa +interface se mostra muito útil também como ferramenta de aprendizagem +Git, uma vez que visualizar de forma gráfica as alterações que os +comandos realizados causam no projeto, torna mais fácil a compreensão +dos mesmos. + +`gitk`, assim como a `git gui` pode ser chamada através da linha de comando: ```{r, engine="bash", eval=FALSE} @@ -242,26 +243,25 @@ chamada neste estado do repositório temos: \label{fig:gitk} \end{figure} -Perceba na figura \ref{fig:gitk} que esta interface é mais completa -do que a `git gui` no que diz respeito à informação. Dividida em apenas +Perceba na figura \ref{fig:gitk} que esta interface é mais completa do +que a `git gui` no que diz respeito à informação. Dividida em apenas duas partes, a `gitk` apresenta na primeira todo o histórico do projeto, -comtempla uma implementação visual e agradável do comando `git log --graph`. No -gráfico apresentado na parte superior, as bolinhas em azul representam -*commits* passados, a de amarelo indica o estado atual do repositório e -em vermelho são as modificações no *working directory*. Ao lado estão os -autores dos respectivos *commits* e o momento em que foram feitos. Na -parte inferior da interface temos o detalhamento do *commit* selecionado -na parte superior. As informações contidas aqui vão desde +contempla uma implementação visual e agradável do comando `git log +--graph`. No gráfico apresentado na parte superior, as bolinhas em azul +representam *commits* passados, a de amarelo indica o estado atual do +repositório e em vermelho são as modificações no *working directory*. Ao +lado estão os autores dos respectivos *commits* e o momento em que foram +feitos. Na parte inferior da interface temos o detalhamento do *commit* +selecionado na parte superior. As informações contidas aqui vão desde identificador do *commit* (*SHA1 ID*), diferença das modificações -referenciadas com relação ao estado anterior do -repositório até a listagem dos arquivos atingidos pelo *commit* -selecionado. +referenciadas com relação ao estado anterior do repositório até a +listagem dos arquivos atingidos pelo *commit* selecionado. -Além da excelente apresentação visual do repositório Git, a interface -`gitk` também permite algumas alterações. Clicando com o botão direito de -seu *mouse* em qualquer *commit* listado, podemos criar *tags*, reverter o -repositório neste estado, criar um ramo a partir do *commit* dentre outras -opções possÃveis atráves da interface. +Além da excelente apresentação visual do repositório Git, a interface +`gitk` também permite algumas alterações. Clicando com o botão direito +de seu *mouse* em qualquer *commit* listado, podemos criar *tags*, +reverter o repositório neste estado, criar um ramo a partir do *commit* +dentre outras opções possÃveis através da interface. ## Outras Interfaces ## @@ -301,11 +301,11 @@ nas seções sobre `git gui` e `gitk` ### RabbitVCS ### *RabbitVCS* é uma coleção de ferramentas gráficas para navegadores de - arquivos do sistema LINUX que permitem o acesso simples e direto aos - sistemas de controle de versão Git e/ou Subversion. Não se caracteriza - como interface, porém altera a visualização no navegador de arquivos de - diretórios sob versionamento, além de dispor de ações implementadas - nas opções do menu quando pressionado o botão direito do mouse. +arquivos do sistema LINUX que permitem o acesso simples e direto aos +sistemas de controle de versão Git e/ou Subversion. Não se caracteriza +como interface, porém altera a visualização no navegador de arquivos de +diretórios sob versionamento, além de dispor de ações implementadas nas +opções do menu quando pressionado o botão direito do mouse. <!--  --> <!-- FIGURA: Navegador *Nautilus* com uso do `RabbitVCS` --> @@ -322,15 +322,16 @@ nas seções sobre `git gui` e `gitk` \end{landscape} Na figura \ref{fig:rabbit} temos o *screenshot* do repositório -`meu1repo` no navegor de arquivos `nautilus` (padrão do sistema Ubuntu +`meu1repo` no navegador de arquivos `nautilus` (padrão do sistema Ubuntu 14.04). Perceba que com essa interface os Ãcones de arquivos e pastas no navegador ganham destaque com um outro pequeno Ãcone na parte inferior. Estes pequenos Ãcones indicam o estado do arquivo sem precisar recorrer ao terminal, ou seja, temos um `git status` no próprio navegador de arquivos. Além disso `RabbitVCS` complementa o menu de -opções acessados com o botão direito do mouse. Essas opções são completas, -vão desde *commits*, criação de *branchs* e *tags*, reverter -o estado do repositório, até atualizar com a versão remota, entre outras. +opções acessados com o botão direito do mouse. Essas opções são +completas, vão desde *commits*, criação de *branchs* e *tags*, reverter +o estado do repositório, até atualizar com a versão remota, entre +outras. ### git-cola ### @@ -357,10 +358,10 @@ ao `git-cola`. Perceba pela figura \ref{fig:git-dag} que as opções das interfaces são similares as apresentadas em `git gui` e `gitk`. As interfaces `git-cola` e `git-dag` se destacam pela fácil manipulação do layout -exibido, além de deixar a interface mais intuitiva -possÃvel. Como destaque em implementação de funcionalidade Git, a -`git-cola` se sobressai com relação à `git gui` na possibilidade de -execução do comando `git rebase` via interface. +exibido, além de deixar a interface mais intuitiva possÃvel. Como +destaque em implementação de funcionalidade Git, a `git-cola` se +sobressai com relação à `git gui` na possibilidade de execução do +comando `git rebase` via interface. ### Plugins e extensões para editores ### @@ -372,22 +373,21 @@ seja por meio de *plugins* adicionais instalados ou pela opção nativa do editor. Destacamos aqui dois editores, comumente utilizados pela comunidade -estatÃstica, que possuem os comandos **Git** intergrado à sua +estatÃstica, que possuem os comandos **Git** integrados à sua interface. São eles, o `emacs`, o qual temos as opções de *buffers* no editor onde podemos abrir uma instância *shell* e executar os comandos **Git** junto com o desenvolvimento do código fonte. Além disso uma extensão poderosa chamada `magit`\footnote{Informações em \url{http://magit.vc/}} está disponÃvel e em desenvolvimento para o uso -no `emacs`, esta extensão proporciona opções de comandos e -visualização em um *buffer* do editor que facilita o trabalho de -versionamento. Outro editor também muito utilizado em EstatÃstica, -talvez o mais utilizado pela comunidade, é o RStudio que também -implementa em sua interface vários comandos, assim como as interfaces -anteriormente descritas e tarefas não triviais, uma chamada do -terminal *Shell* é possÃvel dentro do aplicativo. Devido ao seu grande -uso, o RStudio terá uma seção especÃfica onde as diversas -ferramentas serão exploradas, com exemplos e ilustrações voltadas para a -comunidade estatÃstica. +no `emacs`, esta extensão proporciona opções de comandos e visualização +em um *buffer* do editor que facilita o trabalho de versionamento. Outro +editor também muito utilizado em EstatÃstica, talvez o mais utilizado +pela comunidade, é o RStudio que também implementa em sua interface +vários comandos, assim como as interfaces anteriormente descritas e +tarefas não triviais, uma chamada do terminal *Shell* é possÃvel dentro +do aplicativo. Devido ao seu grande uso, o RStudio terá uma seção +especÃfica onde as diversas ferramentas serão exploradas, com exemplos e +ilustrações voltadas para a comunidade estatÃstica. # Interfaces de comparação # @@ -396,13 +396,13 @@ paralelo por dois ou mais usuários ou por ramos de desenvolvimento. E como qualquer desenvolvimento paralelo, desejamos ao final do trabalho, mesclar as contribuições realizadas lado a lado. Como vimos no capÃtulo 3 isso é feito através do comando `git merge ramo_desenvolvimento` para -ramos locais e `git push origin` quando estamos -trabalhando em equipe e as contribuições são enviadas para um servidor -remoto, capÃtulo 4. Porém, quando a mesma porção de um mesmo arquivo é -alterada em duas instâncias distintas (ramos diferentes, usuários -diferentes etc.) ocorrem conflitos e vimos como o **Git** os sinaliza -para que possamos resolvê-los. Nesta seção mostraremos como as -interfaces gráficas dedicadas à resolução de conflitos na mesclagem e à +ramos locais e `git push origin` quando estamos trabalhando em equipe e +as contribuições são enviadas para um servidor remoto, +capÃtulo 4. Porém, quando a mesma porção de um mesmo arquivo é alterada +em duas instâncias distintas (ramos diferentes, usuários diferentes +etc.) ocorrem conflitos e vimos como o **Git** os sinaliza para que +possamos resolvê-los. Nesta seção mostraremos como as interfaces +gráficas dedicadas à resolução de conflitos na mesclagem e à visualização da diferença de arquivos em estados diferentes do repositório podem nos auxiliar. @@ -424,12 +424,12 @@ comentários feitos para o `meld` podem ser adotadas para os demais. O programa `meld` é implementado em *python* e se denomina como "uma ferramenta de diferenciação e mesclagem voltada para desenvolvedores", o -programa pode ser baixado para as plataformas UNIX, Mac OS X e -Windows atráves do endereço <http://meldmerge.org/>. O `meld` não é uma +programa pode ser baixado para as plataformas UNIX, Mac OS X e Windows +atráves do endereço <http://meldmerge.org/>. O `meld` não é uma ferramenta especÃfica para o Git, como as apresentadas na seção -\ref{interfaces-git}, porém é permitido e será usado para comparar versões de -arquivos ou repositórios, mas vamos começar apresentando o `meld` como -programa independente. +\ref{interfaces-git}, porém é permitido e será usado para comparar +versões de arquivos ou repositórios, mas vamos começar apresentando o +`meld` como programa independente. Inicializando o programa, sua tela inicial deverá ser similar a apresentada na figura \ref{fig:meld1}, aqui estamos utilizando um @@ -455,7 +455,7 @@ velhos tempos antes de conhecermos o **Git**). \begin{center} \includegraphics{./images/meld2} \end{center} - \caption{\textit{Screenshot} de comparaçao de arquivos com programa + \caption{\textit{Screenshot} de comparação de arquivos com programa \textit{meld} \texttt{RabbitVCS}} \label{fig:meld2} @@ -466,19 +466,19 @@ trabalho de um projeto sob versionamento. Vamos então voltar ao nosso projeto `meu1repo`, iniciado no capÃtulo 3 e alterado na seção \ref{interfaces-git} (Interfaces Git). As alterações realizadas não foram salvas, então podemos visualizá-las no `meld`. A inicialização do -programa pode ser feita via linha de comando `git difftool`, só temos -que informar o programa a ser utilizado com a opção -`-t` (abreviação de `--tool`). Nos sistemas UNIX, o programa pode ser -lançado apenas atráves do nome `meld`. +programa pode ser feita via linha de comando `git difftool`, só temos +que informar o programa a ser utilizado com a opção `-t` (abreviação de +`--tool`). Nos sistemas UNIX, o programa pode ser lançado apenas através +do nome `meld`. ```{r, engine="bash", eval=FALSE} ## Compara o arquivo README (UNIX) git difftool -t meld README.md ``` -Para utilização em sistemas Windows, programas externos ao Git devem -ser informados no arquivo de configuração (`.gitconfig`). Abaixo -configuramos, via linha de comando, este arquivo para usarmos o `meld` +Para utilização em sistemas Windows, programas externos ao Git devem ser +informados no arquivo de configuração (`.gitconfig`). Abaixo +configuramos, via linha de comando, este arquivo para usarmos o `meld` como ferramenta de comparação - `difftool`, tanto para usuários Unix como usuários Windows: @@ -495,10 +495,9 @@ git config difftool.meld.cmd '"path/Meld.exe" $LOCAL $REMOTE' ``` -\noindent -onde `path` é o caminho para o arquivo executável do programa `meld`. -`$LOCAL` representa o arquivo na sua versão local e `$REMOTE` na sua -versão remota. Assim o programa pode ser lançado apenas com o +\noindent onde `path` é o caminho para o arquivo executável do programa +`meld`. `$LOCAL` representa o arquivo na sua versão local e `$REMOTE` +na sua versão remota. Assim o programa pode ser lançado apenas com o comando: ```{r, engine="bash", eval=FALSE} @@ -519,7 +518,7 @@ git difftool README.md Na figura \ref{fig:meld3} temos o _screenshot_ do programa após executado o `difftool`. Nesta figura temos a mesma informação trazida pelas interfaces onde implementam o comando `git diff`, porém aqui podemos -alterar os arquivos exibidos atráves das flechas nas bordas (levando ou +alterar os arquivos exibidos através das flechas nas bordas (levando ou trazendo as contribuições) ou mesmo editando pela interface. Isso pode ser útil caso necessite desfazer parcialmente um *commit*, ou seja, parte das alterações de uma versão anterior seria mantida e parte @@ -586,7 +585,7 @@ cat(paste(x, collapse="\n")) ``` E agora, ao invés de editarmos o arquivo em conflito, vamos utilizar a -ferramenta `meld` para resolver os conflitos. Para isso, execute o +ferramenta `meld` para resolver os conflitos. Para isso, execute o seguinte comando no terminal: ```{r, engine="bash", eval=FALSE} @@ -655,16 +654,17 @@ git add README.txt git commit -m "Resolve conflito via meld" ``` -Para resolucão de conflitos via alguma ferramenta gráfica com o comando +Para resolução de conflitos via alguma ferramenta gráfica com o comando `git mergetool`, o **Git** gera arquivos de _backup_ com extensão -`.orig`. Perceba no _output_ gerado pelo `git status` que estes armazenam o -conteúdo de cada arquivo em conflito com as porções conflitantes. -É recomendável não versionar estes arquivos de _backup_. Podemos -então simplesmente exluÃ-los ou ignorá-los após a mesclagem adicionando -arquivos com esta extensão no `.gitignore`. Outra forma de manter seu -repositório sem os arquivos _backup_ é configurando sua `mergetool` para -não armazená-los, ou seja, que a própria ferramenta os descarte quando a -mesclagem for bem sucedida. Isso pode ser configurado com: +`.orig`. Perceba no _output_ gerado pelo `git status` que estes +armazenam o conteúdo de cada arquivo em conflito com as porções +conflitantes. É recomendável não versionar estes arquivos de +_backup_. Podemos então simplesmente excluÃ-los ou ignorá-los após a +mesclagem adicionando arquivos com esta extensão no `.gitignore`. Outra +forma de manter seu repositório sem os arquivos _backup_ é configurando +sua `mergetool` para não armazená-los, ou seja, que a própria ferramenta +os descarte quando a mesclagem for bem sucedida. Isso pode ser +configurado com: ```{r, engine="bash", eval=FALSE} ## Configura a ferramenta de merge para não criar os backups @@ -697,15 +697,16 @@ Para Windows deve-se informar o caminho para o arquivo executável, `path`, além de definir as três versões que serão exibidas `$LOCAL`, `$BASE` e `$REMOTE` conforme vimos na figura \ref{fig:meld4}. Ainda a opção `--output=$MERGED`, para informar que o arquivo a ser editado será -sobrescrito sob a versão `$MERGED`, que é criada automaticamente -pelo Git quando há conflitos. +sobrescrito sob a versão `$MERGED`, que é criada automaticamente pelo +Git quando há conflitos. Alternativamente pode-se editar o arquivo `.gitconfig` com as mesmas informações passadas ao comando `git config`. Para verificar como -altera-se esse arquivo, abra-o após avaliar os comandos descritos. Ainda, -se desejado que essas opções sejam válidas para todos os projetos Git de -seu computador, a opção `--global` em `git config` pode ser -utilizada. Assim, quando avaliados os comandos `git mergetool` e `git difftool`, o programa `meld` será lançado automaticamente. +altera-se esse arquivo, abra-o após avaliar os comandos +descritos. Ainda, se desejado que essas opções sejam válidas para todos +os projetos Git de seu computador, a opção `--global` em `git config` +pode ser utilizada. Assim, quando avaliados os comandos `git mergetool` +e `git difftool`, o programa `meld` será lançado automaticamente. Com isso, já temos nosso **Git** devidamente configurado para utilizar o programada `meld` e já observamos sua relevância quando se trabalha com @@ -713,12 +714,12 @@ arquivos versionados. Mas ainda, apresentamos somente uma das várias interfaces que se dispõem a facilitar a visualização de diferenças e mesclagem de arquivos. Podemos citar as interfaces `kdiff3`\footnote{DisponÃvel para \textit{download} em -\url{http://kdiff3.sourceforge.net/}} e -`P4Merge`\footnote{DisponÃvel para \textit{download} em -\url{https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools}}, +\url{http://kdiff3.sourceforge.net/}} e `P4Merge`\footnote{DisponÃvel +para \textit{download} em +\url{https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools}}, como outras interfaces de comparação bastante utilizadas em projetos versionados. Em geral, todos estes programas seguem o mesmo estilo de -exbição de arquivos que o `meld` e as configurações para torná-los +exibição de arquivos que o `meld` e as configurações para torná-los programas de `mergetool` e `difftoll` padrão são as mesmas. É importante salientar que as ferramentas gráficas apresentadas neste diff --git a/cap06.md b/cap06.md deleted file mode 100644 index 7a491c791e0d139c5d3d23aa985735dc3ac62200..0000000000000000000000000000000000000000 --- a/cap06.md +++ /dev/null @@ -1,322 +0,0 @@ -# Ferramentas Gráficas -PET EstatÃstica UFPR - - - -# Ferramentas gráficas # - -No GIT, como vimos até agora, todo o gerenciamento do projeto é -realizado via *CLI (Command line interface)*, linhas de comando -interpretadas, geralmente pelo *bash*. Isso confere um maior controle e -segurança nas ações realizadas, mas em muitas situações os comandos e -*outpus* GIT não se apresentam de forma tão amigável seja pela difÃcil -memorização ou pela interatividade limitada. - -Os comandos mais usuais como `git add`, `git commit` se tornam simples, -pois, mesmo para um usuário iniciante eles fazem parte do cotidiano em -um projeto sob versionamento GIT. Mas algumas situações que não ocorrem -com frequência, como por exemplo voltar a versão de um arquivo ou do -repositório, requerem comandos que são pouco utilizados e para realizá-las -é necessário a consulta de algum material sobre GIT. Outra situação onde -a utilização dos comandos é dificultada, ocorre para projetos maiores, onde -muitos arquivos são alterados simultaneamente e o procedimento de *commit* -se torna trabalhoso, pois é necessário listar todos os arquivos que fazem -parte de um *commit* no commando `git add`. Uma última situação exemplo -em que o uso de *CLI* não parece satisfatório é na comparação de arquivos, -já usamos o comando `git diff` no capÃtulo 3 e o *output* deste comando -foi de simples visualização, mas em arquivos maiores (com muitas linhas) -a navegação para verificar as alterações do arquivo não é tão amigável. Para -facilitar essas e outras situações surgem as *GUI's (Graphical User -Interfaces)*, interfaces gráficas para o usuário que incorpora comandos -GIT em *widgets*(botões, caixas de texto etc.) dispostos em uma janela -gráfica de seu sistema operacional. - - -# Interfaces GIT # - -Neste material chamaremos de **Interfaces GIT** as *GUI's* para gestão -de um repositório. Estas facilitam a utilização das principais -instruções **GIT** (`git add`, `git commit`, `git push`, `git pull`), -visualização dos arquivos e alterações no repositório. - -Desde o surgimento do GIT diversas *GUI's* foram propostas. Neste -capÃtulo apresentamos as principais *GUI's* em diferentes plataformas nos -sistemas UNIX, Mac OS X e Windows. Detalhes de download, instalação e -exemplos da utilização destas interfaces no fluxo de trabalho de um -projeto com versionamento **GIT** são descritos. - -## git-gui ## - -Baseada em *Tcl/Tk* a *GUI* chamada `git gui` é mantida como projeto -independente do GIT, mas as versões estáveis são distribuÃdas junto com -o programa principal, portanto não é necessário o download e -instalação. A interface é voltada para realizar alterações no -repositório, desde as mais simples como *commitar* arquivos até as mais -especÃficas como voltar estágios ou reescrever o último *commit* (muito -útil quando notamos erros de gramática logo após a submissão). Nesta -seção abordaremos apenas as alterações mais comuns no repositório. - -`git gui`, no Windows, pode ser aberto pelo menu iniciar. Nesta -plataforma, ao instalar o GIT (conforme visto no capÃtulo 2) duas -aplicações ficam disponÃveis **git BASH** e **git GUI**. Em sistemas -LINUX podemos criar um *alias* (criar e editar adequadamente um -arquivo em */usr/share/applications*) para que a `git gui` fique listada -junto as aplicações do sistema. --Descobrir no MAC se `git gui` fica no -lançador automaticamente. Porém, de forma geral, independente da -plataforma de trabalho, a `git gui` pode ser iniciada a partir de um -terminal `bash`, com o comando: - -```sh -git gui -``` - -Para exemplificar a utilização desta interface vamos alterar alguns -arquivos do repositório `meu1repo`, criado no capÃtulo 3. - - - - -```bash -cd meu1repo/ - -echo $(tr '[[:lower:][:upper:]]' '[[:upper:][:lower:]]' < README) > README - -echo "Lista de afazeres: -------------------------------------------- -* tarefa 1 -* tarefa 2 -* tarefa 3 -* tarefa 4 -* tarefa 5 -* tarefa 6" > TODO.txt - -echo " -Mais um arquivo criado" > OTHER.txt -``` - -Após as alterações a interface gráfica é chamada. - - -FIGURA: Inteface `git gui` - -A interface `git gui` se apresenta de forma simples, o que facilita -sua utilização. Na figura ?? detacamos as quatro áreas que compreendem a -interface. Na primeira porção temos listados os arquivos presentes no -*working directory*, os arquivos criados aparecem com Ãcone em branco e -os modificados com linhas em azul, aqui a interface implementa -interativamente o comando `git add`, pois ao clicar no Ãcone de um -arquivo ele é automaticamente adicionado à *staging area*. Na segunda -parte são listados os arquivos na *staging area* com Ãcone de *check -mark*. Na terceira parte temos a implementação do comando -`git diff` para qualquer arquivo selecionado. Com destaque de cores, a -interface apresenta em vermelho as deleções e em verde as adições. Por fim -temos no canto inferior direito a área para escrever *commits* com -botões para submissão de ação. Um detalhe importante do `git gui` é que -o idioma do sistema operacional é verificado para sua construção, ou -seja, os botões da interface na figura ?? são *push*, *commit*, *sign -off*, etc pois o idioma do sistema operacional em que essa interface foi -executada é o inglês. Para português (Brasil) as mensagens ficam ..... - -Além das quatro áreas principais da interface, que facilitam -interativamente atividades como `git status`, `git diff`, `git add`, -`git commit` e `git push`, temos mais implementações no menu da -interface para procedimentos não cotidianos. Essas implementações podem -ser acessadas com um simples clique e são auto-explicativas. - -## gitk ## - -Pioneira dentre as interfaces gráficas, `gitk` foi a primeira -*GUI* implementada. Também implementada em *Tcl/Tk*, esta *GUI* -tem como objetivo a apresentação do histórico de um projeto. A `gitk` -é incorporada ao principal repositório do GIT, portanto nas instalações -completas do GIT esta interface fica disponÃvel sem ser necessário -download e instalação. Nesta seção apresentamos a `gitk` detalhando a -disposição dos elementos nesta interface que se mostra muito útil na -visualização de projetos GIT. - -A `gitk` trabalha em conjunto com a `git gui`. Em `git gui` podemos fazer -alterações de forma rápida e visual nos arquivos que estão na *staging -area* e *working directory*, porém para visualizar o histórico completo -de *commits* com ramificações, marcações e demais detalhes, recorremos -à `gitk`. Essa interface se mostra muito útil também como ferramenta de -aprendizagem GIT, uma vez que visualizar de forma gráfica as alterações -que os comandos realizados causam no projeto, torna mais fácil a -compreensão dos mesmos. - -`gitk`, assim como a `git gui` pode ser chamada atráves de linha de -comando: - -```sh -gitk -``` - -Para exemplificar a disposição dos elementos nesta interface, seguimos -com as alterações feitas na seção anterior, lembrando que temos todas as -alterações já realizadas no capÃtulo 3 e ainda duas modificações e uma -inclusão de arquivos não *commitadas*. Visualizando a interface `gitk` -chamada neste estado do repositório temos: - - -FIGURA: Inteface `gitk` - -Perceba na figura ?? que esta interface é bem mais completa do que a `git -gui` no que diz respeito à informação. Dividida em apenas duas partes, a -`gitk` apresenta na primeira todo o histórico do projeto, é uma -implementação visual e agradável do comando `git log --graph`. No -gráfico apresentado na parte superior, as bolinhas azuis representam -*commits* passados, a de amarelo indica o estado atual do repositório e -em vermelho são asmodificações no *working directory*. Ao lado estão os -autores dos respectivos *commits* e o momento em que foram feitos. Na parte -inferior da interface temos o detalhamento do *commit* selecionado -na parte superior. As informações contidas aqui vão desde o -identificador do *commit* (*SHA1 ID*), diferença das modificações -referenciadas por este *commit* com relação ao estado anterior do -repositório até a listagem dos arquivos atingidos pelo *commit* -selecionado. - -Além da excelente apresentação visual do repositório GIT, a interface -`gitk` também permite algumas alterações. Clicando com o botão direito de -seu *mouse* em qualquer *commit* listado podemos criar *tags*, reverter o -repositório neste estado, criar um ramo a partir do *commit* dentre outras -opções possÃveis atráves da interface. - -`gitk` é uma implementação em *Tcl/Tk* para visualização de repositórios -GIT. Com o mesmo objetivo outras interfaces gráficas foram -implementadas. - - -Podemos destacar duas delas pela grande similaridade à -`gitk`, são elas `gitg` e `gitx`. Ambas podem ser instalar em: - -* https://git-scm.com/docs/gitk -* https://lostechies.com/joshuaflanagan/2010/09/03/use-gitk-to-understand-git/ - -## Outras Interfaces ## - -### gitg e gitx ### - -Estas duas interfaces tentam juntar em uma única as opções proporcionadas -pela `git gui` e pela `gitk`. Os layouts e as propostas são similares, a -diferença está na portabilidade. -A `gitg` é implementada em *GTk+* e está disponÃvel para sistemas LINUX e a -`gitx` foi implementada para Mac OS seguindo o estilo de aplicativos -deste sistema operacional. De forma geral não há detalhes a serem -repassados sobre estas interfaces uma vez que as possibilidades já foram -listadas nas seções sobre `git gui` e `gitk` - - -FIGURA: Interface `gitg` - - -FIGURA: Interface `gitx` - -### RabbitVCS ### - -*RabbitVCS* é uma coleção de ferramentas gráficas para navegadores de - arquivos do sistema LINUX que permitem o acesso simples e direto aos - sistemas de controle de versão GIT e/ou Subversion. Não se caracteriza - como interface, porém altera a visualização no navegador de arquivos de - diretórios sob versionamento GIT além de dispor de ações implementadas - nas opções do menu quando pressionado o botão direito do mouse. - - -FIGURA: Navegador *Nautilus* com uso do `RabbitVCS` - -Na figura ?? temos o *screenshot* do repositório `meu1repo` no navegor -de arquivos `nautilus` (padrão do sistema Ubuntu 14.04). Perceba que com -essa interface os Ãcones de arquivos e pastas no navegador ganham -destaque com um outro pequeno Ãcone na paste inferior. Estes pequenos -Ãcones indicam o estado do arquivo sem precisar recorrer ao terminal, ou -seja, temos um `git status` no próprio navegador de arquivos. Além disso -`RabbitVCS` complementa o menu de opções acessados com o botão direito -do mouse. As opções implementadas neste menu são completas, vão -desde *commits*, criação de *branchs* e *tags* até a ações de -reverter o estado do repositório. - -### git-cola ### - -Esta também é uma interface alternativa que se destaca por ser completa -e pela portabilidade (disponÃvel para sistema LINUX, Windows e -Mac). Implementada em *python*, `git-cola` é uma alternativa à `git gui` -e contém praticamente os mesmos elementos para alterações no -repositório. Como a `git gui` se auxilia da `gitk` para visualização, -a `git-cola` também tem uma interface de apoio, chamada de `git-dag` que -vem instalado junto ao `git-cola`. - - -FIGURA: Interface `git-cola` e `git-dag` - -Perceba pela figura ?? que as opções das interfaces são similares -as apresentadas em `git gui` e `gitk`. As interfaces `git-cola` e -`git-dag` se destacam pela fácil manipulação do layout exibido, além de -buscar deixar a interface mais intuitiva possÃvel. Como destaque em -implementação de funcionalidade GIT, a `git-cola` se sobressai com relação -à `git gui` na possibilidade de execução do comando `git rebase` via -interface. - -### Plugins e extensões para editores ### - -Muitas vezes é inconveniente trabalhar com códigos fonte em um editor e -ter que abrir um terminal *bash* em outra janela do sistema operacional -para verificar o sistema de versionamento, realizar commits, -etc. Felizmente alguns editores possuem um sistema **GIT** integrado, -seja por meio de *plugins* adicionais instalados ou pela opção nativa do -editor. - -Destacamos aqui dois editores, comumente utilizados pela comunidade -estatÃstica, que possuem os comandos **GIT** intergrado à sua -interface. São eles, o `emacs`, o qual temos as opções de *buffers* nos -editores onde podemos abrir uma instância *shell* e executar os comandos -**GIT** junto com o desenvolvimento do código fonte. Além disso uma -extensão poderosa chamada `magit`[^magit] está disponÃvel e em -desenvolvimento para o **GIT** no `emacs`, esta extensão proporciona -opções de comandos e visualização em um *buffer* do editor que facilita -o trabalho de versionamento. Outro editor também muito utilizado em -EstatÃstica, talvez o mais utilizado pela comunidade, é o RStudio que -também implementa em sua interface vários comandos, assim como as -interfaces anteriormente descritas e para tarefas não triviais uma -chamada do terminal *Shell* é possÃvel dentro do aplicativo. As diversas -ferramentas do editor RStudio serão exploradas no capÃtulo ??, com -exemplos e ilustrações voltadas para a comunidade estatÃstica. - -# Interfaces de comparação # - -Uma das principais vantagens do **GIT** é a possibilidade de trabalho -paralelo por dois ou mais usuários ou por ramos de desenvolvimento. E -como qualquer desenvolvimento paralelo, desejamos ao final do trabalho, -mesclar as contribuições realizadas lado a lado. Como vimos no capÃtulo -3 isso é feito através do comando `git merge ramo_desenvolvimento` para ramos -locais e com o comando `git push origin` quando estamos trabalhando em -equipe e as contribuições são enviadas para um servidor remoto, capÃtulo -4. Porém, quando a mesma porção de um mesmo arquivo é alterada em duas -instâncias distintas (ramos diferentes, usuários diferentes etc.) ocorrem -conflitos e vimos como o **GIT** os sinaliza para que possamos resolvê-los. -Nesta seção mostraremos as interfaces gráficas dedicadas à resolução de -conflitos no mesclagem e a visualização da diferença de arquivos em -estados diferentes do repositório. - -## Ferramentas de Comparação Padrão ## - -* meld - + Download e Instalação - + Utilização básica - + Utilização no **GIT** como `difftool` e/ou `mergetool` - + screenshots - -* kdiff3 - + Download e Instalação - + Utilização básica - + Utilização no **GIT** como `difftool` e/ou `mergetool` - + screenshots - -## Outras interfaces ## - -* P4Merge - -Citar materiais de referência para instalação e -utilização. - -<!-- Exclui o repositório criado para exemplicação --> - - -[^magit]: http://magit.vc/ diff --git a/cap06.pdf b/cap06.pdf deleted file mode 100644 index 3e2d3f85f130495844e4cc2232a70b7ddd7b796d..0000000000000000000000000000000000000000 Binary files a/cap06.pdf and /dev/null differ diff --git a/cap07.Rmd b/cap07.Rmd index f55fe7d6d503ed550070e3e37578e0c8ac19144f..8dd75699910313813526bc88d0cef5213d89008f 100644 --- a/cap07.Rmd +++ b/cap07.Rmd @@ -2,10 +2,11 @@ title: "Trabalhando em equipe" author: "PET-EstatÃstica UFPR" graphics: yes -header-includes: \usepackage{wrapfig} +header-includes: + \usepackage{wrapfig} output: pdf_document: - template: template.tex + template: highlight: default toc: true toc_depth: 2 @@ -17,176 +18,159 @@ output: library(knitr) opts_chunk$set(comment=NA) ``` ---- - -\chapter{Trabalhando em equipe} -O Git é uma ferramenta que aliada a outros serviços web, como GitLab ou -GitHub, oferece funcionalidade e autonomia para se trabalhar. -Contudo, com tantos recursos disponÃveis, só serão bem aplicados quando -todos os membros do grupo, além de conhecê-los, trabalham em harmonia. +O Git é uma ferramenta que aliada a outros serviços web, como GitLab ou +GitHub, oferece funcionalidade e autonomia para se trabalhar. Contudo, +com tantos recursos disponÃveis, só serão bem aplicados quando todos os +membros do grupo, além de conhecê-los, trabalham em harmonia. -## Boas práticas de colaboração +# Boas práticas de colaboração -Repositório é onde são armazenados os arquivos de um projeto. Existem +Repositório é onde são armazenados os arquivos de um projeto. Existem três nÃveis de acesso permitidos: -- **Private**: é o repositório fechado, onde apenas o criador (Owner) tem -permissão de leitura e escrita. Se um repositório privado for criado -dentro de um grupo, todos do grupo terão permissão de leitura e escrita. - - -- **Internal** repositório fechado para usuários externos ao -grupo, mas qualquer usuário cadastrado no grupo terá permissão de leitura -e escrita no repositório. - - -- **Public**: repositório aberto, -visÃvel para qualquer pessoa (usuário do grupo ou não). Usuários do grupo -tem permissão de leitura e escrita no repositório. Usuários sem conta -no grupo podem clonar o repositório, mas não tem permissão para alterar -o repositório (enviar merge requests por exemplo). - - -É possÃvel adicionar usuários para colaborar em um repositório. Cada + - **Private**: é o repositório fechado, onde apenas o criador (Owner) + tem permissão de leitura e escrita. Se um repositório privado for + criado dentro de um grupo, todos do grupo terão permissão de leitura + e escrita. + - **Internal** repositório fechado para usuários externos ao grupo, + mas qualquer usuário cadastrado no grupo terá permissão de leitura e + escrita no repositório. + - **Public**: repositório aberto, visÃvel para qualquer pessoa + (usuário do grupo ou não). Usuários do grupo tem permissão de + leitura e escrita no repositório. Usuários sem conta no grupo podem + clonar o repositório, mas não tem permissão para alterar o + repositório (enviar merge requests por exemplo). + +É possÃvel adicionar usuários para colaborar em um repositório. Cada usuário pode ter um nÃvel de acesso diferente: **Guest**, **Reporter**, -**Developer**, **Master**. Em permissões \footnote{\url{https://gitlab.c3sl.ufpr.br/help/permissions/permissions}} +**Developer**, **Master**. Em permissões +\footnote{\url{https://gitlab.c3sl.ufpr.br/help/permissions/permissions}} é possÃvel visualizar as habilidades concedidas para cada nÃvel. - -Logo após criar um novo repositório, é recomendável que se crie um arquivo -`README.md`. Independente da forma como o repositório foi configurado, -é sempre fundamental que ele contenha o arquivo `README.md`. -Este arquivo é sempre o primeiro a ser mostrado na página inicial -de todo repositório. Por esse motivo, é importante que o `README.md` -contenha no mÃnimo: - -- Uma descrição geral do projeto; -- Os nomes dos autores do projeto; -- Instruções de instalação, no caso de softwares; -- A licença do projeto (especialmente para projetos públicos), ou uma -orientação sobre o uso do projeto (permissão, citação, entre outros). -Opcionalmente pode-se criar um arquivo *LICENSE* com a licença. -Esse arquivo ficará disponÃvel também em uma aba na página inicial do -projeto. -- (**Opcional**): um guia de contribuição, se o (Owner) do projeto pretende que -usuários externos colaborem, é possÃvel apresentar algumas orientações básicas -sobre como colaborar. Criando um arquivo `CONTRIBUTING.md` com este guia, -ele será automaticamente colocado em uma aba na página inicial do projeto. -- (**Opcional**): um *changelog* para que sejam registradas as modificações -realizadas entre uma versão e outra (principalmente para softwares). -Criando esse arquivo com estas informações, ele aparecerá automaticamente -em uma aba na página inicial do projeto. - -Outra parte fundamental do git, são os **commits**. Além de salvarem as -alterações realizadas nos arquivos, também são responsáveis por documentar -as alterações feitas por qualquer usuário e em qualquer arquivo. -Os commits agilizam o processo de revisão do projeto, e poderá ajudar -futuros mantenedores do projeto a desvendar o motivo de algum acréscimo -ou modificação no código. Por causa dessas importâncias, uma mensagem bem -escrita é a melhor forma de se comunicar a alteração para os demais membros -do grupo e para você mesmo. Essas mensagens também aparecerão no `git log` -do projeto,por isso é essencial que sejam bem escritas, de forma clara e -sigam um padrão. - -Algumas **regras de ouro**, que são convenções gerais, para que um projeto -versionado com git seja bem sucedido são: - -- **Faça commits regularmente**: isso faz com que as mudanças de código -entre um commit e outro sejam menores, tornando mais fácil para todos -acompanhar as alterações; - -- **Não faça commits de trabalhos pela metade**: faça um commit apenas -quando tiver finalizado o que estava propondo. Isso irá forçar você a -deixar o trabalho em pedaços menores, e por consequência realizar -commits regularmente; - -- **Teste antes de fazer um commit**: resista à tentação de fazer um commit -que você pensa que está completo. Teste toda a sua realização para -ter certeza de que não causará um efeito colateral no projeto; - -- **Escreva boas mensagens de commit**: seja claro e objetivo ao escrever -as mensagens de commit. No entanto, tome cuidado para não ser vago, ou -escrever apenas `mudança`, `mais mudanças`, etc. Se uma mensagem curta for suficiente, use `git commit -m 'Mensagem'`, mas lembre-se de ser -informativo sobre a alteração realizada, para ser útil para todos do -projeto. - -Existem outras convenções estabelecidas sobre como escrever mensagens -de commit contextualizadas, baseadas nas mensagens geradas por mensagens -de funções do próprio git. Estas convenções podem resumidas nas 7 regras +Logo após criar um novo repositório, é recomendável que se crie um +arquivo `README.md`. Independente da forma como o repositório foi +configurado, é sempre fundamental que ele contenha o arquivo +`README.md`. Este arquivo é sempre o primeiro a ser mostrado na página +inicial de todo repositório. Por esse motivo, é importante que o +`README.md` contenha no mÃnimo: + + - Uma descrição geral do projeto; + - Os nomes dos autores do projeto; + - Instruções de instalação, no caso de softwares; + - A licença do projeto (especialmente para projetos públicos), ou uma + orientação sobre o uso do projeto (permissão, citação, entre + outros). Opcionalmente pode-se criar um arquivo *LICENSE* com a + licença. Esse arquivo ficará disponÃvel também em uma aba na página + inicial do projeto. + - (**Opcional**): um guia de contribuição, se o (Owner) do projeto + pretende que usuários externos colaborem, é possÃvel apresentar + algumas orientações básicas sobre como colaborar. Criando um arquivo + `CONTRIBUTING.md` com este guia, ele será automaticamente colocado + em uma aba na página inicial do projeto. + - (**Opcional**): um *changelog* para que sejam registradas as + modificações realizadas entre uma versão e outra (principalmente + para softwares). Criando esse arquivo com estas informações, ele + aparecerá automaticamente em uma aba na página inicial do projeto. + +Outra parte fundamental do Git, são os **commits**. Além de salvarem as +alterações realizadas nos arquivos, também são responsáveis por +documentar as alterações feitas por qualquer usuário e em qualquer +arquivo. Os commits agilizam o processo de revisão do projeto, e poderá +ajudar futuros mantenedores do projeto a desvendar o motivo de algum +acréscimo ou modificação no código. Por causa dessas importâncias, uma +mensagem bem escrita é a melhor forma de se comunicar a alteração para +os demais membros do grupo e para você mesmo. Essas mensagens também +aparecerão no `git log` do projeto,por isso é essencial que sejam bem +escritas, de forma clara e sigam um padrão. + +Algumas **regras de ouro**, que são convenções gerais, para que um +projeto versionado com Git seja bem sucedido são: + + - **Faça commits regularmente**: isso faz com que as mudanças de + código entre um commit e outro sejam menores, tornando mais fácil + para todos acompanhar as alterações; + - **Não faça commits de trabalhos pela metade**: faça um commit apenas + quando tiver finalizado o que estava propondo. Isso irá forçar você + a deixar o trabalho em pedaços menores, e por consequência realizar + commits regularmente; + - **Teste antes de fazer um commit**: resista à tentação de fazer um + commit que você pensa que está completo. Teste toda a sua realização + para ter certeza de que não causará um efeito colateral no projeto; + - **Escreva boas mensagens de commit**: seja claro e objetivo ao + escrever as mensagens de commit. No entanto, tome cuidado para não + ser vago, ou escrever apenas `mudança`, `mais mudanças`, etc. Se uma + mensagem curta for suficiente, use `git commit -m 'Mensagem'`, mas + lembre-se de ser informativo sobre a alteração realizada, para ser + útil para todos do projeto. + +Existem outras convenções estabelecidas sobre como escrever mensagens de +commit contextualizadas, baseadas nas mensagens geradas por mensagens de +funções do próprio Git. Estas convenções podem resumidas nas 7 regras que são convenções globais: -1.**Separe o tÃtulo do corpo do texto com uma linha em branco**: por padrão, -a primeira linha é o tÃtulo do commit, e deve ser uma mensagem curta. -Ao deixar uma linha em branco, é permitido escrever uma mensagem de -qualquer tamanho, detalhando melhor as modificações feitas. -Dessa forma, quando `git log` for executado, toda a mensagem de commit -aparecerá, enquanto que `git log --oneline` mostrará apenas o tÃtulo do -commit. - -2.**Limite a linha de tÃtulo em 50 caracteres**: isso faz com que o -colaborador pense mais para escrever uma mensagem mais informativa. -Se a mensagem for uma única linha (`git commit -m`), então esse limite -pode se estender para 72 caracteres. - -3.**Capitalize a mensagem**: em todas as mensagens de commit comece com -letra maiúscula, tanto se for tÃtulo, corpo da mensagem, ou apenas -uma mensagem de uma única linha. - -4.**Não termine os commits com ponto**: principalmente se for o tÃtulo -de uma mensagem de commit mais longa. Espaço é valioso quando dispomos apenas -de 50 ou 72 caracteres. - -5.**Use o modo imperativo**: no tÃtulo de commits longos ou em mensagens -de commits únicas. O modo imperativo significa escrever como se estivesse -dando um comando a alguém. Seja direto e objetivo, e escreva no presente. -Exemplos de mensagens no impertativo: -```sh -- Adiciona versão final - -- Altera parágrafo da introdução - -- Remove funções precipitadas -``` - -Algumas mensagens no modo **não** imperativo são: -```sh -- Corrigindo o erro - -- Mudando a função - -- Mais correções para mais funções -``` - - -6.**Limite o corpo da mensagem em 72 caracteres**: ao escrever uma mensagem -de commit mais longa, devemos manter o corpo da mensagem com no máximo -72 carateres. - - -7.**Use o corpo da mensagem para explicar "o que" e "porque", e não "como"**: contextualize o que você fez e o motivo. Na maioria dos casos você pode -deixar de fora como você fez as modificações, pois o código alterado será auto-explicativo. + 1. **Separe o tÃtulo do corpo do texto com uma linha em branco**: por + padrão, a primeira linha é o tÃtulo do commit, e deve ser uma + mensagem curta. Ao deixar uma linha em branco, é permitido + escrever uma mensagem de qualquer tamanho, detalhando melhor as + modificações feitas. Dessa forma, quando `git log` for executado, + toda a mensagem de commit aparecerá, enquanto que `git log + --oneline` mostrará apenas o tÃtulo do commit. + 2. **Limite a linha de tÃtulo em 50 caracteres**: isso faz com que o + colaborador pense mais para escrever uma mensagem mais informativa. + Se a mensagem for uma única linha (`git commit -m`), então esse + limite pode se estender para 72 caracteres. + 3. **Capitalize a mensagem**: em todas as mensagens de commit comece + com letra maiúscula, tanto se for tÃtulo, corpo da mensagem, ou + apenas uma mensagem de uma única linha. + 4. **Não termine os commits com ponto**: principalmente se for o + tÃtulo de uma mensagem de commit mais longa. Espaço é valioso + quando dispomos apenas de 50 ou 72 caracteres. + 5. **Use o modo imperativo**: no tÃtulo de commits longos ou em + mensagens de commits únicas. O modo imperativo significa escrever + como se estivesse dando um comando a alguém. Seja direto e + objetivo, e escreva no presente. Exemplos de mensagens no + imperativo: + + + - Adiciona versão final + - Altera parágrafo da introdução + - Remove funções precipitadas + + Algumas mensagens no modo **não** imperativo são: + + - Corrigindo o erro + - Mudando a função + - Mais correções para mais funções + + 6. **Limite o corpo da mensagem em 72 caracteres**: ao escrever uma + mensagem de commit mais longa, devemos manter o corpo da mensagem + com no máximo 72 caracteres. + 7. **Use o corpo da mensagem para explicar "o que" e "porque", e não + "como"**: contextualize o que você fez e o motivo. Na maioria dos + casos você pode deixar de fora como você fez as modificações, pois + o código alterado será auto-explicativo. + +# Modelos de fluxos de trabalho # + +A escolha do *workflow* (fluxo de trabalho) depende de cada projeto e +das preferências pessoais. Podemos utilizar as informações sobre cada +*workflow*, e decidir qual é mais adequado para cada projeto. Existem +quatro maneiras principais de trabalhar em colaboração com o Git e o +GitLab: + +## Centralized workflow ## + +Recomendado para projetos pequenos, e/ou que não necessitam de muitas +alterações. Nesse workflow, o repositório possui apenas um branch +(`master`) e as alterações são feitas nesse branch. As revisões só +poderão ser realizadas depois que tudo foi enviado para o servidor +remoto. Com isso, há uma grande chance de ocorrerem conflitos. +**Exemplo** -## Modelos de fluxos de trabalho - -A escolha do *workflow* (fluxo de trabalho) depende de cada projeto e -das preferências pessoais. Podemos utilizar as informações sobre cada -*workflow*, e decidir qual é mais adequado para cada projeto. Existem -quatro maneiras principais de trabalhar em colaboração com o git e o GitLab: - -- **Centralized workflow**: -recomendado para projetos pequenos, e/ou que não necessitam de muitas -alterações. Nesse workflow, o repositório possui apenas um branch (`master`) -e as alterações são feitas nesse branch. As revisões só poderão ser -realizadas depois que tudo foi enviado para o servidor remoto. Com isso, -há uma grande chance de ocorrerem conflitos. - - - **Exemplo** - -Após iniciar um repositório central, os colaboradores devem clonar -o repositório. +Após iniciar um repositório central, os colaboradores devem clonar o +repositório. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -195,20 +179,21 @@ o repositório. \caption{Colaboradores clonando o repositório central.} \end{wrapfigure} -Depois de um colaborador terminar seu trabalho remotamente, ele publica -as modificações para o repositório central, para que os demais membros +Depois de um colaborador terminar seu trabalho remotamente, ele publica +as modificações para o repositório central, para que os demais membros possam ter acesso. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} \includegraphics[width=3cm]{./images/traba-central-2.png} \end{center} - \caption{Colaborador publicando as modificações no repositório central.} + \caption{Colaborador publicando as modificações no repositório + central.} \end{wrapfigure} -Outro membro também termina seu trabalho e resolve publicar no repositório -central, porém não conseguirá. O repositório central está diferente do seu -repositório local. +Outro membro também termina seu trabalho e resolve publicar no +repositório central, porém não conseguirá. O repositório central está +diferente do seu repositório local. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -218,8 +203,8 @@ repositório local. repositório central.} \end{wrapfigure} -Para conseguir enviar as modificações realizadas, o colaborador precisa -puxar as atualizações feitas para o seu repositório, integrá-los com as +Para conseguir enviar as modificações realizadas, o colaborador precisa +puxar as atualizações feitas para o seu repositório, integrá-los com as suas alterações locais, e em seguida, tentar novamente. \begin{wrapfigure}{r}{0.4\textwidth} @@ -229,7 +214,6 @@ suas alterações locais, e em seguida, tentar novamente. \caption{Colaborador puxando as modificações do repositório central.} \end{wrapfigure} - Após feito isso, será possÃvel o colaborador fazer as modificações. \begin{wrapfigure}{r}{0.4\textwidth} @@ -239,26 +223,25 @@ Após feito isso, será possÃvel o colaborador fazer as modificações. \caption{Colaborador publica modificações do repositório central.} \end{wrapfigure} +## Feature branch workflow ## -- **Feature branch workflow**: -recomendado para projetos pequenos e grandes, que envolvam mais de um -colaborador. O projeto principal é mantido no branch master. Se um membro -quiser realizar alguma alteração, deverá criar um novo branch `feature`, -e fazer as alterações nesse branch e sugerir um `merge request`. Com isso, -os demais colaboradores poderão revisar as alterações sugeridas e discutir -as modificações, até que uma pessoa habilitada faça o merge desse branch -`freature` para o branch `master`. +Recomendado para projetos pequenos e grandes, que envolvam mais de um +colaborador. O projeto principal é mantido no branch master. Se um +membro quiser realizar alguma alteração, deverá criar um novo branch +`feature`, e fazer as alterações nesse branch e sugerir um `merge +request`. Com isso, os demais colaboradores poderão revisar as +alterações sugeridas e discutir as modificações, até que uma pessoa +habilitada faça o merge desse branch `freature` para o branch `master`. -Dessa forma, evita-se os possÃveis conflitos e garante que tais alterações -não causaram algum problema. Esse workflow é altamente recomendado por -ser simples de gerenciar, evitar grandes conflitos, e ser relativamente -fácil para usuários novos do git. +Dessa forma, evita-se os possÃveis conflitos e garante que tais +alterações não causaram algum problema. Esse workflow é altamente +recomendado por ser simples de gerenciar, evitar grandes conflitos, e +ser relativamente fácil para usuários novos do Git. +**Exemplo** - **Exemplo** - -Antes de começar a desenvolver um recurso, é preciso criar um ramo isolado -para trabalhar. +Antes de começar a desenvolver um recurso, é preciso criar um ramo +isolado para trabalhar. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -267,22 +250,22 @@ para trabalhar. \caption{Criando um novo ramo para o trabalho.} \end{wrapfigure} -Com isso, o membro poderá iniciar o seu trabalho, e realizar o que for -necessário nesse ramo (branch). O colaborador, após finalizar o projeto, -irá requirir um `merge request` para que as alterações feitas nesse branch, -sejam incorporadas no `master`. Os demais membros, poderão avaliar se -tais modificações são pertinentes para o projeto. +Com isso, o membro poderá iniciar o seu trabalho, e realizar o que for +necessário nesse ramo (branch). O colaborador, após finalizar o projeto, +irá requirir um `merge request` para que as alterações feitas nesse +branch, sejam incorporadas no `master`. Os demais membros, poderão +avaliar se tais modificações são pertinentes para o projeto. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} \includegraphics[width=3cm]{./images/traba-feature-2.png} \end{center} - \caption{Colaborador solicita merge, e aguarda revisão dos colaboradores.} + \caption{Colaborador solicita merge, e aguarda revisão dos + colaboradores.} \end{wrapfigure} - -Quando as alterações sugeridas para o colaborador forem incorporadas -o branch poderá ser movido para o `master`. +Quando as alterações sugeridas para o colaborador forem incorporadas o +branch poderá ser movido para o `master`. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -291,20 +274,20 @@ o branch poderá ser movido para o `master`. \caption{Movendo ramo para o master.} \end{wrapfigure} +## Gitflow workflow ## -- **Gitflow workflow**: -indicado para projetos maiores e/ou com um grande número de colaboradores. -Esse workflow envolve a criação de alguns branches com funções especÃficas. -Todo o desenvolvimento é realizado no branch `develop`. Quando uma versão -está pronta, ela é movida para o branch `release`, onde é testada e -finalmente incorporada ao ramo master, que contém apenas versões finais -(estáveis). É extremamente recomendado esse workflow para desenvolvimento -de softwares, porém exige de mais familiaridade com o git. Permite, por -exemplo, que os usuários de um software, instalem tanto uma versão estável -(do branch `master`) quanto uma versão em desenvolvimento -(do branch `develop`). +Indicado para projetos maiores e/ou com um grande número de +colaboradores. Esse workflow envolve a criação de alguns branches com +funções especÃficas. Todo o desenvolvimento é realizado no branch +`develop`. Quando uma versão está pronta, ela é movida para o branch +`release`, onde é testada e finalmente incorporada ao ramo master, que +contém apenas versões finais (estáveis). É extremamente recomendado esse +workflow para desenvolvimento de softwares, porém exige de mais +familiaridade com o Git. Permite, por exemplo, que os usuários de um +software, instalem tanto uma versão estável (do branch `master`) quanto +uma versão em desenvolvimento (do branch `develop`). - **Exemplo** +**Exemplo** São criados branches com funções especÃficas, como no exemplo `Hotfix`, `Release` e `Develop`. @@ -316,24 +299,24 @@ São criados branches com funções especÃficas, como no exemplo `Hotfix`, \caption{Ilustração dos branches especÃficos.} \end{wrapfigure} - -*Develop* é semelhante ao master do feature branch workflow. *Release* +*Develop* é semelhante ao master do feature branch workflow. *Release* serve para "lançar" possÃveis bugs gerados no código. *Hotfix* contém as -correções dos bugs do release que não podem aguardar o lançamento do +correções dos bugs do release que não podem aguardar o lançamento do mesmo. -- **Forking workflow**: -recomendado para projetos abertos, onde se espera que usuários externos -façam contribuições. Esse workflow consiste em um repositório oficial, -de onde os colaboradores fazem um `fork` desse repositório, e passam a -desenvolver o projeto de maneira independente. Assim, cada colaborador -poderá adotar o workflow de preferência, e não precisará ter acesso ao +## Forking workflow ## + +Recomendado para projetos abertos, onde se espera que usuários externos +façam contribuições. Esse workflow consiste em um repositório oficial, +de onde os colaboradores fazem um `fork` desse repositório, e passam a +desenvolver o projeto de maneira independente. Assim, cada colaborador +poderá adotar o workflow de preferência, e não precisará ter acesso ao repositório oficial, apenas colaborar enviando `merge`. **Exemplo** -Criado o repositório central, os colaboradores fazem um `fork`poderão -trabalhar de maneira independente. +Criado o repositório central, os colaboradores fazem um `fork`poderão +trabalhar de maneira independente. \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -342,20 +325,19 @@ trabalhar de maneira independente. \caption{Ilustração dos forks de um projeto.} \end{wrapfigure} -Independente da escolha do workflow para cada projeto é importante sempre -informar o método que está sendo utilizado para seus colaboradores, -para que eles possam seguir o mesmo padrão. +Independente da escolha do workflow para cada projeto é importante +sempre informar o método que está sendo utilizado para seus +colaboradores, para que eles possam seguir o mesmo padrão. -Essas informações poderão ser descritas em `README.md` -ou no `CONTRIBUTING.md`. +Essas informações poderão ser descritas em `README.md` ou no +`CONTRIBUTING.md`. -## Fluxo de trabalho PET no GitLab +# Fluxo de trabalho PET no GitLab # -O PET-EstatÃstica UFPR possui um grupo no Git para o desenvolvimento de -projetos. Utilizaremos a seguinte ilustração para entender o fluxo do +O PET-EstatÃstica UFPR possui um grupo no Git para o desenvolvimento de +projetos. Utilizaremos a seguinte ilustração para entender o fluxo do trabalho do PET. - \newpage \begin{wrapfigure}{r}{0.4\textwidth} \begin{center} @@ -364,28 +346,28 @@ trabalho do PET. \caption{Ilustração do fluxo de trabalho do PET.} \end{wrapfigure} - -Conforme a demanda de projetos, é criado o repositório para armazená-lo. -Após isso, são criados as `milestones` - marcadores de classificação dos +Conforme a demanda de projetos, é criado o repositório para armazená-lo. +Após isso, são criados as `milestones` - marcadores de classificação dos arquivos. Esses passos são feitos no `Owner`. Indo para o `master`, temos os seguintes passos: -- Conforme a demanda do projeto, é criado um `issue` para adição de -contribuições; -- Atualiza o ramo `devel`; -- Após isso, é necessário criar um `branch` (ramo) para incluir as -contribuições; - -Entrando no `developer`, teremos o ciclo de trabalho em que adiciona as -modificações (`git add`), registra as mesmas (`git commit`) e após -realizar todo o trabalho, é feito o `git push` enviando ao servidor remoto. - -A próxima etapa é a requisição de `merge`. Com esse `merge`, é feita as -discussões a respeito da contribuição, assim podendo retornar ao ciclo do -`developer` para as devidas correções e sugestões. Após a certeza dessa -contribuição, é movida para o ramo `devel` e fechado o `issue` referente -ao trabalho feito. - -Depois de terminar todas etapas do projeto, completa-se as `milestones`, -realiza o `merge` do `devel` no `master`, e cria a tag de versão. \ No newline at end of file + - Conforme a demanda do projeto, é criado um `issue` para adição de + contribuições; + - Atualiza o ramo `devel`; + - Após isso, é necessário criar um `branch` (ramo) para incluir as + contribuições; + +Entrando no `developer`, teremos o ciclo de trabalho em que adiciona as +modificações (`git add`), registra as mesmas (`git commit`) e após +realizar todo o trabalho, é feito o `git push` enviando ao servidor +remoto. + +A próxima etapa é a requisição de `merge`. Com esse `merge`, é feita as +discussões a respeito da contribuição, assim podendo retornar ao ciclo +do `developer` para as devidas correções e sugestões. Após a certeza +dessa contribuição, é movida para o ramo `devel` e fechado o `issue` +referente ao trabalho feito. + +Depois de terminar todas etapas do projeto, completa-se as `milestones`, +realiza o `merge` do `devel` no `master`, e cria a tag de versão. diff --git a/cap07.md b/cap07.md deleted file mode 100644 index 9ccfff39c0e324001451c8dd4b70dafcd1d15954..0000000000000000000000000000000000000000 --- a/cap07.md +++ /dev/null @@ -1,338 +0,0 @@ -# CapÃtulo 7: Trabalhando em equipe -PET-EstatÃstica UFPR - -O Git é uma ferramenta que aliada a outros serviços web, como GitLab ou -GitHub, oferece funcionalidade e autonomia para se trabalhar. -Contudo, com tantos recursos disponÃveis, só serão bem aplicados quando -todos os membros do grupo, além de conhecê-los, trabalham em harmonia. - -## 1.Boas práticas de colaboração - -Repositório é onde são armazenados os arquivos de um projeto. Existem -três nÃveis de acesso permitidos: - -- **Private**: é o repositório fechado, onde apenas o criador (Owner) tem -permissão de leitura e escrita. Se um repositório privado for criado -dentro de um grupo, todos do grupo terão permissão de leitura e escrita. - - -- **Internal**: é o repositório é fechado para usuários externos ao -grupo, mas qualquer usuário cadastrado no grupo terá permissão de leitura -e escrita no repositório. - - -- **Public**: é o repositório é aberto para qualquer pessoa, e fica -visÃvel para qualquer um (usuário do grupo ou não). Usuários do grupo -tem permissão de leitura e escrita no repositório. Usuários sem conta -no grupo podem clonar o repositório, mas não tem permissão para alterar -o repositório (enviar merge requests por exemplo). - -É possÃvel adicionar usuários para colaborar em um repositório. Cada -usuário pode ter um nÃvel de acesso diferente: **Guest**, **Reporter**, -**Developer**, **Master**. Em <a href="https://gitlab.c3sl.ufpr.br/help/permissions/permissions"> -permissões</a> é possÃvel visualizar as habilidades concedidas para cada -nÃvel. - -Logo após criar um novo repositório, é recomendável que se crie um arquivo -`README.md`. Independente da forma como o repositório foi configurado, -é sempre fundamental que ele contenha o arquivo `README.md`. -Este arquivo é sempre o primeiro a ser mostrado na página inicial -de todo repositório. Por esse motivo, é importante que o `README.md` -contenha no mÃnimo: - -- Uma descrição geral do projeto; -- Os nomes dos autores do projeto; -- Instruções de instalação, no caso de softwares; -- A licença do projeto (especialmente para projetos públicos), ou uma -orientação sobre o uso do projeto (permissão, citação, entre outros). -Opcionalmente pode-se criar um arquivo *LICENSE* com a licença. -Esse arquivo ficará disponÃvel também em uma aba na página inicial do -projeto. -- (**Opcional**): um guia de contribuição, se o projeto pretende que -colaboradores externos colaborem e precisam de algumas orientações básicas -sobre como colaborar. Criando um arquivo `CONTRIBUTING.md` com este guia, -ele será automaticamente colocado em uma aba na página inicial do projeto. -- (**Opcional**): um *changelog* para que sejam registradas as modificações -realizadas entre uma versão e outra (principalmente para softwares). -Criando esse arquivo com estas informações, ele aparecerá automaticamente -em uma aba na página inicial do projeto. - -Outra parte fundamental do git, são os **commits**. Além de salvarem as -alterações realizadas nos arquivos, também são responsáveis por documentar -as alterações feitas por qualquer usuário e em qualquer arquivo. -Os commits agilizam o processo de revisão do projeto, e poderá ajudar -futuros mantenedores do projeto a desvendar o motivo de algum acréscimo -ou modificação no código. Por causa dessas importâncias, uma mensagem bem -escrita é a melhor forma de se comunicar a alteração para os demais membros -do grupo e para você mesmo. Essas mensagens também aparecerão no `git log` -do projeto,por isso é essencial que sejam bem escritas, de forma clara e -sigam um padrão. - -Algumas **regras de ouro**, que são convenções gerais, para que um projeto -versionado com git seja bem sucedido são: - -- **Faça commits regularmente**: isso faz com que as mudanças de código -entre um commit e outro sejam menores, tornando mais fácil para todos -acompanhar as alterações; - -- **Não faça commits de trabalhos pela metade**: faça um commit apenas -quando tiver finalizado o que estava propondo. Isso irá forçar você a -deixar o trabalho em pedaços menores, e por consequência realizar -commits regularmente; - -- **Teste antes de fazer um commit**: resista à tentação de fazer um commit -que você pensa que está completo. Teste toda a sua realização para -ter certeza de que não causará um efeito colateral no projeto; - -- **Escreva boas mensagens de commit**: seja claro e objetivo ao escrever -as mensagens de commit. No entanto, tome cuidado para não ser vago, ou -escrever apenas `mudança`, `mais mudanças`, etc. Se uma mensagem curta for suficiente, use `git commit -m 'Mensagem'`, mas lembre-se de ser -informativo sobre a alteração realizada, para ser útil para todos do -projeto. - -Existem outras convenções estabelecidas sobre como escrever mensagens -de commit contextualizadas, baseadas nas mensagens geradas por mensagens -de funções do próprio git. Estas convenções podem resumidas nas 7 regras -que são convenções globais: - -1.**Separe o tÃtulo do corpo do texto com uma linha em branco**: por padrão, -a primeira linha é o tÃtulo do commit, e deve ser uma mensagem curta. -Ao deixar uma linha em branco, é permitido escrever uma mensagem de -qualquer tamanho, detalhando melhor as modificações feitas. -Dessa forma, quando `git log` for executado, toda a mensagem de commit -aparecerá, enquanto que `git log --oneline` mostrará apenas o tÃtulo do -commit. - -2.**Limite a linha de tÃtulo em 50 caracteres**: isso faz com que o -colaborador pense mais para escrever uma mensagem mais informativa. -Se a mensagem for uma única linha (`git commit -m`), então esse limite -pode se estender para 72 caracteres. - -3.**Capitalize a mensagem**: em todas as mensagens de commit comece com -letra maiúscula, tanto se for tÃtulo, corpo da mensagem, ou apenas -uma mensagem de uma única linha. - -4.**Não termine os commits com ponto**: principalmente se for o tÃtulo -de uma mensagem de commit mais longa. Espaço é valioso quando se temos -no máximo 50 ou 72 caracteres. - -5.**Use o modo imperativo**: no tÃtulo de commits longos ou em mensagens -de commits únicas. O modo imperativo significa escrever como se estivesse -dando um comando a alguém. Seja direto e objetivo, e escreva no presente. -Exemplos de mensagens no impertativo: -```sh -- Adiciona versão final - -- Altera parágrafo da introdução - -- Remove funções precipitadas -``` - -Algumas mensagens no modo **não** imperativo são: -```sh -- Corrigindo o erro - -- Mudando a função - -- Mais correções para mais funções -``` - - -6.**Limite o corpo da mensagem em 72 caracteres**: ao escrever uma mensagem -de commit mais longa, devemos manter o corpo da mensagem com no máximo -72 carateres. - - -7.**Use o corpo da mensagem para explicar "o que" e "porque", e não "como"**: contextualize o que você fez e o motivo. Na maioria dos casos você pode -deixar de fora como você fez as modificações, pois o código alterado já -deverá ser auto-explicativo. - - -## 2.Modelos de fluxos de trabalho - -A escolha do *workflow* (fluxo de trabalho) depende de cada projeto e das preferências pessoais. Podemos utilizar as informações sobre cada *workflow*, e decidir qual é mais adequado para cada projeto. Existem quatro maneiras -principais de trabalhar em colaboração com o git e o GitLab: - -- #### **Centralized workflow**: -recomendado para projetos pequenos, e/ou que não necessitam de muitas -alterações. Nesse workflow, o repositório possui apenas um brach (`master`) -e as alterações são feitas nesse branch. As revisões só poderão ser -realizadas depois que tudo foi enviado para o servidor remoto. Com isso, -há uma grande chance de ocorrerem conflitos. - - - **Exemplo** - - Após iniciar um repositório central, os colaboradores devem clonar - o repositório. - -  - - FIGURA: Colaboradores clonando o repositório central - - Depois de um colaborador terminar seu trabalho remotamente, ele - publica as modificações para o repositório central, para que os - demais membros possam ter acesso. - -  - - FIGURA: Colaborador publicando as modificações no repositório central - - Outro membro também termina seu trabalho e resolve publicar no - repositório central, porém não irá conseguir. O repositório central - está diferente do seu repositório local. - -  - - FIGURA: Colaborador não conseguindo publicar as modificações no - repositório central - - Para conseguir enviar as modificações realizadas, o colaborador - precisa puxar as atualizações feitas para o seu repositório, - integrá-los com as suas alterações locais, e em seguida, tentar - novamente. - -  - - FIGURA: Colaborador puxando as modificações do repositório central - - Após feito isso, será possÃvel o colaborador fazer as modificações. - -  - - FIGURA: Colaborador publica modificações do repositório central - -- #### **Feature branch workflow**: -recomendado para projetos pequenos e grandes que envolvam mais de um -colaborador. O projeto principal é mantido nobranch master. Se um membro -quiser realizar alguma alteração, deverá criar um novo branch `feature`, -e fazer as alterações nesse branch e sugerir um `merge request`. Com isso, -os demais colaboradores poderão revisar as alterações sugeridas e discutir as modificações, até que uma pessoa habilitada faça o merge desse branch -`freature` para o branch `master`. -Dessa forma, evita-se os possÃveis conflitos e garante que tais alterações -não causaram algum problema. Esse workflow é altamente recomendado por -ser simples de gerenciar, evitar grandes conflitos, e ser relativamente -fácil para usuários novos do git. - - - **Exemplo** - - Antes de começar a desenvolver um recurso, é preciso de criar um - ramo isolado para trabalhar - -  - - FIGURA: Criando um novo ramo para o trabalho - - Com isso, o membro poderá iniciar o seu trabalho, e realizar o que - for necessário nesse ramo (brach). Após finalizar o projeto, o colaborador - envia suas modificações, irá requirir um `merge request` para que - as alterações feitas nesse branch, sejam incorporadas no `master`. Os - demais membros, poderão avaliar se tais modificações são pertinentes - para o projeto. - -  - - FIGURA: Colaborador solicita merge, e aguarda revisão dos demais - colaboradores - - Quando as alterações sugeridas para o colaborador forem incorporadas - o branch poderá ser movido para o `master`. - -  - - FIGURA: Movendo ramo para o master - -- #### **Gitflow workflow**: -indicado para projetos maiores e/ou com um grande número de colaboradores. -Esse workflow envolve a criação de alguns branches com funções especÃficas. -Todo o desenvolvimento é realizado no branch `develop`. Quando uma versão -está pronta, ela é movida para o branch `release`, onde é testada e -finalmente incorporada ao ramo master, que contém apenas versões finais -(estáveis). É extremamente recomendado esse workflow para desenvolvimento -de softwares, porém exige de mais familiaridade com o git. Permite, por -exemplo, que os usuários de um software, instalem tanto uma versão estável -(do branch `master`) quanto uma versão em desenvolvimento -(do branch `develop`). - - **Exemplo** - - São criados branches com funções especÃficas, como no exemplo `Hotfix`, - `Release` e `Develop`. - -  - - FIGURA: Ilustração dos branches especÃficos - - *Develop* é semelhante ao master do feature branch workflow. *Release* - serve "lançar" possÃveis bugs gerados no código. *Hotfix* contém as - correções dos bugs do release que não podem aguardar o lançamento - do mesmo. - - -- #### **Forking workflow**: -recomendado para projetos abertos, onde se espera usuários externos façam contribuições. Esse workflow consiste de um repositório oficial, de onde -os colaboradores fazem um `fork` desse repositório, e passam a desenvolver -o projeto de maneira independente. Assim, cada colaborador poderá adotar -o workflow de preferência, e não precisará ter acesso ao repositório -oficial, apenas colaborar enviando `merge`. - - **Exemplo** - - Criado o repositório central, os colaboradores fazem um `fork` - poderão trabalhar de maneira independente. - -  - - FIGURA: Ilustração dos forks de um projeto - - Independente da escolha do workflow para cada projeto é importante sempre -informar o método que está sendo utilizado para seus colaboradores, -para que eles possam seguir o mesmo padrão. Essas informações poderão ser -descritas em `README.md` ou no `CONTRIBUTING.md`. - -## 3.Fluxo de trabalho PET no GitLab - -O PET-EstatÃstica UFPR possui um grupo no Git para o desenvolvimento de -projetos. Utilizaremos a seguinte ilustração para entender o fluxo do -trabalho do PET. - -(figura que haverá um dia) - -FIGURA: Ilustração do fluxo de trabalho do PET - -Conforme a demanda de projetos, é criado o repositório para armazená-lo. -Após isso, são criados as `milestones` - marcadores de -classificação dos arquivos. Esses passos são feitos no `Owner`. - -Indo para o `master`, temos os seguintes passos: - -- Conforme a demanda do projeto, é criado um `issue` para adição de -contribuições; -- Atualiza o ramo `devel`; -- Após isso, é necessário criar um `branch` (ramo) para incluir as -contribuições; - -Entrando no `developer`, teremos o ciclo de trabalho em que adiciona -as modificações (`git add`), registra as mesmas (`git commit`) e após -realizar todo o trabalho, é feito o `git push` enviando ao -servidor remoto. - -A próxima etapa é a requisição de `merge`. Com esse `merge`, é feita as -discussões a respeito da contribuição, assim podendo retornar ao ciclo -do `developer` para as devidas correções e sugestões. -Após a certeza dessa contribuição, é movida para o ramo `devel` e fechado -o `issue`referente ao trabalho feito. - -Depois de terminar todas etapas do projeto, completa-se as `milestones`, -realiza o `merge` do `devel` no `master`, e cria a tag de versão. - - -### Referências -https://git-scm.com/book/pt-br/v1/Git-Distribu%C3%ADdo-Contribuindo-Para-Um-Projeto - -https://prezi.com/_lm8kozmii8n/git-workflow/ - -https://www.atlassian.com/zh/git/workflows\#!workflow-overview - -http://git.leg.ufpr.br/leg/gitlab-rautu/blob/master/CONTRIBUTING.md diff --git a/cap08/cap08_cs.Rmd b/cap08/cap08_cs.Rmd index 9558471a358788bd8a435c6ae2b17834abe51b65..056b4c0ad0857225cde67104773719d2528405a1 100644 --- a/cap08/cap08_cs.Rmd +++ b/cap08/cap08_cs.Rmd @@ -13,10 +13,10 @@ Configura o diretório atual para um projeto Git Configura o nome que será visualizado nos commit #### $ git config --global user.email "Seu email" -Configura o email que será associado ao seu nome +Configura o e-mail que será associado ao seu nome #### $ git clone git://github.com/usuario/projeto.git -Clona um projeto git já existente +Clona um projeto Git já existente ### Atividades Locais @@ -104,4 +104,4 @@ Desfaz todos os commit a partir do commit especificado Reverte para um commit especificado #### $ git submodule -Cria, atualiza ou inspeciona um submodulo (sub branch) +Cria, atualiza ou inspeciona um submódulo (sub branch) diff --git a/cap08/cap08_dt.Rmd b/cap08/cap08_dt.Rmd index 3da8575206ca69ec90034ea4d4036773c37f77ef..79d8a293106f7ce3a790a864b0dfb73ab6b47a56 100644 --- a/cap08/cap08_dt.Rmd +++ b/cap08/cap08_dt.Rmd @@ -1,17 +1,23 @@ --- -output: html_document +title: "Dicionário de Termos" +author: "PET EstatÃstica UFPR" +graphics: yes +output: + pdf_document: + template: + highlight: default + toc: false + keep_tex: true + number_sections: false --- -Dicionário de Termos -==================== -## Config +## Config ## -O `config` é um comando usado para ajustar as configurações padrão do git. -Há duas configurações básicas a serem feitas: a inclusão do e-mail e -do nome do usuário Git. -Todas as configurações definidas como globais ficam armazenadas em um -arquivo chamado `.gitconfig`, que fica localizado no diretório padrão -do usuário. +O `config` é um comando usado para ajustar as configurações padrão do +Git. Há duas configurações básicas a serem feitas: a inclusão do e-mail +e do nome do usuário Git. Todas as configurações definidas como globais +ficam armazenadas em um arquivo chamado `.gitconfig`, que fica +localizado no diretório padrão do usuário. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -21,16 +27,16 @@ git config --global user.name "Ezio Auditore" git config --global user.email ezio.auditore@exemple.com ``` -## SSH Key +## SSH Key ## É uma chave de autenticação baseada em criptografia de chave pública -(chave assimétrica). Essa criptografia torna o processo de transferência -de arquivos entre o cliente e o servidor mais segura. +(chave assimétrica). Essa criptografia torna o processo de transferência +de arquivos entre o cliente e o servidor mais segura. -Para que o git local consiga se conectar a um servidor git remoto, é +Para que o Git local consiga se conectar a um servidor Git remoto, é necessário que esta chave seja gerada e que as devidas configurações -sejam feitas tanto localmente quanto no servidor remoto, -caso contrário, é exibido um erro e a conexão é interrompida. +sejam feitas tanto localmente quanto no servidor remoto, caso contrário, +é exibido um erro e a conexão é interrompida. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -38,11 +44,10 @@ caso contrário, é exibido um erro e a conexão é interrompida. ssh-keygen ``` +## Help ## -## Help - -Todo comando Git tem um manual de ajuda que pode ser exibido na tela -com o comando `--help`. +Todo comando Git tem um manual de ajuda que pode ser exibido na tela com +o comando `--help`. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -50,18 +55,11 @@ com o comando `--help`. git status --help ``` -## Repositório - -<<<<<<< HEAD - -======= - Um repositório é uma pasta gerenciada pelo git. A partir -da criação desta, usufruimos dos sistema de versionamento, sendo possÃvel -transitar entre as diferentes versões a medida que necessário. ->>>>>>> 07c90afef682bf3d8d8cd150e8145174e3520928 - - +## Repositório ## +Um repositório é uma pasta gerenciada pelo Git. A partir da criação +desta, usufruÃmos do sistema de versionamento, sendo possÃvel transitar +entre as diferentes versões a medida que necessário. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -69,19 +67,20 @@ transitar entre as diferentes versões a medida que necessário. git init ``` -## Stagin Area +## Stagin Area ## -A stagin area é um espaço temporário na pasta gerenciada pelo Git. É -o local em que ficam os arquivos antes de serem marcados como uma versão -definitiva. Em tradução livre, stagin area é área de estágio, podemos -assim imaginar que o arquivo está estagiando antes de ser promovido a um +A stagin area é um espaço temporário na pasta gerenciada pelo Git. É o +local em que ficam os arquivos antes de serem marcados como uma versão +definitiva. Em tradução livre, stagin area é área de estágio, podemos +assim imaginar que o arquivo está estagiando antes de ser promovido a um arquivo definitivo. -## Remote +## Remote ## -O `remote` mostra o servidor remoto onde os arquivos Git estão hospedados. -O remote padrão geralmente é criado com o nome de `origin`, mas é possÃvel adicioná-lo utilizando outros nomes e até mesmo adicionar outros servidores -remotos juntamente ao `origin`. +O `remote` mostra o servidor remoto onde os arquivos Git estão +hospedados. O remote padrão geralmente é criado com o nome de `origin`, +mas é possÃvel adicioná-lo utilizando outros nomes e até mesmo adicionar +outros servidores remotos juntamente ao `origin`. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -89,17 +88,16 @@ remotos juntamente ao `origin`. git remote add origin "git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git" ``` - -## Clone +## Clone ## O `clone` é usado quando deseja-se clonar um repositório que está -disponÃvel em um servidor remoto para o servidor local. -Depois da clonagem, estará disponÃvel todos os arquivos e todo o -histórico de controle de versões sem a necessidade de uso da internet. +disponÃvel em um servidor remoto para o servidor local. Depois da +clonagem, estará disponÃvel todos os arquivos e todo o histórico de +controle de versões sem a necessidade de uso da internet. -É importante salientar que quando se é usado o `clone`, o servidor remoto -é adicionado automaticamente, podendo ser acessado através do comando -`origin`. +É importante salientar que quando se é usado o `clone`, o servidor +remoto é adicionado automaticamente, podendo ser acessado através do +comando `origin`. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -109,7 +107,7 @@ git clone git@gitlab.c3sl.ufpr.br:pet-estatistica/apostila-git.git git remote ``` -## Status +## Status ## O status exibe a diferença entre o estado atual dos arquivos e o estado do último `commit` do mesmo `branch`. São três estados possÃveis: @@ -121,10 +119,10 @@ consolidado (committed), modificado (modified) e preparado (staged). git status ``` -## Add +## Add ## -O `add` adiciona (envia) os arquivos para a stagin area, para que -possa ser marcado no tempo por um commit. +O `add` adiciona (envia) os arquivos para a stagin area, para que possa +ser marcado no tempo por um commit. **Exemplo:** ```{r, engine="bash", eval=FALSE} @@ -132,10 +130,10 @@ possa ser marcado no tempo por um commit. git add * ``` -## Commit +## Commit ## -O `commit` marca os arquivos da stagin area como uma versão definitiva, -para que posteriormente, caso algum erro ocorra, possamos voltar nos +O `commit` marca os arquivos da stagin area como uma versão definitiva, +para que posteriormente, caso algum erro ocorra, possamos voltar nos commits anteriores onde o código está em pleno funcionamento. **Exemplo:** @@ -145,19 +143,11 @@ git commit -m "Meu primeiro commit" ## Branch -HEAD -Os `branchs` são como uma cópia dos arquivos do ultimo commit -para um ambiente de desenvolvimento paralelo, o que -permite que as modificações em um `branch` não afete os arquivos em outro. -Os branchs também são chamados de ramos de desenvolvimento. Veja com mais -detalhes no capitulos dos worksflows. - - -Os `branchs` são como cópias dos arquivos do último commit para um ambiente -de desenvolvimento paralelo, o qual permite que as modificações em um -`branch` não afete os arquivos em outro. -Os branchs também são chamados de ramos de desenvolvimento. - 07c90afef682bf3d8d8cd150e8145174e3520928 +Os `branchs` são como uma cópia dos arquivos do ultimo commit para um +ambiente de desenvolvimento paralelo, o que permite que as modificações +em um `branch` não afete os arquivos em outro. Os branchs também são +chamados de ramos de desenvolvimento. Veja com mais detalhes nos +capÃtulos 3 e 7. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -165,10 +155,10 @@ Os branchs também são chamados de ramos de desenvolvimento. git branch novoBranch ``` -## Checkout +## Checkout ## -O `checkout` serve para transitar entre branchs e commits. -Usando o checkout é possÃvel voltar a commits anteriores. +O `checkout` serve para transitar entre branchs e commits. Usando o +checkout é possÃvel voltar a commits anteriores. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -176,17 +166,17 @@ Usando o checkout é possÃvel voltar a commits anteriores. git checkout teste ``` -## Merge +## Merge ## Com o `merge` é possÃvel a fusão de dos dois ramos em um. Quando se trabalha em ramos diferentes (diferentes branchs) e precisa-se -posteriormente juntar o trabalho, o `merge` (fundir) é usado, -permitindo que o trabalho seja centralizado novamente. A fusão é feita -de forma automática, mas conflitos podem ocorrer, como por exemplo, -quando duas ou mais pessoas modificam a mesma parte do código. -Estes conflitos devem ser resolvidos manualmente, deixando a cargo do -gerente de projetos decidir que parte do código deve permanecer. +posteriormente juntar o trabalho, o `merge` (fundir) é usado, permitindo +que o trabalho seja centralizado novamente. A fusão é feita de forma +automática, mas conflitos podem ocorrer, como por exemplo, quando duas +ou mais pessoas modificam a mesma parte do código. Estes conflitos +devem ser resolvidos manualmente, deixando a cargo do gerente de +projetos decidir que parte do código deve permanecer. **Exemplo:** ```{r, engine='bash', eval=FALSE} @@ -194,21 +184,15 @@ gerente de projetos decidir que parte do código deve permanecer. git merge novoBranch ``` -## Rm - - HEAD -O `git rm`, na sua forma mais comum, serve para remover um arquivo de -forma que ele deixe de ser gerenciado pelo git e seja excluido do disco -rÃgido. Também é possÃvel que o arquivo deixe de ser gerenciado -e permaneça no disco. +## Rm ## -O `git rm`, de forma mais prática, serve para remover um arquivo deixando -de ser gerenciado pelo Git e seja excluÃdo do disco rÃgido. Também é possÃvel -que o arquivo deixe de ser gerenciado e permaneça no disco. - 07c90afef682bf3d8d8cd150e8145174e3520928 +O `git rm`, na sua forma mais comum, serve para remover um arquivo de +forma que ele deixe de ser gerenciado pelo Git e seja excluÃdo do disco +rÃgido. Também é possÃvel que o arquivo deixe de ser gerenciado e +permaneça no disco. -Uma das vantagens é que, quando o arquivo é removido pelo `git rm`, já -aparece como preparado (staged), precisando somente que a exclusão seja +Uma das vantagens é que, quando o arquivo é removido pelo `git rm`, já +aparece como preparado (staged), precisando somente que a exclusão seja commitada. **Exemplo:** @@ -220,13 +204,13 @@ git rm teste.tex git rm --cached teste.tex ``` -## Mv +## Mv ## O `git mv` move ou renomeia arquivos informando ao Git. Caso a mudança seja feita sem esse comando, o Git entende que o arquivo -foi deletado e que um novo arquivo foi criado, deixando de fora, -por exemplo, a ligação existente entre o arquivo e seus commits. +foi deletado e que um novo arquivo foi criado, deixando de fora, por +exemplo, a ligação existente entre o arquivo e seus commits. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -234,10 +218,10 @@ por exemplo, a ligação existente entre o arquivo e seus commits. git mv teste.tex arquivo1.tex ``` -## Push +## Push ## -O `push` é usado para "empurrar" os arquivos do repositório local -para o servidor remoto. +O `push` é usado para "empurrar" os arquivos do repositório local para o +servidor remoto. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -245,10 +229,11 @@ para o servidor remoto. git push origin master ``` -## Fetch +## Fetch ## -O `fetch` atualiza o repositório local com as alterações do remoto, porém -não realiza o merge dos arquivos, deixando isso para ser feito manualmente. +O `fetch` atualiza o repositório local com as alterações do remoto, +porém não realiza o merge dos arquivos, deixando isso para ser feito +manualmente. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -256,11 +241,11 @@ não realiza o merge dos arquivos, deixando isso para ser feito manualmente. git fetch origin ``` -## Pull +## Pull ## -O `pull` é semelhante ao comando `fetch`, porém, puxa os -arquivos do servidor remoto fazendo merge. Caso haja algum conflito de -merge, estes deverão ser resolvidos manualmente. +O `pull` é semelhante ao comando `fetch`, porém, puxa os arquivos do +servidor remoto fazendo merge. Caso haja algum conflito de merge, estes +deverão ser resolvidos manualmente. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -268,25 +253,24 @@ merge, estes deverão ser resolvidos manualmente. git pull origin ``` - -## HEAD +## HEAD ## `HEAD` é um arquivo que contém um apontador para o `branch` atual. -Quando o `checkout` é executado para a mudança do `branch`, -esse arquivo é automaticamente modificado, apontando agora para o -novo local, e assim permitindo que, quando o computador for desligado e -depois de reniciado o Git ainda esteja trabalhando com o mesmo `branch`. +Quando o `checkout` é executado para a mudança do `branch`, esse arquivo +é automaticamente modificado, apontando agora para o novo local, e assim +permitindo que, quando o computador for desligado e depois de reiniciado +o Git ainda esteja trabalhando com o mesmo `branch`. -## Tag +## Tag ## As tags são usadas para marcar pontos especÃficos do desenvolvimento. Geralmente são usadas para marcar versões definitivas, como a v1.0, v2.0 e assim por diante. -Elas são divididas em dois tipos: leve e anotada. -A `tag` leve simplesmente aponta para um `commit` especÃfico. Já a `tag` -anotada é guardada como objetos inteiros, possuindo algumas informações, -como o nome da pessoa que criou, a data, uma mensagem semelhante a de `commit`, +Elas são divididas em dois tipos: leve e anotada. A `tag` leve +simplesmente aponta para um `commit` especÃfico. Já a `tag` anotada é +guardada como objetos inteiros, possuindo algumas informações, como o +nome da pessoa que criou, a data, uma mensagem semelhante a de `commit`, entre outras. **Exemplo:** @@ -298,10 +282,10 @@ git tag -l "v1.0.0" git tag -a v1.0 -m "Minha primeira tag anotada." ``` -## Stash +## Stash ## -Com este comando não é necessário fazer um `commit` para mudar de `branch`. -Ao executá-lo, os arquivos modificados ficam salvos em uma +Com este comando não é necessário fazer um `commit` para mudar de +`branch`. Ao executá-lo, os arquivos modificados ficam salvos em uma pilha de modificações inacabadas, sendo possÃvel transitar entre `branchs` e voltar ao trabalho inacabado quando necessário. @@ -313,12 +297,12 @@ git stash git stash list ``` -## Reset +## Reset ## -Enquanto o `git checkout` somente transita entre os `commits`, -o `reset` pode também alterar o histórico, fazendo `commits` serem -apagados de maneira irreversÃvel (--hard) ou serem apenas resetados -ao estado de não commitado (--soft). +Enquanto o `git checkout` somente transita entre os `commits`, o `reset` +pode também alterar o histórico, fazendo `commits` serem apagados de +maneira irreversÃvel (--hard) ou serem apenas retornados ao estado de não +commitado (--soft). **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} @@ -326,15 +310,14 @@ ao estado de não commitado (--soft). git reset --hard HEAD~1 ``` - -## Rebase +## Rebase ## O `rebase` é usado para modificar `commits` antigos. Ele refaz a árvore -de `commits`, sendo assim não é uma boa ideia fazer um `push` da -alteração, pois modificará a árvore do servidor afetando todos os +de `commits`, sendo assim não é uma boa ideia fazer um `push` da +alteração, pois modificará a árvore do servidor afetando todos os desenvolvedores. -A ideia geral é `rebase` apaga os commits de um ramo e "muda de base", +A ideia geral é `rebase` apaga os commits de um ramo e "muda de base", passando-os para novos commits do ramo atual, formando uma árvore com fluxo de trabalho linear. @@ -344,21 +327,21 @@ fluxo de trabalho linear. git rebase teste ``` -## Blame +## Blame ## -Pesquisa qual `commit` modificou determinado arquivo, com o objetivo -de encontrar quem e quando um erro foi inserido. -Esse método também é chamado de anotação de arquivo. +Pesquisa qual `commit` modificou determinado arquivo, com o objetivo de +encontrar quem e quando um erro foi inserido. Esse método também é +chamado de anotação de arquivo. **Exemplo:** ```{r, engine='bash', echo=TRUE, eval=FALSE} # Fazer ``` -## Bisect +## Bisect ## -O `bisect` realiza uma pesquisa binária (binary search) a procura de -erros. Para que a pesquisa ocorra, é necessário um ponto no tempo em que +O `bisect` realiza uma pesquisa binária (binary search) a procura de +erros. Para que a pesquisa ocorra, é necessário um ponto no tempo em que o código esteja funcionando e outro que não esteja. **Exemplo:** @@ -370,4 +353,4 @@ git bisect start git bisect bad # Marcando o commit com nome commit1 como funcionando: git bisect good commit1 -``` \ No newline at end of file +``` diff --git a/cap08/cap08_er.Rmd b/cap08/cap08_er.Rnw similarity index 57% rename from cap08/cap08_er.Rmd rename to cap08/cap08_er.Rnw index 56af10b13439b96f5e297d6955ebfdae95e674ee..ff542ac48af0d9fd301baa1b903df74106020b3c 100644 --- a/cap08/cap08_er.Rmd +++ b/cap08/cap08_er.Rnw @@ -1,55 +1,19 @@ ---- -title: "Exemplos de Rotina" -author: "PET EstatÃstica UFPR" -graphics: yes -header-includes: - \usepackage{multicol} - \usepackage{cleveref} -output: - pdf_document: - template: ../template.tex - highlight: default - toc: true - toc_depth: 2 - keep_tex: true - number_sections: true ---- - +\newpage \appendix -\chapter{Exemplos de Rotinas} +\chapter{Exemplos de rotinas} Neste apêndice são descritas brevemente algumas das rotinas mais usuais em projetos Git. A maioria dos exemplos estão detalhados na apostila e foram resumidos nesta coletânea. Abaixo temos a lista de rotinas aqui -presentes: - -\begin{multicols}{2} -\footnotesize - \begin{description} - \item[Configure usuário e e-mail,] pág. \pageref{routine1} - \item[Inicie um projeto git local,] pág. \pageref{routine2} - \item[Trabalhe com ramos,] pág. \pageref{routine3} - \item[Visualize diferenças,] pág. \pageref{routine4} - \item[Resolva conflitos de \textit{merge},] pág. \pageref{routine5} - \item[Visualize seu projeto,] pág. \pageref{routine6} - \item[Volte versões anteriores,] pág. \pageref{routine7} - \item[Reescreva \textit{commits},] pág. \pageref{routine8} - \item[Adicione chaves públicas,] pág. \pageref{routine9} - \item[Trabalhe remotamente,] pág. \pageref{routine10} - \item[Manipule ramos remotos,] pág. \pageref{routine11} - \item[Adicione local remoto,] pág. \pageref{routine12} - \end{description} -\end{multicols} - -\pagebreak - -<!-- ------------------------------------------- --> -\hlabel{routine1} -\routine{Configure usuário e e-mail} - -```{r, engine='bash', echo=TRUE, eval=FALSE} +presentes. + +\listofprogram +\begin{program}[H] + \caption{Configurar usuário e e-mail localmente e globalmente.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Configurando localmente ## - válido para o repositório atual git config user.name "Name Lastname" @@ -62,15 +26,14 @@ git config --global user.email "namelastname@servidor" ## Obs.: As configurações locais se sobrepõem as ## globais, quando as duas forem avaliadas. +@ -``` - -<!-- ------------------------------------------- --> -\hlabel{routine2} -\routine{Inicie um projeto Git local} - -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Iniciar um projeto Git local.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Em um diretório que deseja-se versionar ## Inicia o versionamento Git @@ -79,7 +42,7 @@ git init ## Verifica o estado do repositório git status -## Adicione os arquivos para receber o commit +## Adicione os arquivos para receber o commit git add file1.txt file2.R file3.txt file4.Rmd ## Registre a versão do repositório com uma mensagem @@ -88,17 +51,105 @@ git commit -m "Inicia repositório" ## Verifica o histórico de versões git log +@ + +%%---------------------------------------------------------------------- + +\begin{program}[H] + \caption{Criar chaves públicas para adicionar aos perfils em seviços + Web.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= +## Cria uma chave pública. +ssh-keygen -t rsa -C "namelastname@servidor" + +## Exibe as chaves públicas. +cat ~/.ssh/id_rsa.pub + +## Adicione o conteúdo a um servidor remoto, como: +## - git@github.com +## - git@gitlab.com +## - git@gitlab.c3sl.ufpr.br + +## Verifica conexão com o servidor +ssh -T endereço ## endereço = git@github.com, ... + +## Obs.: Todos os comandos ssh são provinientes do +## pacote de função ssh para shell, portanto para +## utilizar instale este pacote. +@ + +%%---------------------------------------------------------------------- + +\begin{program}[H] + \caption{Criar chaves públicas e adicionar ao um servidor remoto.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= +## Cria uma chave pública na sua máquina local. +ssh-keygen -t rsa -C "namelastname@servidor" + +## Exibe as chaves públicas criadas. +cat ~/.ssh/id_rsa.pub + +## Exibe as chaves autorizadas da sua conta no servidor remoto. +ssh user@caporal.c3sl.ufpr.br "cat ~/.ssh/authorized_keys2" + +## Insere a chave gerada final do arquivo de chaves autorizadas. +ssh user@caporal.c3sl.ufpr.br \ + "cat >> ~/.ssh/authorized_keys2" < ~/.ssh/id_rsa.pub + +@ + +%%---------------------------------------------------------------------- + +\begin{program}[H] + \caption{Inicar um repositório remoto Git em um servidor.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= +## Loga no servidor por SSH. +ssh user@caporal.c3sl.ufpr.br + +## Criar um diretório para conter o projeto. Apesar do final .git +## (opcional), é um diretório, não um arquivo. +mkdir -p ~/Documentos/meu1repo.git +cd ~/Documentos/meu1repo.git + +## Inicia um repositório remoto sem workspace. +git --bare init +git config --list + +## Sai do servidor. +exit + +## Opção 1: Na máquina local, clonar o repositório. O diretório criado +## não tem o .git no final +git clone user@macalan.c3sl.ufpr.br:~/Documentos/meu1repo.git +cd meu1repo +git status + +## Opção 2: Se o repositório ja começou localmente, então apenas +## adicione o endereço do remoto. +git remote add origin \ + user@macalan.c3sl.ufpr.br:~/Documentos/meu1repo.git +git push origin master -``` +## Exibir os endereços remotos. +git remote -v -<!-- ------------------------------------------- --> -\hlabel{routine3} -\routine{Trabalhe com ramos} +@ -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Criar um ramo, incluir modificações e fazer o merge em + outro.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Verifica os ramos existentes git branch +git branch -l ## Apenas os locais +git branch -r ## Apenas os remotos +git branch -a ## Todos ## Cria um ramo, para trabalho especÃfico como: ## - Corrigir bugs @@ -125,14 +176,19 @@ git merge bugfix ## Deleta o ramo responsável pela correção do bug git branch -d bugfix -``` +@ + +%% Criar um ramo e subir as diferenças, setar upstream. -<!-- ------------------------------------------- --> -\hlabel{routine4} -\routine{Visualize diferenças} +%% Baixar um ramo e criar o seu local. -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Visualizar diferenças entre referências relativas, absolutas + (\textit{commits}) e ramos.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## ------------------------------------------- ## Diferenças não commitadas @@ -165,14 +221,14 @@ git diff master feature1 ## visualizar diferenças, use difftool no lugar de ## diff, ver cap. 06 -``` - -<!-- ------------------------------------------- --> -\hlabel{routine5} -\routine{Resolva conflitos de merge} +@ -```{r, engine='bash', eval=FALSE, echo=TRUE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Resolver conflitos de merge.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Incorpora modificações realizadas no ramo feature git merge feature @@ -182,35 +238,35 @@ git merge feature ## Finaliza merge com o commit: git commit -a -m "Merge do ramo feature" -``` +@ -<!-- ------------------------------------------- --> -\hlabel{routine6} -\routine{Visualize seu projeto} - -```{r, engine='bash', eval=FALSE, echo=TRUE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Visualizar o histórico de \textit{commits} do projeto.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Histórico de registros git log ## Histórico de registros em uma linha com trajetória -## dos ramos -git log --graph --oneline +## dos ramos +git log --graph --oneline ## Histórico de registro com referência git reflog ## Histórico de registro via interface gráfica padrão gitk +gitk --all +@ -``` - -<!-- ------------------------------------------- --> -\hlabel{routine7} -\routine{Volte versões anteriores} - -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Voltar arquivos para versões anteriores.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Verifica o histórico de versões do repositório ## - Guarde o SHA1 ID do registro desejado: ec3650c8 git log --oneline @@ -245,19 +301,23 @@ git checkout -b ramo_teste ## Obs.: O ramo provisório é removido assim que se ## fizer um checkout para qualquer outro ramo -``` - -<!-- ------------------------------------------- --> -\hlabel{routine8} -\routine{Reescreva commits} +@ -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Refazer o último \textit{commit} para alterar a mensagem e/ou + incluir mais modificações.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Verifica o histórico de versões do repositório git log --oneline +## Caso seja o objetivo, adicione mais modificações. +git add script.R + ## ------------------------------------------- -## Reescreve a última mensagem de commit +## Reescreve a última mensagem de commit git commit --amend -m "Correção de Commit" ## Obs1.: Arquivos na staging area também são @@ -265,41 +325,14 @@ git commit --amend -m "Correção de Commit" ## Obs2.: Reescreve a história do repositório, não ## é recomendável reescrever a linha do tempo quando ## se está em um projeto colaborativo remoto. +@ -``` - -<!-- ------------------------------------------- --> -\hlabel{routine9} -\routine{Adicione chaves públicas} - -```{r, engine='bash', echo=TRUE, eval=FALSE} - -## Cria uma chave pública. -ssh-keygen -t rsa -C "namelastname@servidor" - -## Exibe as chaves públicas. -cat ~/.ssh/id_rsa.pub - -## Adicione o conteúdo a um servidor remoto, como: -## - git@github.com -## - git@gitlab.com -## - git@gitlab.c3sl.ufpr.br - -## Verifica conexão com o servidor -ssh -T endereço ## endereço = git@github.com, ... - -## Obs.: Todos os comandos ssh são provinientes do -## pacote de função ssh para shell, portanto para -## utilizar instale este pacote. - -``` - -<!-- ------------------------------------------- --> -\hlabel{routine10} -\routine{Trabalhe remotamente} - -```{r, engine='bash', echo=TRUE, eval=FALSE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Trabalhe remotamente.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Clona um projeto remoto: ## e.g. git@github.com:pet-estatistica/apostila-git.git git clone endereço:namespace/project.git @@ -318,15 +351,20 @@ git push origin ## Traz estado do repositório remoto git pull origin +@ -``` - -<!-- ------------------------------------------- --> -\hlabel{routine11} -\routine{Manipule ramos remotos} +%%---------------------------------------------------------------------- -```{r, engine='bash', echo=TRUE, eval=FALSE} +\begin{itemize} +\item asdasd +\item asdas +\item +\end{itemize} +\begin{program}[H] + \caption{Manipule ramos remotos.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## ------------------------------------------- ## Realizando contribuições em um ramo remoto @@ -373,7 +411,7 @@ git commit -a -m "Altera classe do objeto retornado" ## Retorna ao ramo principal git checkout master -## Incorpora modificações realizadas no ramo bugfix +## Incorpora modificações realizadas no ramo bugfix git merge bugfix ## Envia as alterações ao repositório remoto @@ -383,15 +421,14 @@ git push origin master git branch -d bugfix ## Local git push :bugfix ## Remoto -``` - -<!-- \routine{Incorporar o remoto ao local} --> -<!-- ------------------------------------------- --> -\hlabel{routine12} -\routine{Adicione local remoto} +@ -```{r, engine='bash', eval=FALSE, echo=TRUE} +%%---------------------------------------------------------------------- +\begin{program}[H] + \caption{Adicione endereço remoto.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= ## Lista os servidores remotos, com endereço git remote -v @@ -421,4 +458,35 @@ git remote set-url origin --push --add endereço_remoto ## Envia as contribuições para os locais remotos git push origin -``` \ No newline at end of file +@ + +%%---------------------------------------------------------------------- + +\begin{program}[H] + \caption{Remove ramos de demanda, locais e remotos, já incorporados + aos ramos permanentes.} +\end{program} +<<engine="bash", echo=TRUE, eval=FALSE>>= +## Listar os ramos: +git branch -l ## Locais +git branch -r ## Remotos +git branch -a ## Todos +git branch --merged ## Incorporados ao atual + +## Remove ramos: +git branch -d bugfix ## Locais +git branch -dr origin/bugfix ## Remotos +git push --delete origin bugfix ## No origin +git push origin :bugfix ## Idem o anterior + +## Remove todos os ramos LOCAIS com 'issue' no nome. +git branch -l --merged | grep "issue" | xargs -n 1 git branch -d + +## Remove todos os ramos REMOTOS com 'issue' no nome. +git branch -r --merged | grep "issue" | xargs -n 1 git branch -dr + +## Acima da versão 2.5.0 pode-se usar +git branch -d `git branch l --merged` +git branch -dr `git branch r --merged` + +@ diff --git a/cap08/cap08_er.pdf b/cap08/cap08_er.pdf deleted file mode 100644 index 1d6cf525d9acae514357a18174ed04fe4eaffd52..0000000000000000000000000000000000000000 Binary files a/cap08/cap08_er.pdf and /dev/null differ diff --git a/git_tuto.Rmd b/git_tuto.Rmd deleted file mode 100644 index d9cad9ab46b41db6d9d249cc0662dba64a6af410..0000000000000000000000000000000000000000 --- 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 1e4eb8f7a448fc2532d90ce5e0d2fe0f853a020f..0000000000000000000000000000000000000000 --- 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/ diff --git a/images/GitMug.svg b/images/GitMug.svg new file mode 100644 index 0000000000000000000000000000000000000000..470d5565f221e54e5acec0786b8cfb404872271f --- /dev/null +++ b/images/GitMug.svg @@ -0,0 +1,2092 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448" + height="318.89764" + id="svg2" + version="1.1" + inkscape:version="0.48.4 r9939" + sodipodi:docname="GitMug.svg.2015_12_14_23_53_02.0.svg" + inkscape:export-filename="/home/walmes/Desktop/mugs/walmes2.png" + inkscape:export-xdpi="150" + inkscape:export-ydpi="150"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Send" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Send" + style="overflow:visible;"> + <path + id="path5371" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.2) rotate(180) translate(6,0)" /> + </marker> + <linearGradient + id="linearGradient8518" + osb:paint="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop8520" /> + </linearGradient> + <marker + inkscape:stockid="RazorWire" + id="RazorWire" + refX="0" + refY="0" + orient="auto" + style="overflow:visible"> + <path + id="path4987" + transform="scale(0.8,0.8)" + style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.1pt" + d="M 0.022727273,-0.74009011 L 0.022727273,0.69740989 L -7.7585227,3.0099099 L 10.678977,3.0099099 L 3.4914773,0.69740989 L 3.4914773,-0.74009011 L 10.741477,-2.8963401 L -7.7272727,-2.8963401 L 0.022727273,-0.74009011 z " /> + </marker> + <marker + inkscape:stockid="Arrow2Mend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Mend" + style="overflow:visible;"> + <path + id="path4782" + style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(0.6) rotate(180) translate(0,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lstart" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Lstart" + style="overflow:visible"> + <path + id="path4773" + style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(1.1) translate(1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow2Lend" + style="overflow:visible;"> + <path + id="path4169" + style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + transform="scale(1.1) rotate(180) translate(1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Lend" + orient="auto" + refY="0.0" + refX="0.0" + id="Arrow1Lend" + style="overflow:visible;"> + <path + id="path4151" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;" + transform="scale(0.8) rotate(180) translate(12.5,0)" /> + </marker> + <marker + inkscape:stockid="Torso" + orient="auto" + refY="0.0" + refX="0.0" + id="Torso" + style="overflow:visible"> + <g + id="g4360" + transform="scale(0.7)"> + <path + id="path4362" + d="M -4.7792281,-3.2395420 C -2.4288541,-2.8736027 0.52103922,-1.3019943 0.25792722,0.38794346 C -0.0051877922,2.0778819 -2.2126741,2.6176539 -4.5630471,2.2517169 C -6.9134221,1.8857769 -8.5210350,0.75201414 -8.2579220,-0.93792336 C -7.9948090,-2.6278615 -7.1296041,-3.6054813 -4.7792281,-3.2395420 z " + style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000" /> + <path + id="path4364" + d="M 4.4598789,0.088665736 C -2.5564571,-4.3783320 5.2248769,-3.9061806 -0.84829578,-8.7197331" + style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt" /> + <path + id="path4366" + d="M 4.9298719,0.057520736 C -1.3872731,1.7494689 1.8027579,5.4782079 -4.9448731,7.5462725" + style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt" /> + <rect + id="rect4368" + transform="matrix(0.527536,-0.849533,0.887668,0.460484,0,0)" + y="-1.7408575" + x="-10.391706" + height="2.7608147" + width="2.6366582" + style="fill-rule:evenodd;stroke-width:1.0000000pt" /> + <rect + id="rect4370" + transform="matrix(0.671205,-0.741272,0.790802,0.612072,0,0)" + y="-7.9629307" + x="4.9587269" + height="2.8614161" + width="2.7327356" + style="fill-rule:evenodd;stroke-width:1.0000000pt" /> + <path + id="path4372" + transform="matrix(0,-1.109517,1.109517,0,25.96648,19.71619)" + d="M 16.779951 -28.685045 A 0.60731727 0.60731727 0 1 0 15.565317,-28.685045 A 0.60731727 0.60731727 0 1 0 16.779951 -28.685045 z" + style="fill:#ff0000;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt" /> + <path + id="path4374" + transform="matrix(0,-1.109517,1.109517,0,26.82450,16.99126)" + d="M 16.779951 -28.685045 A 0.60731727 0.60731727 0 1 0 15.565317,-28.685045 A 0.60731727 0.60731727 0 1 0 16.779951 -28.685045 z" + style="fill:#ff0000;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt" /> + </g> + </marker> + <marker + inkscape:stockid="TriangleInL" + orient="auto" + refY="0.0" + refX="0.0" + id="TriangleInL" + style="overflow:visible"> + <path + id="path4281" + d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z " + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" + transform="scale(-0.8)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-1" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-4" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-8" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-2" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-0" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-6" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-3" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-8" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-9" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-4" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-38" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-2" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-4" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-9" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-0" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-3" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-46" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-0" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + <marker + inkscape:stockid="Arrow2Lend" + orient="auto" + refY="0" + refX="0" + id="Arrow2Lend-2-381" + style="overflow:visible"> + <path + inkscape:connector-curvature="0" + id="path4169-7-80" + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + transform="matrix(-1.1,0,0,-1.1,-1.1,0)" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="1" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="409.65975" + inkscape:cy="164.06048" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + units="cm" + inkscape:window-width="1867" + inkscape:window-height="1056" + inkscape:window-x="53" + inkscape:window-y="24" + inkscape:window-maximized="1" + showguides="true" + inkscape:guide-bbox="true" + inkscape:object-paths="false" + inkscape:snap-nodes="true" + inkscape:snap-bbox="false" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-733.46325)"> + <image + y="1005.1038" + x="27.100273" + id="image6663" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB3MAAABoCAYAAADrado9AAAABHNCSVQICAgIfAhkiAAAIABJREFU eJzs3Xl4VNX9x/H3ZLLvCRB2krCjAcIuKiS4UqsScAG3CoqobUGw1V9ra0lqa6u1BYpWRS2LC66A 4oZWGVYFWYJEkU0mYY8QJmSZLDOZ3x8xMUhIZpLZEj+v55lH4J77vSfHO3NO7nfOOQaHw+FARERE RERERERERERERET8SoCvKyAiIiIiIiIiIiIiIiIi0hqtWLGCzonJGAyGBl+duiXz8OwsLBbLGecH +qjeIiIiIiIiIiIiIiIiIiKtkslk4p7ps4jpkcq1f19Oh96pDZa3HDWzY80KuiQm8+S8OUyePBkA g5ZZFhERERERERERERERERFxn779B9Hv+vtIvXqyS+cd25PNsgfHs2ndapKSkrTMsoiIiIiIiIiI iIiIiIiIu8ydO5cOqekuJ3IBOvRO5cKps3n8X/MAzcwVEREREREREREREREREXGbzonJ51xa2Ubj ++CWFVn4+5g4HA6HZuaKiIiIiIiIiIiIiIiIiLjLkTzzOffIfeGFHAoKyhs8PzQqtvbPSuaKiIiI iIiIiIiIiIiIiHjB0acHE1x1xOnyjc3iFRERERERERERERERERERNwgNqGTDfoiyVp517MKuQWf9 m5K5IiIiIiIiIiIiIiIiIiJeMGJoD8yzLoGAiLOOXbg+56x/UzJXRERERERERERERERERMQLxvzz FajMc7q8krkiIiIiIiIiIiIiIiIiIt4QNpzjxuHknrBRXGLnkl4hVAGVQEg9xQO8XD0RERERERER ERERERERkZ+kz3cXseCmP5F9wzDW3pQCwNE93/HCY2vqLa9kroiIiIiIiIiIiIiIiIiIF3z60B1c N/Rlpi67F9gHQHTkcfLfuKbe8krmioiIiIiIiIiIiIiIiIh4gT33TdrfuZKA9tNq/62INgRQVG95 JXNFRERERERERERERERERLwgpV8HXn/VzL7i6r/nlsI7r66jf7+EessHerFuIiIiIiIiIiIiIiIi IiI/WT9/eDarZl7HW8t/DsCrGVPow2v87N9P1FteyVwRERERERERERERERERES8w9r6ba97ox5W7 nsVWcBGBsSUE9nsbe9Rl9ZbXMssiIiIiIiIiIiIiIiIiIl7wzOK92MNGEzz0FcKvWEfw8Nc5VjCc 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 3RwAAAAASUVORK5CYII= " + height="38.647503" + width="708.66144" /> + <g + style="fill:#ffffff" + id="g6982-7-6-7-1" + transform="translate(-92.547746,119.84903)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-1-7-2-8"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-65-8-6-8" + width="124.34758" + height="66.677376" + x="451.72687" + y="755.466" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-8-8-0-1" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-7-9-1-6"><rect + id="rect4089-8-4-6-5-4-9" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4532">git branch -a</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4494">git branch -vv</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4522">git branch <flowSpan + style="font-style:italic" + id="flowSpan4526">ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4496">git checkout <flowSpan + style="font-style:italic" + id="flowSpan4528">ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4524">git checkout -b <flowSpan + style="font-style:italic" + id="flowSpan4530">ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4706">git branch -d <flowSpan + style="font-style:italic" + id="flowSpan4708">ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4716">git branch -dr <flowSpan + style="font-style:italic" + id="flowSpan4718">rmt/ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4710" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-6-6-9-4" + width="50.926308" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-6-5-1-2" + y="754.96887" + x="478.75934" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-2-9-1-5" + y="754.96887" + x="478.75934" + sodipodi:role="line">Ramificação</tspan></text> + </g> + </g> + <image + y="745.89191" + x="91.858109" + id="image3283" + xlink:href="data:image/png;base64,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 " + height="141.73228" + width="141.73228" /> + <flowRoot + transform="translate(0,733.46325)" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + id="flowRoot6787" + xml:space="preserve"><flowRegion + id="flowRegion6789"><rect + y="83.532104" + x="528.05725" + height="14.647212" + width="1.767767" + id="rect6791" /></flowRegion><flowPara + id="flowPara6793" /></flowRoot> <flowRoot + transform="translate(0,733.46325)" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + id="flowRoot6797" + xml:space="preserve"><flowRegion + id="flowRegion6799"><rect + y="69.137428" + x="459.87195" + height="35.860416" + width="51.26524" + id="rect6801" /></flowRegion><flowPara + id="flowPara6803" /></flowRoot> <flowRoot + xml:space="preserve" + id="flowRoot2997" + style="fill:#ffff00;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Ubuntu;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;-inkscape-font-specification:Ubuntu;font-stretch:normal;font-variant:normal;text-anchor:middle;text-align:center;writing-mode:lr"><flowRegion + id="flowRegion2999"><rect + id="rect3001" + width="189.40359" + height="61.619305" + x="41.921329" + y="37.570164" + style="fill:#ffff00" /></flowRegion><flowPara + id="flowPara3003" /></flowRoot> <image + y="1470.4785" + x="1233.4435" + id="image3128" + xlink:href="data:image/png;base64,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 " + height="945" + width="403" /> + <text + xml:space="preserve" + style="font-size:27.52150726px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + x="162.17856" + y="914.8476" + id="text3286" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3288" + x="162.17856" + y="914.8476">Caneca Git</tspan></text> + <g + id="g4427" + transform="translate(-15.211161,1.999997)"> + <rect + ry="2.9997756" + y="745.13446" + x="456.97104" + height="21.137545" + width="280.09152" + id="rect3290" + style="fill:none;stroke:#000000;stroke-width:0.50158137;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + rx="3.019232" /> + <flowRoot + transform="translate(406.04488,662.35771)" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + id="flowRoot4085" + xml:space="preserve"><flowRegion + id="flowRegion4087"><rect + style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + y="83.784637" + x="54.2957" + height="24.139057" + width="278.62134" + id="rect4089" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4099">git config --global user.name "Walmes Zeviani"</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4115">git config --global user.email "walmes@ufpr.br"</flowPara></flowRoot> <rect + ry="1.5" + y="736.18231" + x="458.68613" + height="10.535714" + width="57.142857" + id="rect4116" + style="fill:#000000;fill-opacity:1;stroke:none" + rx="1.5" /> + <a + style="fill:#ffffff" + transform="translate(-2.6986288,-10.274237)" + id="a4112"> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + x="489.92398" + y="754.36591" + id="text4081" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="489.92398" + y="754.36591" + id="tspan4108">Configuração</tspan></text> + </a> + </g> + <g + style="fill:#ffffff" + id="g6901" + transform="translate(-9.7888184,24.584834)"> + <rect + ry="3" + y="755.28699" + x="451.54791" + height="30.263247" + width="74.044243" + id="rect3290-6" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + rx="3" /> + <flowRoot + transform="translate(401.10065,673.16766)" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + id="flowRoot4085-2" + xml:space="preserve"><flowRegion + id="flowRegion4087-2"><rect + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + y="83.784637" + x="54.2957" + height="67.932762" + width="266.17517" + id="rect4089-8" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4115-7">git init</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6889">git --bare init</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6807">git clone <flowSpan + id="flowSpan5015" + style="font-style:italic">url</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6785" /><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6795" /></flowRoot> <rect + ry="1.5" + y="746.45654" + x="453.38477" + height="10.535714" + width="33.684105" + id="rect4116-4" + style="fill:#000000;fill-opacity:1;stroke:none" + rx="1.5" /> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + x="469.92398" + y="754.36591" + id="text4081-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="469.92398" + y="754.36591" + id="tspan4108-3">Criação</tspan></text> + </g> + <g + style="fill:#ffffff" + id="g6982" + transform="translate(-14.861559,25.234272)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9" + width="126.77093" + height="39.041237" + x="451.65042" + y="755.38959" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4"><rect + id="rect4089-8-4" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + id="flowPara6785-7" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono">git status</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6978">git add <flowSpan + style="font-style:italic" + id="flowSpan4245">arq1 arq2</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6980">git commit -m "msg"</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4455">git commit --amend -m "<flowSpan + style="font-style:italic" + id="flowSpan4457">msg</flowSpan>"</flowPara><flowPara + id="flowPara6795-0" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2" + width="60.648388" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4" + y="754.36591" + x="479.92398" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1" + y="754.36591" + x="479.92398" + sodipodi:role="line">Fluxo básico</tspan></text> + </g> + </g> + <g + id="g4247" + transform="translate(207.74374,-91.835503)"> + <rect + style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-03" + width="73.904831" + height="30.476259" + x="455.54486" + y="966.59027" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-81" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(404.71884,883.66704)"><flowRegion + id="flowRegion4087-2-5"><rect + id="rect4089-8-7" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" /></flowRegion><flowPara + id="flowPara6807-4" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono">git stash</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara7734">git stash apply</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara7736">git stash list</flowPara><flowPara + id="flowPara6785-46" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /><flowPara + id="flowPara6795-80" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-0" + width="26.898392" + height="10.535714" + x="457.36005" + y="957.49164" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-6" + y="966.18402" + x="470.97714" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-324" + y="966.18402" + x="470.97714" + sodipodi:role="line">Stash</tspan></text> + </g> + <rect + style="fill:#f9f9f9;stroke:#000000;stroke-opacity:1" + y="350.86014" + x="224.19904" + height="265.71429" + width="231.42857" + id="rect3175" /> + <g + id="g6810"> + <g + transform="translate(-18,-6.204454)" + id="g4051"> + <path + inkscape:connector-curvature="0" + id="path3990" + d="m 255.63991,372.11594 c 0,231.3249 0,231.83 0,231.83" + style="fill:none;stroke:#ff4f00;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3992" + y="369.37595" + x="245.8224" + style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed, Italic'" + xml:space="preserve"><tspan + y="369.37595" + x="245.8224" + id="tspan3994" + sodipodi:role="line">stash</tspan></text> + </g> + <g + transform="translate(-22.502625,-2.7779119)" + id="g4096"> + <path + inkscape:connector-curvature="0" + id="path3990-6" + d="m 310.90373,368.6894 c 0,231.3249 0,231.83 0,231.83" + style="fill:none;stroke:#ff4f00;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3992-5" + y="365.9494" + x="291.07443" + style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed, Italic'" + xml:space="preserve"><tspan + y="365.9494" + x="291.07443" + id="tspan3994-3" + sodipodi:role="line">workspace</tspan></text> + </g> + <g + transform="translate(-33.131714,-8.3337555)" + id="g4117"> + <path + inkscape:connector-curvature="0" + id="path3990-8" + d="m 372.29401,374.24524 c 0,231.3249 0,231.83 0,231.83" + style="fill:none;stroke:#ff4f00;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3992-7" + y="371.50525" + x="361.41354" + style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed, Italic'" + xml:space="preserve"><tspan + y="371.50525" + x="361.41354" + id="tspan3994-7" + sodipodi:role="line">index</tspan></text> + </g> + <g + transform="translate(-31.988739,8.33376)" + id="g4138"> + <path + inkscape:connector-curvature="0" + id="path3990-66" + d="m 421.91221,357.57772 c 0,231.3249 0,231.83 0,231.83" + style="fill:none;stroke:#ff4f00;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3992-1" + y="354.83774" + x="412.42627" + style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed, Italic'" + xml:space="preserve"><tspan + y="354.83774" + x="412.42627" + id="tspan3994-2" + sodipodi:role="line">local</tspan></text> + </g> + <g + transform="translate(-24,3.3130726)" + id="g4159"> + <path + inkscape:connector-curvature="0" + id="path3990-86" + d="m 464.68465,362.12341 c 0,231.3249 0,231.83 0,231.83" + style="fill:none;stroke:#ff4f00;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" /> + <text + sodipodi:linespacing="125%" + id="text3992-0" + y="359.38342" + x="450.81207" + style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed, Italic'" + xml:space="preserve"><tspan + y="359.38342" + x="450.81207" + id="tspan3994-71" + sodipodi:role="line">remote</tspan></text> + </g> + </g> + <flowRoot + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans;font-stretch:normal;font-variant:normal;text-anchor:middle;text-align:center;writing-mode:lr" + id="flowRoot6910"><flowRegion + id="flowRegion6912" /><flowPara + id="flowPara6916" + style="-inkscape-font-specification:Sans;font-family:Sans;font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal;font-size:40px;text-anchor:middle;text-align:center;writing-mode:lr;line-height:125%">git init</flowPara></flowRoot> <flowRoot + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + id="flowRoot6943"><flowRegion + id="flowRegion6945" /><flowPara + id="flowPara6949">git init</flowPara></flowRoot> <g + id="g7032-7" + transform="translate(75.639665,-14.055867)" + style="stroke-width:0.5;stroke-miterlimit:4;stroke-dasharray:none"> + <rect + ry="2.1994665" + y="318.35968" + x="275.16357" + height="11.82847" + width="72.143547" + id="rect6992-7" + style="fill:#808080;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> + <flowRoot + transform="matrix(0.95789927,0,0,1,225.22354,-79.989727)" + id="flowRoot7024-1" + style="font-size:7px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" + xml:space="preserve"><flowRegion + id="flowRegion7026-1"><use + transform="matrix(1.0439511,0,0,1,-233.37074,78.735879)" + height="318.89764" + width="744.09448" + id="use7028-3" + xlink:href="#rect6992-7" + y="0" + x="0" /></flowRegion><flowPara + style="font-size:9.19565296px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara7030-0">git clone <<flowSpan + style="font-style:italic" + id="flowSpan7072">url</flowSpan>></flowPara></flowRoot> </g> + <g + id="g8654"> + <path + inkscape:connector-curvature="0" + id="path5409" + d="m 288.62191,378.44543 49.94338,0" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0.40000001;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow2Lend)" /> + <text + sodipodi:linespacing="125%" + id="text7074" + y="376.31113" + x="288.08191" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + xml:space="preserve"><tspan + y="376.31113" + x="288.08191" + id="tspan7076" + sodipodi:role="line">add <tspan + id="tspan7082" + style="font-style:italic">files</tspan></tspan></text> + </g> + <g + id="g8648" + transform="translate(0,2)"> + <path + inkscape:connector-curvature="0" + id="path5409-4" + d="m 440.00958,389.96193 -150.06101,0" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0.40000001;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow2Lend)" /> + <text + sodipodi:linespacing="125%" + id="text7074-1" + y="387.65833" + x="382.27258" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + xml:space="preserve"><tspan + y="387.65833" + x="382.27258" + id="tspan7076-5" + sodipodi:role="line">clone <tspan + id="tspan7082-7" + style="font-style:italic">url</tspan></tspan></text> + </g> + <g + id="g8660" + transform="translate(0,-2)"> + <path + inkscape:connector-curvature="0" + id="path5409-4-4" + d="m 439.6161,406.1382 -150.06101,0" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0.40000001;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow2Lend)" /> + <text + sodipodi:linespacing="125%" + id="text7074-1-6" + y="403.83463" + x="366.9841" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + xml:space="preserve"><tspan + y="403.83463" + x="366.9841" + id="tspan7076-5-7" + sodipodi:role="line">checkout <tspan + id="tspan7082-7-5" + style="font-style:italic">ref</tspan></tspan></text> + </g> + <g + transform="translate(50.66065,0.373643)" + id="g8654-6"> + <path + inkscape:connector-curvature="0" + id="path5409-8" + d="m 288.62253,378.44543 50.28008,0" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0.40000001;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow2Lend)" /> + <text + sodipodi:linespacing="125%" + id="text7074-7" + y="376.31113" + x="288.08191" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + xml:space="preserve"><tspan + y="376.31113" + x="288.08191" + id="tspan7076-8" + sodipodi:role="line">commit -m <tspan + style="font-style:italic" + id="tspan8702">msg</tspan></tspan></text> + </g> + <g + style="fill:#ffffff" + id="g6982-7" + transform="matrix(1.0059591,0,0,0.99611873,-95.637967,71.736663)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-1"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.4994871;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-65" + width="110.83653" + height="39.01984" + x="451.63391" + y="755.37299" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-8" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-7"><rect + id="rect4089-8-4-6" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + id="flowPara6795-0-1" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono">git gui</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3376">gitk --all</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3378">git difftool <flowSpan + style="font-style:italic" + id="flowSpan3382">refA</flowSpan>..<flowSpan + style="font-style:italic" + id="flowSpan3384">refB</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3380">git mergetool</flowPara></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-6" + width="23.505531" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-6" + y="754.84741" + x="465.04895" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-2" + y="754.84741" + x="465.04895" + sodipodi:role="line">GUIs</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-7-6" + transform="translate(4.3725271,209.65189)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-1-7"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-65-8" + width="114.74619" + height="39.52087" + x="451.64334" + y="755.38245" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-8-8" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-7-9"><rect + id="rect4089-8-4-6-5" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3380-9">git checkout <flowSpan + style="font-style:italic" + id="flowSpan4453">ref -- arq</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4338">git reset --soft <flowSpan + style="font-style:italic" + id="flowSpan4451">ref arq</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4332">git reset --hard <flowSpan + style="font-style:italic" + id="flowSpan4449">ref arq</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4445">git revert <flowSpan + style="font-style:italic" + id="flowSpan4447">ref</flowSpan></flowPara></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-6-6" + width="55.291245" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-6-5" + y="754.1814" + x="480.87219" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-2-9" + y="754.1814" + x="480.87219" + sodipodi:role="line">Restauração</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-0-7" + transform="translate(22.452953,77.5644)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-5-0"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-6-7" + width="164.36317" + height="30.494007" + x="451.65631" + y="754.98761" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-4-0" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-8-4"><rect + id="rect4089-8-4-0-7" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3310-3">git remote -v</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4591">git remote add<flowSpan + style="font-style:italic" + id="flowSpan4597"> rmt url</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4601">git remote set-url origin --add <flowSpan + style="font-style:italic" + id="flowSpan4603">url</flowSpan></flowPara></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-8-7" + width="40.291245" + height="10.535714" + x="453.71658" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-0-4" + y="754.20392" + x="473.99863" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-7-6" + y="754.20392" + x="473.99863" + sodipodi:role="line">Remotos</tspan></text> + </g> + </g> + <g + style="fill:#000000" + transform="translate(100.21385,167.32635)" + id="g7166"> + <rect + ry="3" + y="801.93829" + x="557.396" + height="21.476494" + width="79.547928" + id="rect3290-6-6" + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + rx="3" /> + <flowRoot + transform="translate(506.55699,719.45968)" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + id="flowRoot4085-2-6" + xml:space="preserve"><flowRegion + id="flowRegion4087-2-9"><rect + style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" + y="83.784637" + x="54.2957" + height="67.932762" + width="266.17517" + id="rect4089-8-5" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4734">git merge <flowSpan + style="font-style:italic" + id="flowSpan4728">ramoB</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4410">git rebase <flowSpan + style="font-style:italic" + id="flowSpan4412">ramoB</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6795-01" /></flowRoot> <rect + ry="1.5" + y="793.2843" + x="559.19824" + height="10.535714" + width="28.479778" + id="rect4116-4-1" + style="fill:#000000;fill-opacity:1;stroke:none" + rx="1.5" /> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + x="573.27991" + y="801.80115" + id="text4081-5-2" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + x="573.27991" + y="801.80115" + id="tspan4108-3-6">Fusão</tspan></text> + </g> + <g + style="fill:#ffffff" + id="g6982-0" + transform="translate(117.60172,25.234272)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-5"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-6" + width="87.385162" + height="30.385157" + x="449.58099" + y="755.35028" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-4" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-8"><rect + id="rect4089-8-4-0" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + id="flowPara6795-0-9" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono">git rm <flowSpan + style="font-style:italic" + id="flowSpan3308">arq1 arq2</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3310">git mv <flowSpan + style="font-style:italic" + id="flowSpan3314">velho novo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4443">git clean</flowPara></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-8" + width="40.291245" + height="10.535714" + x="451.71658" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-0" + y="754.20392" + x="471.99863" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-7" + y="754.20392" + x="471.99863" + sodipodi:role="line">Arquivos</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-7-6-7" + transform="translate(36.425368,119.84903)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-1-7-2"> + <rect + style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-65-8-6" + width="88.070244" + height="48.00246" + x="451.65128" + y="755.39038" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-8-8-0" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-7-9-1"><rect + id="rect4089-8-4-6-5-4" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4332-3">git fetch <flowSpan + style="font-style:italic" + id="flowSpan4419">rmt ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4413">git merge <flowSpan + style="font-style:italic" + id="flowSpan4421">rmt/ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4415">git pull <flowSpan + style="font-style:italic" + id="flowSpan4423">rmt ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4417">git push <flowSpan + style="font-style:italic" + id="flowSpan4425">rmt ramo</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara3499">git push <flowSpan + style="font-style:italic" + id="flowSpan3501">rmt :ramo</flowSpan></flowPara></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-6-6-9" + width="59.319164" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-6-5-1" + y="754.18591" + x="483.12463" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-2-9-1" + y="754.18591" + x="483.12463" + sodipodi:role="line">Sincronização</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-7-6-7-8" + transform="translate(-91.466905,198.33248)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-1-7-2-5"> + <rect + style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-65-8-6-4" + width="91.580658" + height="66.155731" + x="451.68176" + y="755.4209" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-8-8-0-8" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-7-9-1-9"><rect + id="rect4089-8-4-6-5-4-3" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4417-1">git log --oneline</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4696">git reflog</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4690">git diff</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4692">git diff --staged</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4686">git diff <flowSpan + style="font-style:italic" + id="flowSpan4700">refA</flowSpan>..<flowSpan + style="font-style:italic" + id="flowSpan4698">refB</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4694">git show <flowSpan + style="font-style:italic" + id="flowSpan4702">ref</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4406">git blame <flowSpan + style="font-style:italic" + id="flowSpan4408">arq</flowSpan></flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara4688" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-6-6-9-7" + width="40.390594" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-6-5-1-5" + y="754.1814" + x="473.42188" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-2-9-1-4" + y="754.1814" + x="473.42188" + sodipodi:role="line">Inspeção</tspan></text> + </g> + </g> + <g + id="g8710" + transform="translate(-21.803341,-4.857143)"> + <image + width="38.587196" + height="38.248711" + xlink:href="data:image/png;base64,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 " + id="image8679" + x="110.15666" + y="945.08514" /> + <text + sodipodi:linespacing="89.999998%" + id="text3286-1" + y="962.83948" + x="153.02571" + style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:89.99999762%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + xml:space="preserve"><tspan + y="962.83948" + x="153.02571" + id="tspan3288-2" + sodipodi:role="line">PET EstatÃstica</tspan><tspan + id="tspan8703" + y="980.83948" + x="153.02571" + sodipodi:role="line">UFPR</tspan></text> + </g> + <g + id="g4247-5" + transform="translate(143.687,-30.682727)"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-03-9" + width="105.07441" + height="21.531878" + x="455.53149" + y="966.33038" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-81-2" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(404.71884,883.66704)"><flowRegion + id="flowRegion4087-2-5-6"><rect + id="rect4089-8-7-2" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none" /></flowRegion><flowPara + id="flowPara6807-4-2" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono">git tag</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara7736-5">git tag -a <flowSpan + style="font-style:italic" + id="flowSpan3433">vs</flowSpan> -m "<flowSpan + style="font-style:italic" + id="flowSpan3435">msg</flowSpan>"</flowPara><flowPara + id="flowPara6785-46-2" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /><flowPara + id="flowPara6795-80-5" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-0-1" + width="21.630535" + height="10.535714" + x="457.36005" + y="957.49164" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-6-5" + y="965.03198" + x="468.27573" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-324-5" + y="965.03198" + x="468.27573" + sodipodi:role="line">Tags</tspan></text> + </g> + <rect + style="fill:#ffffff;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect6019" + width="130.71428" + height="149.78568" + x="306.85715" + y="745.93231" + rx="13.384523" + ry="13.384522" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="341.20477" + y="763.02649" + id="text5019-41-8" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-7-2" + x="341.20477" + y="763.02649" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">PET Workflow</tspan></text> + <g + id="g6106" + transform="translate(8.4528788,-50)"> + <g + id="g6089"> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="348.00964" + y="923.80316" + id="text5019" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021" + x="348.00964" + y="923.80316" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">add</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="360.42633" + y="939.60791" + id="text5019-4" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-4" + x="360.42633" + y="939.60791" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">commit</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="385.74792" + y="923.02917" + id="text5019-5" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-1" + x="385.74792" + y="923.02917" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">push</tspan></text> + <path + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:0.29741126;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path5055" + sodipodi:cx="318.88394" + sodipodi:cy="138.76372" + sodipodi:rx="7.0089288" + sodipodi:ry="7.3660712" + d="m 325.89287,138.76372 c 0,4.06817 -3.138,7.36607 -7.00893,7.36607 -3.87092,0 -7.00893,-3.2979 -7.00893,-7.36607 0,-4.06817 3.13801,-7.36607 7.00893,-7.36607 3.87093,0 7.00893,3.2979 7.00893,7.36607 z" + transform="matrix(1.723474,0,0,1.6399117,-176.52672,693.7113)" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 363.96505,913.27582 -2.42851,4.42859" + id="path8019-1" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 379.78754,931.09193 3.57143,-3.57143" + id="path8019-4" + inkscape:connector-curvature="0" /> + </g> + <g + id="g6069"> + <path + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:0.16014452;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path5055-4" + sodipodi:cx="318.88394" + sodipodi:cy="138.76372" + sodipodi:rx="7.0089288" + sodipodi:ry="7.3660712" + d="m 325.89287,138.76372 c 0,4.06817 -3.138,7.36607 -7.00893,7.36607 -3.87092,0 -7.00893,-3.2979 -7.00893,-7.36607 0,-4.06817 3.13801,-7.36607 7.00893,-7.36607 3.87093,0 7.00893,3.2979 7.00893,7.36607 z" + transform="matrix(3.2007374,0,0,3.0455503,-652.91124,464.64388)" /> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + x="386.82172" + y="864.94324" + id="text5019-5-9" + sodipodi:linespacing="80.000001%"><tspan + sodipodi:role="line" + id="tspan5021-1-8" + x="386.82172" + y="864.94324" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">novo</tspan><tspan + sodipodi:role="line" + x="386.82172" + y="872.14325" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + id="tspan6023">issue</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + x="390.4577" + y="885.47723" + id="text5019-5-6" + sodipodi:linespacing="80.000001%"><tspan + sodipodi:role="line" + id="tspan5021-1-6" + x="390.4577" + y="885.47723" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">sincroniza</tspan><tspan + sodipodi:role="line" + x="390.4577" + y="892.67725" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + id="tspan6046">devel</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + x="386.61542" + y="904.17596" + id="text5019-5-3" + sodipodi:linespacing="80.000001%"><tspan + sodipodi:role="line" + id="tspan5021-1-1" + x="386.61542" + y="904.17596" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">novo</tspan><tspan + sodipodi:role="line" + x="386.61542" + y="911.37598" + style="font-size:9px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + id="tspan6048">ramo</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:80.00000119%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + x="348.56888" + y="905.29077" + id="text5019-5-37" + sodipodi:linespacing="80.000001%"><tspan + sodipodi:role="line" + id="tspan5021-1-0" + x="348.56888" + y="905.29077" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:end;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">merge</tspan><tspan + sodipodi:role="line" + x="348.56888" + y="912.49078" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:end;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + id="tspan6021">request</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="302.14163" + y="877.58008" + id="text5019-6" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-70" + x="302.14163" + y="877.58008" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'"><tspan + style="font-style:italic" + id="tspan6050">ramo</tspan> -> devel</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 354.13645,905.19432 -3.57143,-3.57142" + id="path8019-3" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 384.90059,872.66503 2.93605,4.10971" + id="path8019-9" + inkscape:connector-curvature="0" /> + </g> + <g + transform="translate(-0.50507627,-0.12626907)" + id="g6052"> + <path + sodipodi:type="arc" + style="fill:none;stroke:#000000;stroke-width:0.20900948;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="path5055-4-4" + sodipodi:cx="318.88394" + sodipodi:cy="138.76372" + sodipodi:rx="7.0089288" + sodipodi:ry="7.3660712" + d="m 325.89287,138.76372 c 0,4.06817 -3.138,7.36607 -7.00893,7.36607 -3.87092,0 -7.00893,-3.2979 -7.00893,-7.36607 0,-4.06817 3.13801,-7.36607 7.00893,-7.36607 3.87093,0 7.00893,3.2979 7.00893,7.36607 z" + transform="matrix(2.4524272,0,0,2.3335218,-424.58564,525.43285)" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" + d="m 357.21288,832.07895 c -5.2287,-0.1278 -6.90301,-2.48141 -6.90301,-2.48141" + id="path5141" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" + d="m 337.13339,842.58885 c 3.57478,3.64035 3.07041,6.50943 3.07041,6.50943" + id="path5141-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="318.83801" + y="842.22296" + id="text5019-44" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-49" + x="318.83801" + y="842.22296" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">inÃcio</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="327.32019" + y="828.56226" + id="text5019-41" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-7" + x="327.32019" + y="828.56226" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">conclui</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="310.8916" + y="865.52649" + id="text5019-51" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-76" + x="310.8916" + y="865.52649" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">milestone</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="368.57019" + y="835.52655" + id="text5019-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-42" + x="368.57019" + y="835.52655" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">tag</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="375.17731" + y="851.06219" + id="text5019-0" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-9" + x="375.17731" + y="851.06219" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">devel -> master</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 371.28336,859.41116 2.25481,-4.51952" + id="path8019-94" + inkscape:connector-curvature="0" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 340.3989,847.54101 0,5.05076" + id="path8019-5" + inkscape:connector-curvature="0" /> + </g> + <g + id="g6100"> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="m 350.50923,901.64267 c 0,0 -6.10798,-29.65466 9.59644,-16.92005 15.273,12.38475 2.65166,30.93593 2.65166,30.93593" + id="path8522" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow2Lend-2)" + d="m 358.99157,883.95442 3.77603,3.35436" + id="path8019-39" + inkscape:connector-curvature="0" /> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="359.07361" + y="881.54309" + id="text5019-51-0" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-76-8" + x="359.07361" + y="881.54309" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">reparos</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-2" + transform="translate(-228.38477,157.65594)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-7"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-9" + width="131.5" + height="57.403542" + x="451.65039" + y="754.88446" + ry="3" + rx="3" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-7" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-3"><rect + id="rect4089-8-4-3" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6424">sudo apt-get install git \</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6426"> git-core git-man</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6520"> git-gui git-doc </flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6518"> gitk meld ssh</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6516"> openssh-server</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6428"> openssh-client</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6422" /><flowPara + id="flowPara6795-0-6" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-0" + width="69.234688" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-01" + y="754.36591" + x="487.92398" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-8" + y="754.36591" + x="487.92398" + sodipodi:role="line">Instalação Linux</tspan></text> + </g> + </g> + <g + style="fill:#ffffff" + id="g6982-2-6" + transform="translate(-228.3848,225.73097)"> + <g + transform="translate(82.579973,-0.64943796)" + style="fill:#ffffff" + id="g6901-7-7-9"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + id="rect3290-6-9-9-5" + width="131.5" + height="21.972816" + x="451.65042" + y="755.31519" + ry="3.0000002" + rx="2.9999998" /> + <flowRoot + xml:space="preserve" + id="flowRoot4085-2-1-7-1" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + transform="translate(400.74351,672.63195)"><flowRegion + id="flowRegion4087-2-4-3-8"><rect + id="rect4089-8-4-3-9" + width="266.17517" + height="67.932762" + x="54.2957" + y="83.784637" + style="text-align:start;text-anchor:start;fill:#f45a00;fill-opacity:1;stroke:none" /></flowRegion><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6422-6">ssh-keygen -t rsa -C "email"</flowPara><flowPara + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" + id="flowPara6508">ssh -T git@url</flowPara><flowPara + id="flowPara6795-0-6-6" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;font-family:Ubuntu Mono;-inkscape-font-specification:Ubuntu Mono" /></flowRoot> <rect + style="fill:#000000;fill-opacity:1;stroke:none" + id="rect4116-4-2-0-9" + width="69.234688" + height="10.535714" + x="453.38477" + y="746.45654" + ry="1.5" + rx="1.5" /> + <text + sodipodi:linespacing="125%" + id="text4081-5-4-01-3" + y="754.36591" + x="487.92398" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu" + xml:space="preserve"><tspan + id="tspan4108-3-1-8-0" + y="754.36591" + x="487.92398" + sodipodi:role="line">Chaves públicas</tspan></text> + </g> + </g> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="74.385033" + y="1014.4616" + id="text5019-5-37-9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-1-0-0" + x="74.385033" + y="1014.4616" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">https://gitlab.c3sl.ufpr.br/pet-estatistica</tspan></text> + <text + xml:space="preserve" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + x="88.178001" + y="1001.1498" + id="text5019-5-37-9-0" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5021-1-0-0-5" + x="88.178001" + y="1001.1498" + style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">https://github.com/pet-estatistica</tspan></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans" + x="544.31201" + y="507.23492" + id="text6576" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan6578" + x="544.31201" + y="507.23492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Alcides Conte Neto</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="518.48492" + id="tspan6580" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">neto_conte@hotmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="529.73492" + id="tspan6582" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" /><tspan + sodipodi:role="line" + x="544.31201" + y="540.98492" + id="tspan6584" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">Ângela Legey</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="552.23492" + id="tspan6586" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">angelalegey@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="563.48492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6588" /><tspan + sodipodi:role="line" + x="544.31201" + y="574.73492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6590">Jhenifer Caetano</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="585.98492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6592">jhenicaet@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="597.23492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6594" /><tspan + sodipodi:role="line" + x="544.31201" + y="608.48492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6596">Gabriel Sartori</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="619.73492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6598">gabrielsartori2008@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="630.98492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6600" /><tspan + sodipodi:role="line" + x="544.31201" + y="642.23492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6602">Eduardo Junior</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="653.48492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6604">edujrrib@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="664.73492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6608" /><tspan + sodipodi:role="line" + x="544.31201" + y="675.98492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6610">Alessandra Zeizer</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="687.23492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6612">alessandra.zeizer@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="698.48492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6614" /><tspan + sodipodi:role="line" + x="544.31201" + y="709.73492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6616">Daniel Ikenaga</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="720.98492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6618">oladani@gmail.com</tspan><tspan + sodipodi:role="line" + x="544.31201" + y="732.23492" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans" + id="tspan6606" /></text> + <text + xml:space="preserve" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + x="539.21051" + y="1016.0553" + id="text5019-5-37-9-1" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan5021-1-0-0-6" + x="539.21051" + y="1016.0553" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'">Apostila Git PET EstatÃstica:</tspan><tspan + sodipodi:role="line" + x="539.21051" + y="1025.0553" + style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Ubuntu Condensed;-inkscape-font-specification:'Ubuntu Condensed,'" + id="tspan3439">https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git</tspan></text> + </g> +</svg> diff --git a/images/apostila_capa.pdf b/images/apostila_capa.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5f66157d82811f7cfea849cbac4714fa9847f0ee Binary files /dev/null and b/images/apostila_capa.pdf differ diff --git a/plano.md b/plano.md index 6d0a46b70d342a8146d00909e7a0543becc03e06..95012b8ee792556f37f1821f436a1904c3f91d27 100644 --- a/plano.md +++ b/plano.md @@ -29,7 +29,7 @@ 1. Habilitar comunicação 2. Gerenciar repositórios 3. Fluxo de trabalho - 4. MacanÃsmos de colaboração + 4. Mecanismos de colaboração 1. Issues e merge request 2. Fork e pull request 5. Integração contÃnua @@ -54,7 +54,7 @@ 1. Clonar, modificar e subir 2. Resolver um bug 3. Incorporar o remoto ao local - 4. Resolver confito de merge + 4. Resolver conflito de merge 5. Voltar o projeto para um commit 6. Deletar ramos 7. Criar ramo de um commit passado @@ -80,11 +80,11 @@ e *Cheat Sheet*. + Walmes: Deixar pronto o conteúdo referente ao GitHub dentro do capÃtulo 5. -2. 2015-11-03: +2. 2015-11-03 [week02]: + Walmes: terminar o que tem para ser feito para GitHub, adicionar chaves, verificar conexão, criar renomear projeto, clonar, modificar e subir. Renomear, deletar e transferir projeto. - + Gabriel: Descrever o usdo do `init`, `add`, `commit`, definir as + + Gabriel: Descrever o uso do `init`, `add`, `commit`, definir as três áreas de presença das modificações e acompanhar modificações com `diff`, `log`, `status` e `reflog`. + Ângela: Incluir as ilustrações dos modelos de workflow. @@ -92,13 +92,13 @@ versão preliminar da apostila correspondentes à Linux e Windows. + Eduardo: concluir as seções sobre uso da `git gui`, `gitk`, `gitg` e `gitx`. - + Alessandra: configurar conexão serviador via ssh, criar e + + Alessandra: configurar conexão servidor via ssh, criar e transferir as chaves públicas, criar um repositório no servidor e cloná-lo. + Alcides: concluir o dicionário de termos. + Daniel: concluir o conteúdo do *cheat sheet*. -3. 2015-11-10: - + Walmes: escrever para o GitLab o mesmo contúdo para presente para o +3. 2015-11-10 [week03]: + + Walmes: escrever para o GitLab o mesmo conteúdo para presente para o GitHub. Isso vai de uma breve descrição das funcionalidades, como criar conta e gerenciar um repositório. + Gabriel: **finalizar o trabalho da semana anterior**. Escrever @@ -114,21 +114,21 @@ Jhenifer. + Daniel: Definir o conteúdo previsto no *cheat sheet* e concluir o capÃtulo sobre SCV. Revisar o capÃtulo da Ângela. -4. 2015-11-17: - + Walmes: descrever os mecanÃsmos de colaboração com interfaces web: +4. 2015-11-17 [week04]: + + Walmes: descrever os mecanismos de colaboração com interfaces web: issue, fork e merge request. + Gabriel: Acréscimos de revisão do capÃtulo. Revisar os apêndices do Alcides. + Ângela: Descrever o fluxo de trabalho do PET. Revisar o capÃtulo da Jhenifer. - + Jhenifer: Acrécimos de revisão. Revisão do capÃtulo da Alessandra. + + Jhenifer: Acréscimos de revisão. Revisão do capÃtulo da Alessandra. + Eduardo: Documentar o uso das ferramentas de merge: meld, kdiff3 e p4merge. - + Alessandra: Acréscismos e revisão. Revisar o capÃtulo da Ângela. - + Alcides: Acréscismos e revisão. Revisar o capÃtulo do Gabriel. + + Alessandra: Acréscimos e revisão. Revisar o capÃtulo da Ângela. + + Alcides: Acréscimos e revisão. Revisar o capÃtulo do Gabriel. + Daniel: **finalizar todo o trabalho da semana anterior**. Concluir o capÃtulo sobre Git com o RStudio -5. 2015-11-24: +5. 2015-11-24 [week05]: + Gabriel: Concluir a revisão **pendente** do próprio capÃtulo e revisar o capÃtulo da Ângela que foi assumido pelo Daniel. + Ângela: Corrigir o que estiver disponÃvel do capÃtulo do Walmes. @@ -144,7 +144,7 @@ + Daniel: Concluir o trabalho **acumulado de 2 semanas** e assim concluir sobre Sistemas de Controle de Versão, *Cheat Sheet* e uso de Git no RStudio. -6. 2015-12-01: +6. 2015-12-01 [week06]: + TODOS: colocar as figuras em ambiente Latex (`center > figure > includegraphics + caption`). Controlar o tamanho das figuras para não ultrapassarem as margens nem ficarem pequenas demais. Colocar @@ -170,7 +170,7 @@ + Alcides: Corrigir o capÃtulo 5 disponibilizado na sexta. + Quem se interessar: Pensar numa capa para a apostila, fazer esboço, *brainstorm*. -7. 2015-12-08: +7. 2015-12-08 [week07]: + Alcides: Terminar de corrigir o cap 5 (**pendencia**) e colocar o dicionário de termos em um ambiente LaTex apropriado. + Alessandra: Fazer adequações no capÃtulo 4 e depois de sexta @@ -184,3 +184,23 @@ + Gabriel: Disponibilizar o capÃtulo 3 para o Eduardo até sexta. + Walmes: Juntar todos os capÃtulos e gerar a Apostila Git. 8. 2015-12-15: Apostila Git concluÃda! + + Daniel: Não concluiu nenhum dos compromissos assumidos. As + pendências devem ser incorporadas na segunda fase do Projeto. + + Gabriel: Enviou de forma inacabada os compromissos que assumiu; + + Ângela: Fez a capa. Concluiu a primeira fase da apostila sem nenhuma + pendência; + + Jhenifer: Concluiu a primeira fase da apostila sem nenhuma + pendência; + + Walmes: Concluiu a primeira fase da apostila sem nenhuma pendência; + + Eduardo: Concluiu com tudo em dia + + Alessandra: Concluiu a primeira fase da apostila sem nenhuma + pendência; + + Alcides: Fez as modificações mas não pediu MR. + +[week01]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week01 +[week02]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week02 +[week03]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week03 +[week04]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week04 +[week05]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week05 +[week06]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week06 +[week07]: https://gitlab.c3sl.ufpr.br/pet-estatistica/apostila-git/commits/week07