Principio Básico do Git e do Github Para Usuários Linux

 No dia 06/04/2015 o Git completou 10 anos (Dois dias apos eu ter lançado o artigo "A ameaça eminente do software proprietário" e também dois dias depois do meu aniversário).
 Vamos então ao básico do Git e Github que inclusive fará parte do meu próximo vídeo.





O sistema de controle de revisão distribuído é um doce passo a frente do Subversion, CVS, Mercurial, e de todos esse outros temos testado. Ele é ótimo para desenvolvimento distribuído, quando se tem múltiplos contribuintes trabalhando no mesmo projeto, e é excelente para testes seguros de todos os tipos de mudanças loucas. Vamos utilizar uma conta livre no Github para a pratica assim podemos saltar diretamente e começar a fazer as coisas.

Conceitualmente Git é diferente de outros sistemas de controle de revisão (revision control systems). RCS antigos rastreavam as alterações nos arquivos, que você pode ver quando você cutuca por aí em seus arquivos de configuração. A aproximação do Git é mais parecido com filesystem snapshots, onde cada commit ou estado salvo é um snapshot completo ao invés de um arquivo cheio de diffs. Git é space-efficient por ele armazena somente as alterações em cada snapshot, e linka aos arquivos inalterados. Todas as alterações são feitas a base de checksum, então você é assegurado da integridade do dado, e sempre sendo capaz de reverter alterações.

Git é muito rápido, por que seu trabalho é todo feito no seu PC local e depois empurrado para um repositório remoto. Isso torna tudo o que você faz totalmente seguro, por que nada afeta o repo remoto até que você empurra as alterações para ele. E mesmo depois você tem mais um failsafe: branches. O branching system do Git é brilhante. Ele Cria um branch a partir do seu master branch, desempenha todos os meios de experiencias terríveis, e depois realiza nuke ou realiza push upstream. Quando realiza upstream outros contribuidores podem trabalhar nele, ou você pode gerar um pull request para tê-lo revisado, e então depois ele passa a inspeção para emergi-lo no master branch.

Então e se, depois de todo esse cuidado, ele ainda explodir o master branch? Sem preocupações, por que você pode reverter seu merge.



Pratique no Github

O jeito mais rápido de por o Git na prática é abrindo uma conta livre no Github. A figura número 1 mostra o meu playground Github testado e nomeado. As novas contas Github vem com um repo prefab povoado por um arquivo README, licença, e botões para rapidamente gerar bug reports, pull requests, Wikis, e outros recursos úteis.

Contas livres no Github somente permitem repositórios públicos. Isso permite que qualquer um visualize e baixe seus arquivos. No entanto, ninguém pode realizar commits ao menos que eles tenham uma conta no Github e você tenha os aprovado como colaboradores. Se você quiser um repo privado escondido do mundo, você precisa de uma paid membership. Sete pratas por mês lhe oferece cinco repos privados, e repos públicos ilimitados como contribuidores ilimitados.

Github fornece muito bem URLs copy-and-paste para clonagem de repositórios. Então você gerar um diretório no seu computador para seu repositório, e depois clonar dentro dele:
$ mkdir git-repos
$ cd git-repos
$ git clone https://github.com/AlracWebmaven/playground.git
Cloning into 'playground'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
Checking connectivity... done.
$ ls playground/
LICENSE README.md

Todos os arquivos são copiados para o seu computador, e você pode ler, editar, e excluí-los bem como qualquer outro arquivo. Vamos melhorar o README.md e aprender a maravilha do Git branching.

Branching

Git branches são gloriosamente excelentes para realizar e testar alterações com segurança. Você pode gerar e destruí-los todos que você quiser. Vamos gerar um README.md para edição:
$ cd playground
$ git checkout -b test
Switched to a new branch 'test'
Execute git status para visualizar aonde você está:
$ git status

On branch test
nothing to commit, working directory clean

Quais branches você tem gerado?
$ git branch
* test
master
O asterisco indica em qual branch você está. Master é o seu main branch, aquele que você nunca quer realizar quaisquer alterações até que ele tenham sido testado em um branch. Agora realize algumas alterações no README.md, e depois verifique seu status novamente:
$ git status
On branch test
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Isso não é legal? Git lhe diz o que está acontecendo, e lhe dá dicas. Para descartar sua alterações, execute
$ git checkout README.md
Ou você pode excluir todo o branch:
$ git checkout master
$ git branch -D test
Ou você pode mandá-lo rastrear o arquivo:
$ git add README.md
$ git status
On branch test
Changes to be committed:
(use "git reset HEAD ..." to unstage)
     modified: README.md
