Git & Github – like a sir – Não há interfaces gráficas?



Git & Github – like a sir – Não há interfaces gráficas?

5 0


git-workshop


On Github diutsu / git-workshop

Git & Github

like a sir

Created by Gonçalo Sousa Github.com/diutsu

Controlo de versões

Controlo de versões (ou de revisões) é a gestão das alterações a documentos, software ou outros tipos de informação.

A cada alteração é geralmente atribuido um número ou código, e está associado um timestamp e quem foi a pessoa que a fez.

The need for a logical way to organize and control revisions has existed for almost as long as writing has existed, but revision control became much more important, and complicated, when the era of computing began. The numbering of book editions and of specification revisions are examples that date back to the print-only era. Today, the most capable (as well as complex) revision control systems are those used in software development, where a team of people may change the same files. Version control systems (VCS) most commonly run as stand-alone applications, but revision control is also embedded in various types of software such as word processors and spreadsheets, e.g., Google Docs and Sheets[1] and in various content management systems, e.g., Wikipedia's Page history. Revision control allows for the ability to revert a document to a previous revision, which is critical for allowing editors to track each other's edits, correct mistakes, and defend against vandalism and spam.

First and Foremost

É extremamente útil usar versionamento para qualquer projecto mesmo que o estejas a fazer sozinho

A Dropbox NÃO é um sistema de controlo de versões

o histórico de um ficheiro é limitado, e não podes fazer diff's entre versões

Onde usar controlo de versões?

java, matlab, 3D printing, LaTeX...

em todos os projectos que trabalhem com ficheiros de texto

... mas também podem colocar ficheiros binários

Git also supports binary files, and can version them, but the diffs will not work

Vantagens

  • backups
  • sincronização
  • desfazer alterações
  • seguir as mudanças
  • quem fez o quê
  • branches e merges
  • ambientes isolados

Tipos de repositórios

Repositório Local

RCS

Um repositório central

CVS, SVN

Repositórios distribuidos

Git, Mercurial

git

“Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.”
“Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.
“Git /ɡɪt/ is a distributed revision control and source code management (SCM) system with an emphasis on speed. Git was initially designed and developed by Linus Torvalds for Linux kernel development in 2005.”

Git é melhor do que

Dropbox

Não é um sistema de controlo de versões

CVS

Central Version System. É centralizado

SVN

SVN is CVS done right. “There is no way to do CVS right”

Git also supports binary files, and can version them, but the diffs will not work

Primeiro passo: instalar o git

Debian / Ubuntu

sudo apt-get install git gitk

OS X / Windows

install Linux

http://git-scm.com/downloads/

OS X podem tentar:

brew install git

Não há interfaces gráficas?

Há, é só escolher:

http://git-scm.com/downloads/guis

mas vamos brincar directamente com a CLI

Não posso usar isso num IDE?

Claro que sim!https://www.eclipse.org/eGit/ ...

Ready?

Criar uma nova pasta "gitWS"

Abrir um terminal nessa pasta abrir git bash no windows

git init
Initialized empty Git repository in /home/diutsu/gitWS/.git

ProTip#1

Sempre que quiserem saber o estado do vosso repositório

git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

Adicionar ficheiros

Criar um ficheiro readme.md com

#git repository
## This is my first file on this repository
I should describe this project here.
git status
On branch master
                        
Initial commit
                    
Untracked files:
 (use "git add <file>..." to include in what will be committed)
                   
 readme.md
                    
nothing added to commit but untracked files present (use "git add" to track)

ProTip#2

Adicionar ficheiros ao repositório

git add readme.md
On branch master

Initial commit
Changes to be committed:
  (use "Git rm --cached <file>..." to unstage)

    new file:   readme.md

Fazer commit

git commit

Adiciona a tua mensagem de commit

[master (root-commit) eaee897] My first commit
1 file changed, 3 insertions(+)
create mode 100644 readme.

The über fast way

Lets write another line on readme.md

git commit -a -m "Your commit message"

History is a Weapon

You can always check your repository history

git log

Pretty tip

try out these git log

git log --p
git log --oneline
git log --abbrev-commit
git log --date=relative --pretty=format:"%h - %an, %ar : %s"

So you said Git has good branching ...

git branch alpha
git checkout alpha

ou com açúcar

git checkout -b alpha

Changes on new branch

Escrevam uma nova linha no readme.md

git commit -am "This is a test feature"

Back to master and merge

git checkout master

Vejam que o ficheiro está igual ao que estava antes de mudarem de branch

git merge alpha
Updating 452941e..8da4cb8
Fast-forward
 readme.md | 2 ++
 1 file changed, 2 insertions(+)

Profit!

Not everything is this smooth

git checkout master
vi readme.md
Alterem uma linha
git commit -am "There was a bug, temporary fix"