Nesse estágio Git está rastreando o README.md, e está disponível para todos os seus branches. O Git lhe oferece uma dica útil – Se mudar de ideia e não quiser que o Git rastreie esse arquivo, execute git reset HEAD README.md. Esse, e toda atividade do Git, é rastreado no diretório .git no seu repositório. Tudo está em arquivo no formato de texto simples: arquivos, checksums, qual usuário fez o que, repos remotos e locais -- tudo.
E se você possuir múltiplos arquivos para adicionar? Você pode lista cada um deles, por exemplo git add file1 file2 file2, ou adicionar todos os arquivos com o git add *.
Quando há arquivos excluídos, você pode utilizar git rm nomeDoArquivo, que somente os desordena do Git e não os exclui do seu sistema. Se você possuir um monte de arquivos excluídos, utilize git add -u.

Committing Files

Agora vamos alocar (commit) nosso arquivo alterado. Isso o adiciona ao nosso branch e não fica mais disponível para os outros branches:
$ git commit README.md
[test 5badf67] changes to readme
 1 file changed, 1 insertion(+)
Será lhe pedido para fornecer uma mensagem commit . É uma boa prática gerar as suas mensagens commit detalhadas e especificar, mas por enquanto não vamos ser exigentes demais. Agora o seu arquivo editado tem sido alocado para o branch test. Ele não tem sido fundido ao master ou realizado push upstream; ele vai somente reuní-lo lá. Esse é um bom ponto de parada se você precisar ir fazer outra coisa.
E se você tiver múltiplos arquivos para alocar alocar? Você pode alocar arquivos específicos, ou todos os arquivos disponíveis:
$ git commit file1 file2
$ git commit -a
Como você sabe quais commits ainda não tem sido realizado pushe upstream, mas ainda não reunidos em branches? O git status não lhe dirá, então utilize esse comando:
$ git log --branches --not --remotes
commit 5badf677c55d0c53ca13d9753344a2a71de03199
Author: Carla Schroder
Date: Thu Nov 20 10:19:38 2014 -0800
    changes to readme
Isso lista commits não fundidos, e quando ele não retorna nada, então todos os commits tem sido realizado pushe upstream. Agora vamos push esse commit upstream:
$ git push origin test
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/AlracWebmaven/playground.git
 * [new branch] test -> test
Suas credenciais de login Github podem ser solicitadas. O Git gera cache delas por 15 minutos, e você pode alterar isso. Esse exemplo define o cache em duas horas:
$ git config --global credential.helper 'cache --timeout=7200'
Agora vá ao Github e olhe seu novo branch. Github lista todos os seus branches, e você pode pré-visualizar seus arquivos nos diferentes branches (2ª imagem).


2ª imagem: Seu novo commit e branch no Github.

Agora você pode criar uma pull request ao clicar o botão Compare & Pull Request. Isso lhe dá uma nova chance de revisar suas alterações antes de fundir (merge) com o master. Você pode também gerar pull requests a partir da linha de comando no seu computador, mas esse é um processo trabalhoso, ao ponto que você pode todos os tipos de ferramentas por facilitar o processo por toda a Web. Então, por enquanto, utilizaremos os bons e rápidos botões do Github buttons.

Github lhe deixa visualizar seus arquvos em texto simples, e também possui suporte a linguagens de marcação (markup languages), então você cpnsegue visualizar uma pré-visualização gerada. Nesse ponto você pode push mais alterações no mesmo branch. Você consegue também realizar edições diretamente no Github, mas quando você faz isso, você obterá conflitos entre a versão online e sua versão local. Quando você estiver satisfeito com as suas alterações, clique no botão Merge pull request. Você terá que clicar duas vezes. Github automaticamente examina sua pull request para verificar se ele pode ser fundido limpamente, e se houver conflitos, você terá que concertá-los.

Um outro recurso legal no Github é quando você possui múltiplos branches, você pode escolher qual fundir ao clicar o botão Edit à direita das lista de branches (3ª imagem):

3ª imagem: Escolhendo quais branches emergir ou fundir.

Depois de você ter fundido, clique no botão Delete Branch para manter tudo organizado. Depois em seu computador local, exclua o branch ao enviar primeiro as alterações ao master, e depois você pode excluir seu branch sem que o Git reclame:
$ git checkout master
$ git pull origin master
$ git branch -d test
Você pode excluir um branch de forma bruta (force-delete) com um uppercase -D:
$ git branch -D test