Not everything goes smoothly

git checkout alpha
vi readme.md
Alterem a mesma linha, mas para uma coisa diferente
git commit -am "This feature is complete now"

When merge fails

git checkout master
git merge alpha
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.

We have to fix these conflits first before we can commit the merge

Merge first-aid

                <<<<<<< HEAD
                But this description can be altered
                =======
                This project is my first experience with git scm.
                This description can be changed.
                And so it begun
                >>>>>>> alpha
                

HEAD é o que está na cabeça do repositório, podem ver isto como o último commit da branch actual

A seguir ao separador ====== estão as alterações da branch a que estão a fazer merge

git commit -m "merged fix for previous problem"

Merge tips

git mergetool

opens your a diff editor

Tired of this CLI stuff?

Lets see some pretty interfaces

Remotes

Um remote é qualquer repositório que não seja o repositório local em que estás a trabalhar

Pode estar no pc do teu colega, Github, ou outro servidor qualquer

Pode ainda ser o repositório do projecto upstream para qual estas a contribuir

git remote add git@github.com:diutsu/gitWS origin

O Git permite-te teres vários repositórios remotos ao mesmo tempo

Github

Quem ainda não tiver, criar uma conta.

Criar um novo repositório, sem adicionar o README

Vamos adicionar este novo repositório como um remote do que estivemos a trabalhar

git remote add origin git@github.com:diutsu/gitWS.git
git push -u origin master

Push and Pull

Para demonstar o uso dos pulls vamos usar dois repositórios locais.

FORA do repositório criem uma nova pasta p.e. sndLocal, dentro dessa pasta

git clone git@github.com:diutsu/gitWS.git

Agora vamos fazer alterações aos ficheiros e fazer commit

git commit -am "dude, you had some typos there"
git push origin master

Pull and Push

Voltando ao repositório original

git pull

As alterações são passadas de um repositório para outro

Step it up with branches

Reparem que nas branches do github não está lá a branch alpha

Há que fazer push de todas as branches individualmente

git push origin alpha

Pull allways get all branches

Voltando ao repositório em sndLocal.

git pull

How many branches are there?

git branch -vv

I feel lonely

Adiciona contribuidores ao teu projecto no github

Para projectos em servidores privados, basta que tenhas acesso ao servidor

Já agora, é de referir que o git diferencia quem faz o commit e quem faz o push

Students rejoice

5 repositórios privados gratuítos no Github

https://education.github.com/

Fork but no knife

Github suporta uma maneira bastante fácil de fazer fork a um qualquer reposit' support an easy way to fork any public repository

Basta carregares no botão de fork, e ficas com um repositório teu com o código do upstream

Terás de fazer o pull do upstream à mão, mas é bastante fácil enviar código de volta ...

Give back, get street cred

Se tiveres feito fork a um repositório, podes a qualquer momento submeter as tuas alterações para serem integradas no upstream

Github has a few treasures

Issues, wiki, github-pages, gists

Adding Files, and bad things

Adicionem um novo ficheiro

git commit -a -m "Your commit message"
git push

A few minutes later...

"Oh Zé não está lá nada!"

git status

Ups e agora?

Change your commit, and why you should not do that

git add newFile.txt
git commit --ammend

This is a new commit, replacing the old one.

git push

DO NOT ammend, or rebase, public code

git push -f

Git workflows

A centralized repository

É o método mais parecido com o SVN

O pull é feito sempre com rebase, para manter a história linear

git pull --rebase

Caso hajam conflitos, resolvem-se, faz-se add e continua-se

git rebase --continue

ou aborta-se

git rebase --abort

A centralized repository

Feature branch

Desenvolves cada feature numa branch à parte.

Assim que estiver completa, e revista, faz-se merge para a master

Feature branch

Gitflow

Muito parecido ao feature branch

Acrescenta algumas branches com significado especial

master - apenas o código na release oficial,develop - código em desenvolvimentorelease - em preparação para uma releasehotfix - para correcção de bugs na master

Gitflow

Pull Request

É um dos métodos mais comuns no github

Cada utilizador tem um repositório remoto

O desenvolvimento é feito para esse repositório

Assim que tiverem o seu trabalho completo criam um pull request

Pull Request

All your bases are belong to us

Lets use another repo, that has already a few commits

git clone git@github.com:{your github username]/gitWSPart2.git
git log --graph --oneline --all

ou

gitk --all

This repo is a mess

No not really. This is normalWe just have to merge a few branches

What about rebase?

NO. The code is already public.

But what if?

unscripted git hacking

F I M

Reve os slides aqui: diutsu.net/git ou faz clone e fork do repositório

git clone https://github.com/diutsu/git-workshop
made with git, reveal.js and ViM