Revertendo Alterações

Novamente, o Github método pointy-clicky é o mais prático. Ele lhe exibe uma lista de todas as alterações, e você pode reverte qualquer uma delas ao clicar o botão apropriado. Você poode até mesmo restaurar branches excluídos.
Você pode também fazer todas essas tarefas exclusivamente a partir da sua linha de comando, que é um ótimo tópico para outro dia por que ele é complexo. Para um tutorial exaustivo sobre o Git. Teste o Git book gratuito.

Comente com o Facebook:

Nenhum comentário:

Postar um comentário

Viu algum erro e quer compartilhar seu conhecimento? então comente aí.

Observação: somente um membro deste blog pode postar um comentário.

Marcadores

A pior história sobre Linux que já ouvi (5) A.I (2) ambiente gráfico (19) AMD (14) analise (10) Andriod (16) android (7) Apple (1) arm (5) artigo (5) aws (1) bc (23) benchmark (6) BetrFS (1) blackhat (1) BSDs (30) btrfs (32) bugs (2) Caixa de Ferramentas do UNIX (19) canto do Diego Lins (2) certificações Linux (7) Código Fonte (54) comandos (31) comp (1) compressores (5) container (7) CPU (19) cracker (1) criptografia (5) crowdfunding (9) cursos (24) daemons (13) Debian (31) desempenho (1) desenvolvimento (90) desktop (19) DevOps (3) DevSecOps (4) dic (1) Dica de leitura (90) dica DLins (2) dicas do Flávio (27) Dicas TechWarn (1) diet libc (3) diocast (1) dioliunx (3) distribuições Linux (14) Docker (12) DragonflyBSD (22) driver (1) ead Diolinux (2) edição de vídeo (5) embarcados (1) EMMI Linux (4) emuladores (9) endless (5) English interview (3) Enless OS (2) entrevista (17) espaço aberto (82) evento (6) facebook (1) Fedora (10) filesystem (82) financiamento coletivo (2) fork (4) fox n forests (4) FreeBSD (20) Funtoo Linux (13) games (94) gerenciadores de pacotes (4) glaucus (3) GOG (3) google (9) gpu (3) hacker (2) hardware (104) hash (1) helenos (3) I.A (1) init system (11) Intel (15) inteligencia artificial (2) IoT (1) ispconfig (1) jogos (38) kde (1) kernel (138) lançamento (64) leis (1) LFCS (1) libs (2) licenças (8) Linus (16) linus torvalds (2) Linux (194) linux foundation (3) linux para leigos (1) live (5) LPI (8) LTS (1) Mac (1) machine learning (1) matemática (9) mesa redonda (27) microcontroladores (1) microsoft (6) microst (1) muito além do GNU (165) musl (3) não viva de boatos (9) navegadores (5) NetBSD (7) newlib (1) nim (1) nintendo (1) novatec (17) novidades (1) nuvem (1) o meu ambiente de trabalho (3) off-topic (12) open source (84) OpenBSD (7) OpenShift (1) oracle (1) os vários sabores de Linux (43) padrim (2) palestras e eventos (5) partições (6) pentest (8) performance (1) pipewire (1) plan9 (1) playstation (1) processadores (30) professor Augusto Manzano (11) Programação (64) promoção (1) propagandas com Linux (8) ps4 (1) real-time. (1) Red Hat (23) redes (4) resenha nerd (4) Resumo da Semana do Dlins (2) resumo do Tux (19) retrospectiva Linux (1) risc-V (14) RISCV (13) rtos (1) runlevel (2) rust (12) segurança digital (24) servidor web (2) servidores (2) shell (9) shell script (8) sistema operacional (25) skarnet (1) smartphones (3) Software livre e de código aberto (151) sorteio (3) Steam (10) Steam no Linux (8) supercomputadores (4) suse (6) systemd (7) terminal (89) terminal de comandos (18) toca do tux (1) toybox (27) tutorial (6) Tux (3) unboxing (7) UNIX (17) UNIX Toolbox (14) vartroy (1) vga (1) virtualização (2) vulnerabilidade (6) wayland (5) web (1) whatsapp (1) whitehat (1) Windows Subsystem for Linux (2) wine (14) WoT (1) yash (1) ZFS (15) zsh (3)