Sumário
Processos, compactação e introdução ao GIT
Básico sobre processos
O que é um processo?
Um processo é um programa em execução .
Um sistema operacional lida com uma infinidade de processos, que possuem as seguintes características:
- Proprietário do processo;
- Estado do processo (em espera, em execução, etc);
- Prioridade de execução;
- Recursos de memória.
Cada processo possui um número identificador, chamado de PID (Process Identifier), que é utilizado para controlá-lo.
Estados dos processos
- Executável(R): o processo pode ser executado imediatamente;
- Dormente(S): o processo precisa aguardar algo para ser executado. Só depois desse “algo” acontecer é que ele passa para o estado executável;
- Zumbi(Z): o processo é considerado “morto”, mas, por alguma razão, ainda existe;
- Parado(T): o processo está “congelado”, ou seja, não pode ser executado.
Interrompendo e listando processos
Visualizando processos estaticamente com “ps”
O comando ps mostra os processos em execução atualmente e exibe os UIDs e PIDs de cada um.
Ao executar o ps sem nenhuma opção, serão apresentados os processos em execução no terminal.
$ ps
PID TTY TIME CMD
1234 pts/0 00:00:02 bash
9101 pts/0 00:00:00 ps
As opções mais importantes para o comando ps são:
-u [username] - mostra os processos existentes de um usuário específico;
-f - Exibe uma lista completa com informações adicionais como PPID (ID do processo pai).
-l - exibe mais campos no resultado;
-e ou -A : Lista todos os processos no sistema.
-x - exibe os processos que não iniciados no console do terminal junto com os inicializados no console.
aux: Exibe uma listagem detalhada com o uso de memória por cada processo.
O uso do “ps” com o “grep”
O ps é uma ferramenta essencial e corriqueira. Já a usamos quase que automaticamente com o grep, porém, somos limitados a filtrar um processo por vez.
Por exemplo, para ver os processos systemd:
ps aux | grep systemd
Primeiro, o comando ps aux mostra todos os processos em execução, enquanto grep systemd filtra apenas os processos que contêm “systemd” em sua descrição.
Uso do “kill”
O comando kill é usado no Linux para enviar sinais a processos. Esses sinais podem instruir o processo a realizar várias ações, como terminar, parar ou continuar a execução. Quando usamos kill para matar um processo, estamos enviando um sinal específico que informa o processo que ele deve encerrar.
Como ver os possíveis sinais?
Existem múltiplos sinais disponíveis no Linux que podem ser utilizados para interromper, encerrar ou pausar processos. O comando pode ser usado como mostrado abaixo:
kill -l
Este comando irá mostrar uma página do manual com diferentes sinais do comando kill e seus respectivos números. Embora existam muitos sinais disponíveis, na maioria das vezes utilizamos o SIGKILL (9) e SIGTERM (15).
Significados dos principais sinais
SIGHUP (1): Ocorre quando o terminal fecha ou quando o processo pai finaliza sua execução.
SIGINT (2): Interrompe ou para um processo, geralmente gerado pelo usuário pressionando Ctrl+C no terminal.
SIGKILL (9): Força a parada imediata de um processo, não pode ser capturado ou ignorado pelo processo.
SIGTERM (15): Solicita a terminação “elegante” do processo, permitindo que ele libere recursos antes de encerrar, termine o que está fazendo e feche.
SIGTSTP (20): Solicita ao terminal a interrupção temporária do processo (parar/pausar), geralmente gerado pelo usuário pressionando Ctrl+Z.
SIGCONT (18): Retoma um processo pausado pelo sinal SIGTSTP (ou SIGSTOP).
Como realmente matar processos?
Por padrão, é enviado o sinal SIGTERM, que requisita a finalização do processo, por isso o nome kill (matar). Em geral é usado desta forma:
kill PID
Você tamvém pode usar o comando kill seguido pelo número do sinal e o PID (Process ID) do processo que deseja terminar.
kill -8 <PID>
Uso do killall
O comando killall no Linux envia sinais para os processos e recebe como parâmetro não o PID do processo, mas seu nome. Ele é usado geralmente para terminar a execução de processos que possuem diversos processos filhos executando ao mesmo tempo.
Sintaxe básica
killall [opções] nome_do_processo
Você pode enviar um sinal específico para os processos de mesmo nome como:
killall -9 firefox
Verificando antes de Encerrar
Para verificar quais processos seriam encerrados sem realmente matá-los, use a opção -i para interação
killall -i firefox
Encerrando Processos de um Usuário Específico
Para encerrar processos de um usuário específico, use a opção -u:
killall -u usuario firefox
Uso e visualização processos dinâmicamente com “htop”
O comando HTOP é um utilitário de linha de comando que tem como objetivo auxiliar o usuário a monitorar de forma interativa e em tempo real os recursos de seu sistema operacional Linux.
Instalar “htop” no Ubuntu
sudo apt install htop
Iniciar a ferramenta
htop

Rodando processos em background
Uso do & comercial no shell
No Linux, um processo pode estar em foreground ou em background, ou seja, em primeiro plano ou em segundo plano. Por exemplo, ao digitar o comando:
ping google.com
Quando você executa o comando ping em primeiro plano (sem o ‘&’ no final), ele ocupa o terminal até que você interrompa manualmente a execução. Isso significa que você não poderá usar o terminal para outros comandos até que o ping termine ou seja interrompido.
Seu terminal ficará assim:
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.030 ms
Para interromper o ping em primeiro plano, use Ctrl + C. Isso envia um sinal de interrupção (SIGINT) para o processo ping, fazendo com que ele termine a execução e exiba um resumo das estatísticas:
^C
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.030/0.035/0.045/0.007 ms
Para o exemplo acima, é possível liberar o shell para outras atividades enquanto o o processo gerado pelo comando fica em segundo plano. Basta que você digite:
ping google.com &
O símbolo & indica que o comando deve ser executado em background, ou seja, em segundo plano.
Você verá uma mensagem que indica o número do trabalho ([1]) e o PID do processo (1234):
Ver lista de processos em segundo plano
Para poder ver quais processos em segundo plano, digite:
jobs
Irá aparecer algo como:
[1]+ Running ping 127.0.0.1 &
Note que, se você fizer CTRL + C, o processo não será interrompido, pois ele não está em primeiro plano(foreground).
Trazer para “foreground”
Vamos supor que você pretende trazer o processo para primeiro plano. Para isso, utilize o seguinte comando :
fg %1
Agora você pode matá-lo diretamente utilizando o CTRL + c , que manda o sinal SIGINT, que faz com que ele termine a execução e exiba um resumo das estatísticas :
^C
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.030/0.035/0.045/0.007 ms
Retomando processos suspensos em background
Agora, digite o seguinte comando:
ping 127.0.0.1
Em seguida, digite CTRL + Z para suspender o comando bing. Esse comando pausa o processo e o colocar em segundo plano em estado de pausa(suspenso).
^Z
[1]+ Stopped ping 127.0.0.1
Para retomar o processo em segundo plano, é necessário utilizar o comando bg da seguinte forma:
bg %1
Agora, vamos digitar o comando jobs para ver o estado dos processos em background.
$ jobs
[1]+ Running ping 127.0.0.1 &
Uso do “nohup”
Mesmo que um processo esteja em segundo plano, ele pode ser interrompido por vários motivos.
Digamos que você tenha terminado seu trabalho e feche sua sessão de SSH. Lembra daquele processo de longa duração que você iniciou? Sumiu! Quando você sai da sessão, o sistema envia um sinal especial para cada processo iniciado que ainda está em execução chamado “SIGHUP”. Esse sinal desliga o processo mesmo quando ele ainda tem trabalho a fazer. Isso é o que o comando nohup pretende corrigir.
Há outras maneiras, é claro, para um processo ser encerrado, mas o comando nohup refere-se especificamente aos encerrados devido ao sinal SIGHUP.
Nohup - abreviação de ‘no hang up’, ou ‘não desligar’, em Português - é um comando em sistemas Linux que mantém os processos em execução mesmo depois de sair do shell ou terminal. O Nohup impede que os processos ou trabalhos recebam o sinal SIGHUP (Signal Hang UP). Este é um sinal que é enviado para um processo ao fechar ou sair do terminal.
Sintaxe do comando nohup
A sintaxe para usar o comando Nohup é direta:
nohup command [options] &
command: especifica o comando ou script que você deseja executar.
[options]: argumentos opcionais ou sinalizadores que modificam o comportamento do comando.
&: Colocar este símbolo ao final de um comando instrui o shell a executar esse comando em segundo plano.
Iniciando um processo usando o Nohup
Para iniciar um processo usando o Nohup, basta preceder o comando desejado com nohup. Por exemplo, se você deseja executar o comando sleep 60(que faz o sistema esperar 60 segundos) chamado usando Nohup, você deve usar o seguinte comando:
nohup sleep 60 &
Com o comando acima, o sistema executa um comando “sleep”, que normalmente bloqueia todas as entradas, mas isso as envia para o segundo plano, graças ao parâmetro “&”. Executá-lo tem a seguinte aparência:
$ nohup sleep 60 &
[1] 4003
$ nohup : ignoring input and appending output to 'nohup.out'
Deixando de fora o caractere ‘&’
Você pode até mesmo usar o comando nohup sem o caractere “&” enviando o processo para o segundo plano. Mas isso simplesmente significa que o processo será executado em primeiro plano e que você não poderá fazer nenhum outro trabalho no terminal até que ele seja concluído. Geralmente, para tarefas de longa duração, o usuário envia para segundo plano, já que não faz sentido esperar sem necessidade.
Caso você use o nohup mantendo o processo em primeiro plano, pode ter certeza de que, se o terminal for fechado, ou a conectividade com a Internet for perdida, ou algo mais acontecer, o processo não será interrompido. Mas, como mencionado acima, você quase sempre vai querer executar o comando em segundo plano.
Uso do “wait”
O comando “wait” é uma ferramenta poderosa no Linux que permite que os scripts aguardem a conclusão de outros processos antes de continuar a execução.
Por exemplo:
$ nohup sleep 30 &
[1] 5010
$ wait 5010
Depois de digitar o comando wait <PID>, o terminal irá esperar o proceso ser finalizado.
Uso de programas de compatação para compartilhar e receber arquivos
Compactação
Compactando diretórios com zip
Compactar arquivos significa juntar todos eles em um único arquivo de modo que eles ocupem um espaço menor.
Provavelmente você já viu algum arquivo com a extensão .zip. No Linux, para compactar arquivos no formato .zip, é utilizado o comando zip.
Vamos supor que temos uma pasta chamada “projetos” e, dentro dela, dois subdiretórios chamados “ITP” e “PC”, onde estão todos os programas que você fez durante as disciplinas. Surgiu o seguinte problema: você gostaria de enviar esses arquivos pelo WhatsApp para um colega recém-chegado no curso, mas o WhatsApp não permite o envio devido ao tamanho dos arquivos. Por isso, você decidiu compactar os projetos.
Para isso, digitou:
zip projetos.zip projetos/
depois, executou o seguinte comando para poder visualizar se todos os diretórios foram armazenados no arquivo compactado “projetos.zip”:
unzip -l projetos.zip
e viu o seguinte:
$ Archive: projetos.zip
Length Date Time Name
--------- ---------- ----- ----
0 2023-07-09 12:00 projetos/
--------- -------
0 1 file
Note que ocorreu um problema, pois os subdiretórios não foram inseridos na compactação. Isso ocorre pois, por padrão, o comando zip não inclui os arquivos e subdiretórios de um diretório. Assim, nosso .zip contém apenas o diretório Projetos/ vazio. Para resolver, basta passar o argumento -r(recursive).
O -r fará com que o comando zip processe recursivamente todos os subdiretórios e arquivos dentro do diretório especificado, garantindo que tudo seja incluído no arquivo compactado. Vamos corrigir o comando para incluir o argumento -r:
zip -r projetos.zip projetos/
Agora, vamos ver se tudo foi compactado:
$ unzip -l projetos.zip
Archive: projetos.zip
Length Date Time Name
--------- ---------- ----- ----
0 2023-07-09 12:00 projetos/
0 2023-07-09 12:00 projetos/ITP/
2048 2023-07-09 12:00 projetos/ITP/programa1.c
1024 2023-07-09 12:00 projetos/ITP/programa2.c
0 2023-07-09 12:00 projetos/PC/
5120 2023-07-09 12:00 projetos/PC/programa1.py
--------- -------
8192 6 files
Compactando arquivos e diretórios com tar e gzip
Outra forma de compactar arquivos é utilizando tar e gzip. Quando nos deparamos com arquivos do tipo arquivo.tar.gz, significa que ocorreram dois processos.
- Primeiro, ocorreu o empacotamento dos arquivos no formato
.tare depois foi feita a compactação dos arquivo no formatogzip.
Qual a vantagem do tar?
A vantagem é que o tar consegue manter as permissões dos arquivos, bem como links diretos e simbólicos, sendo interessante, por exemplo, para realizar backups.
Utilizamos o comando tar para realizar as compactações. A compactação do diretório “projetos/” ficaria da seguinte forma:
tar -czf projetos.tar.gz projetos/
-
-c - create: indica que desejamos criar um arquivo.
-
-z - gzip: indica que queremos compactar com gzip.
-
-f - file: especifica o nome do arquivo compactado.
Note que não precisamos usar o -r. Isso acontece pois o tar age de forma recursiva por padrão.
Descompactação
Descompactando diretórios com unzip
Vamos supor que seu colega, que recebeu o arquivo projetos.zip, deseja descompactá-los . Para isso, ele executará os seguintes passos:
unzip projetos.zip
Isso irá extrair todos os arquivos e diretórios contidos no arquivo “projetos.zip” para o diretório atual. Se desejar extrair para um diretório específico, você pode usar a opção -d:
unzip projetos.zip -d /home/ubuntu/Music
Se você quiser que o progresso não apareça e sua tela fique cheia de informações, é possível utilizar o -q, que significa quiet, para que ele apenas descompacte e não mostre cada coisa que fez:
unzip -q projetos.zip -d /home/ubuntu/Music
Descompactando arquivos e diretórios com tar e gunzip
Para descompactar um arquivo tarball comprimido com gzip, utilizamos o comando tar novamente, desta vez com a opção -x para extrair o conteúdo. Vamos supor que você recebeu o arquivo “projetos.tar.gz” e deseja extrair seu conteúdo:
tar -xzf projetos.tar.gz
- -x - extract: extrai o conteúdo do arquivo tar.
- -z - gzip: descomprime o arquivo usando gzip.
- -f - file: especifica o nome do arquivo tar.
Versionadores e Git: Fundamentos e Conceitos
Introdução aos Versionadores
O que são Versionadores?
Versionadores são sistemas que registram alterações em um arquivo ou conjunto de arquivos ao longo do tempo, permitindo lembrar versões específicas mais tarde. Eles surgiram devido à necessidade de aumentar a eficiência, gerenciar um número maior de colaboradores e projetos de software moderno.

Tipos de Versionadores
1. Sistemas Locais
Utilizam um banco de dados simples para manter todas as alterações nos arquivos sob controle de versão.

2. Sistemas Centralizados
Têm um único servidor que contém todos os arquivos de controle de versão e um número de clientes que usam esses arquivos a partir desse lugar central. Suas desvantagens incluem a necessidade de estar sempre conectado ao servidor e a paralisação em caso de falha do servidor.
São utilizados por plataformas como a Wikipédia.

-
Vantagens dos Sistemas Centralizados
- Simples de utilizar, ideal para equipes pequenas.

3. Sistemas Distribuídos
Cada cliente possui uma cópia completa do repositório, funcionando como um backup completo de todos os dados.
Não dependem de um servidor central, oferecendo maior eficiência e segurança contra ataques.

Vantagens dos Sistemas Distribuídos
Escalabilidade: Suporta um grande número de colaboradores.
Independência: Não depende de um servidor central.
Eficiência: Processos mais rápidos e eficientes.
Segurança: Maior proteção contra falhas e ataques.

Introdução ao Git
Surgimento do Git
A criação do Linux foi um marco importante na história do desenvolvimento de software, principalmente por sua natureza colaborativa e open-source. Linus Torvalds, o criador do Linux, enfrentou desafios significativos ao coordenar as contribuições de inúmeros desenvolvedores ao redor do mundo.
Durante os anos iniciais do Linux Kernel, as mudanças eram gerenciadas através do envio de arquivos entre desenvolvedores. Posteriormente, usou-se o versionador BitKeeper, mas quando este se tornou pago, a comunidade Linux, liderada por Torvalds, decidiu criar o Git, aprendendo com as lições adquiridas durante o uso do BitKeeper e com um desafio de fazer um sistema de versionamento mais eficiente e com funcionalidades que acelerassem o processo de desenvolvimento de software.
Os objetivos principais para o novo sistema incluíam:
-
Velocidade;
-
Design simples;
-
Forte suporte para o desenvolvimento não linear (milhares de branches paralelas);
-
Alta distribuição;
-
Capacidade de lidar com grandes projetos, como o kernel do Linux, de forma eficiente.
De onde vem o nome “Git”?
O nome “Git” tem uma origem curiosa. Em uma entrevista, Linus Torvalds explicou sarcasticamente que ele nomeia todos os seus projetos em sua homenagem , sendo “Linux” o primeiro e “Git” o segundo. Na gíria britânica, “git” significa “pessoa desagradável”. Além disso, há uma interpretação alternativa em que “Git” pode significar “Global Information Tracker” quando você estiver de bom humor.
Para mais detalhes, você pode consultar o manual do Git no terminal usando o comando man git.
Git como um Versionador

O Git é um dos sistemas de controle de versão mais utilizados no mundo, conhecido por ser:
- Open Source
- Ideal para trabalho em equipe
- Adequado para o desenvolvimento de todos os tipos de software
- O versionador mais utilizado atualmente
Como o Git Funciona?
O Git é uma ferramenta de versionamento que gerencia diferentes versões de um arquivo ou conjunto de arquivos. Sempre que você salva o estado do projeto, o Git “tira uma foto” dos arquivos naquele momento e salva uma referência a esse snapshot. Por eficiência, se um arquivo não foi modificado, o Git não o salva novamente, mas cria um “link” para a versão anterior que já está salva.

O Git, em geral, apenas adiciona informações. É difícil que o sistema apague dados ou faça algo irreversível, especialmente se você enviar suas alterações para o servidor remoto regularmente (push). Esse comportamento garante a integridade e a segurança do histórico do projeto.
Hospedagem Remota e Conexões SSH
Introdução a plataformas de hospedagem remota
Voltando aos versionadores
A utilização de versionadores como o Git se torna ainda mais poderosa quando combinada com plataformas de hospedagem remota.
Essas plataformas permitem que você armazene, compartilhe e colabore em projetos de software com desenvolvedores de todo o mundo. Elas não só armazenam o código, mas também oferecem ferramentas para gerenciamento de projetos, integração contínua, e muito mais.
Algumas diferentes plataformas: GitLab, BitBucket, Codeberg
Existem várias plataformas de hospedagem remota que suportam Git, cada uma com suas características únicas.
-
GitLab
-
BitBucket
-
Codeberg
Git e Github : diferenças
Embora Git e GitHub sejam frequentemente mencionados juntos, eles não são a mesma coisa. Aqui estão as principais diferenças:
Git
- Git é um sistema de controle de versão distribuído.
- Ferramenta de linha de comando utilizada para gerenciar o histórico de versões de arquivos.
- Funciona localmente, independentemente de uma plataforma de hospedagem remota.
GitHub
- Hospedagem de Repositórios
- Se utiliza do Git para fazer o controle de versão dos respositórios hospedados
- Comunidade ativa
- Vários outros serviços
- Um dos maiores repositórios de projetos open source do mundo
Chave SSH
Para que serve a chave SSH?
As chaves SSH (Secure Shell) são utilizadas para autenticar conexões seguras entre computadores, permitindo uma comunicação criptografada. Elas substituem a necessidade de senhas tradicionais, proporcionando uma maneira mais segura e conveniente de acessar sistemas remotos e serviços, como repositórios Git.
Ao configurar uma chave SSH, você cria um par de chaves: uma chave privada, que deve ser mantida em segredo no seu computador, e uma chave pública, que é adicionada ao servidor ou serviço remoto. Quando uma conexão é iniciada, o servidor usa a chave pública para verificar a identidade do usuário, sem que a chave privada precise ser transmitida pela rede, garantindo assim a segurança.
No contexto do Git, a autenticação via chave SSH é especialmente útil ao interagir com repositórios remotos hospedados em plataformas como GitHub, GitLab e Bitbucket. Essas plataformas suportam autenticação por chave SSH, permitindo que os desenvolvedores enviem (push) e busquem (pull) alterações de forma segura.
CLique aqui para ver o manual de como configurar a chave SSH para a sua máquina
Workflow e primeiro repositório
Um pouco mais sobre Git
O Git é um sistema de controle de versão distribuído que gerencia informações armazenando cada versão do projeto como um snapshot completo, em vez de apenas as diferenças entre versões. Ele utiliza uma estrutura de objetos que inclui blobs (conteúdo de arquivos), trees (diretórios), commits (mudanças com metadados) e tags (marcadores de versão).
Cada objeto é identificado por um hash SHA-1, garantindo a integridade dos dados. Git permite a criação de branches para desenvolvimento paralelo e merges para combinar mudanças.
As modificações são preparadas na staging area antes de serem commitadas.
Com funcionalidades robustas de colaboração e resolução de conflitos, o Git suporta operações offline e sincronização com repositórios remotos através de comandos como push e pull, facilitando o trabalho simultâneo de múltiplos desenvolvedores.
Workflow básico
1) Você modifica arquivos na sua árvore de trabalho
2) Você seleciona apenas as mudanças que você quer que façam parte do seu próximo commit, e apenas essas mudanças serão adicionadas à staging area
3) Você faz um commit: os arquivos como eles estão na staging area são armazenados em forma de snapshot permanentemente no seu diretório Git.

Assim, podemos perceber que um arquivo pode estar em um dos 3 estados:
modified - quando o arquivo foi modificado e não está rastreado pelo Git.
staged - quando a modificação foi colocada na ‘staging area’ - uma área na qual armazenamos as mudanças antes de tê-las como definitiva para a próxima versão, ou seja, para o próximo commit.
commited - Mudanças que são definitivas, ou seja, a snapshot permanente foi guardada na linha do tempo do Git.
Comandos e Práticas do Git
Inicializando o git no repositório: “git init”
Para criar um repositório local, vamos ir ao diretório onde queremos criar o resositório Git e, em seguida, vamos inicializar o Git com o comando git init
cd OneDrive/Documentos/projeto
git init
Agora, temos um subdiretório chamado .git que contém todos os arquivos necessários de seu repositório – um esqueleto de repositório Git.
Nada em seu projeto é monitorado ainda.
cd OneDrive/Documentos/projeto
git init
Initialized empty Git repository in /home/anna/OneDrive/Documentos/projeto/.git/
Gravando alterações em seu repositório
Cada arquivo em seu repsitório pode estar em um dos seguintes estados: rastreado e não-rastreado. Arquivos rastreados são arquivos que foram incluídos no último snapshot; eles podem ser não modificados, modificados ou preparados (adicionados ao stage). Em resumo, arquivos rastreados são os arquivos que o Git conhece.
Quando você clona um repositório pela primeira vez, todos os seus arquivos serão rastreados e não modificados, já que o Git acabou de obtê-los e você ainda não editou nada.
Assim que você edita alguns arquivos, Git os considera modificados, porque você os editou desde o seu último commit. Você prepara os arquivos editados e então faz commit das suas alterações, e o ciclo se repete.

Verificando o status dos arquivos: “git status”
A principal ferramenta que você vai usar para determinar quais arquivos estão em qual estado é o comando git status.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Digamos que você adicionou um simples arquivo chamado ‘chat’ ao seu projeto. Se o arquivo não existia antes, e você executar git status, você verá seu arquivo não rastreado da seguinte forma:
$ echo 'código do chat' > chat
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
chat
nothing added to commit but untracked files present (use "git add" to track)
Nós queremos incluir esse arquivo ‘chat’, então vamos rastreá-lo.
Rastreando arquivos novos
Para começar a rastrear um novo arquivo, você deve usar o comando git add
git add chat
Executando o comando status novamente, você pode ver que seu README agora está sendo rastreado e preparado (staged) para o commit:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: chat
É possível saber que o arquivo está preparado porque ele aparece sob o título “Changes to be committed”. Se você fizer um commit neste momento, a versão do arquivo que existia no instante em que você executou git add, é a que será armazenada no histórico de snapshots.
Preparando Arquivos Modificados (Adicionando arquivos modificados à staging area)
Vamos modificar um arquivo que já está sendo rastreado.
Se, por exemplo, adicionarmos mais uma linha de código ao arquivo ‘feed’ que já era rastreado e estava dentro do projeto, e executarmos o git status, teremos isso:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: chat
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: feed
Isso significa que o arquivo rastreado foi modificado no diretório mas ainda não foi mandado para o stage (preparado).
Para isso, vamos usar o git add.
Pode ser útil pensar nesse comando mais como “adicione este conteúdo ao próximo commit”.
$ git add .
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: chat
modified: feed
Fazendo o commit do que foi feito: “git commit”
Agora que a área de stage está preparada, podemos fazer commit nas alterações.
O jeito mais simples de fazer commit é digitar o seguinte comando:
git commit
e adicionar uma mensagem no editor de texto.
Alternativamente, podemos fazer:
git commit -m "mensagem"
Lembre-se que o commit grava a snapshot que você deixou na área de stage. Qualquer alteração que você não tiver mandado para o stage permanecerá como estava, em seu lugar; você pode executar outro commit para adicioná-la ao seu histórico. Sempre que você executa um commit, você está gravando uma snapshot do seu projeto que você pode usar posteriormente para fazer comparações, ou mesmo restaurá-lo.
Configurando o Repositório Remoto: “git remote”
Depois de inicializar o repositório local, você pode querer vinculá-lo a um repositório remoto para facilitar a colaboração e o backup. Para isso, vamos usar o comando git remote
git remote add origin https://github.com/seu-usuario/seu-repositorio.git
Como verificar os repositórios remotos configurados?
Basta utilizar a opção -v
git remote -v
note o que seguinte aparecerá:
origin git@github.com:SEU_USUARIO/SEU_REPOSITORIO.git (fetch)
origin git@github.com:SEU_USUARIO/SEU_REPOSITORIO.git (push)
Isso indica que o repositório remoto chamado origin está configurado para buscar (fetch) e enviar (push) atualizações para a URL especificada, que é onde o seu repositório remoto está.
Como desconectar o repositório local do remoto?
git remote remove origin
Depois de executar esses comandos, o repositório local estará desconectado do repositório remoto.
Como renomear o repositório remoto
Use o comando ‘git remote rename’ para alterar o nome do repositório remoto. No exemplo abaixo, vamos renomear ‘origin’ para ‘novo-nome’.
git remote rename origin novo-nome
Note que:
$ git remote -v
novo-nome git@github.com:SEU_USUARIO/SEU_REPOSITORIO.git (fetch)
novo-nome git@github.com:SEU_USUARIO/SEU_REPOSITORIO.git (push)
Como ver todos os commit feitos com “git log”
É um comando feito para exibir os históricos de commits do projeto.
Aparece nome, hora, data e a mensagem relacionada a cada commit.
$ git log
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Jane <jane.doe@example.com>
Date: Fri Jun 30 14:32:16 2024 +0000
Adicionando modificação no feed
commit 3ad45c37a9f1b251545b8b2f4a3db7b683ed8e53
Author: John Smith <john.smith@example.com>
Date: Thu Jun 29 09:12:10 2024 +0000
adicionando a funcionalidade chat
Uma flag eficiente
Utilizando o comando “git log –oneline”, podemos ver os commits de forma mais simplificada.
Ele irá mostrar o número hash ou sha que é o identificador (ID) do commit e em seguida a sua mensagem.
git log --oneline
$ git log --oneline
9fceb02 (HEAD -> main) Adicionando modificação no feed
b75f610 adicionando a funcionalidade chat
c1b4d83 Commit inicial com arquivos de configuração do projeto
Clonando um repositório
Para começar a trabalhar com um repositório que já existe em um servidor remoto, você pode cloná-lo para o seu ambiente local usando o comando git clone. Este comando cria uma cópia completa do repositório, incluindo todo o histórico de commits e branches.
Para clonar um repositório que está por exemplo no GitHub, faça:
-
No GitHub.com, navegue até a página principal do repositório e faça o seguinte:
- Para clonar o repositório usando HTTPS, em “HTTPS”, clique no ícone de cópia
- Para clonar o repositório usando uma chave SSH, clique em “SSH” e depois no ícone de cópia.
- Para clonar um repositório usando a GitHub CLI, clique em “GitHub CLI” e depois no ícone de cópia.
-
Abra o Terminal.
-
Altere o diretório de trabalho atual para o local em que deseja ter o diretório clonado.
-
Digite
git clonee cole a URL já copiada. -
Pressione ENTER para criar seu clone local.
$ git clone https://github.com/YOUR-USERNAME/YOUR-REPOSITORY
> Cloning into `YOUR-REPOSITORY`...
> remote: Counting objects: 10, done.
> remote: Compressing objects: 100% (8/8), done.
> remote: Total 10 (delta 1), reused 10 (delta 1)
> Unpacking objects: 100% (10/10), done.
Subindo alterações para o repositório remoto: “git push”
Se você tem um commit pronto e quer adiciona-lo ao repositório remoto, podemos fazer:
git push
Fazendo o git push os seus commits irão subir para o seu repositório remoto que foi configurado inicialmente por padrão.
git push origin master
Vamos supor que o nome no repositório remoto seja
git push origin master:main
Dessa forma, você está enviando o conteúdo da sua
Trazendo alterações para o repositório local: “git pull”
Se foram feitas alterações no repositório remoto por outros desenvolvedores ou por você mesmo e você deseja trazê-las para o seu repositório local, basta digitar o comando git pull:
git pull
Por padrão, esse comando irá puxar as alterações do origin, que é o nome padrão do repositório remoto referenciado quando você conectou o repositório local com o remoto pela primeira vez. No caso de um clone, o origin é o repositório de onde você fez o git clone.
Para atualizar uma branch local com as alterações da branch remota sem usar diretamente git pull, você pode usar o comando git pull com a especificação direta da branch remota, o que é na prática uma forma direta de realizar a operação. Aqui está como fazer isso:
git pull origin nome-da-branch:nome-da-branch-local
Exercícios
Orientações sobre os exercícios
Envie os exercícios de cada dia separados para o email linuxgitpetcc@gmail.com com o assunto sempre sendo: Dia (dia de aula) - (Nome do aluno)
Exercícios Obrigatórios
Exercício 01 - Iniciando um novo repositório Git
Clique para voltar ao conteúdo
-
Crie um novo diretório chamado projetos.
-
Entre no diretório projetos e crie outro diretório chamado calculadora_pyton.
-
Inicialize um repositório Git vazio no diretório calculadora_pyton.
-
Faça o comando para visualizar a pasta oculta que foi criada.
Como resolução, descreva os passos que você fez em um arquivo de texto com o nome dia3exercicio1.txt para o email “linuxgitpetcc@gmail.com”. Lembre-se de adicionar seu nome ao arquivo!
Exercício 02 - Adicionando arquivos ao seu repositório Git
Clique para voltar ao conteúdo
-
Crie um arquivo chamado ‘README.md’ dentro do diretório calculadora_pyton.
-
Adicione o conteúdo “Este é um projeto de uma calculadora em Python que realiza operações básicas.” ao README.md.
-
Adicione o arquivo README.md ao repositório Git.
5.Faça um commit no repositório Git com a mensagem “Adicionei o README.md”.
Exercício 03 - Configurando um repositório remoto e enviando os commits
Clique para voltar ao conteúdo
-
No GitHub, crie um novo repositório chamado calculadora_pyton.
-
No terminal, dentro do diretório calculadora_pyton, configure seu repositório Git local para apontar para este repositório remoto.
-
Envie seus commits para o repositório remoto.
Para a avaliação, mande o link do repositório pelo email “linuxgitpetcc@gmail.com”.
Exercício 04 - Adicionando funções de soma e multiplicação à calculadora
Clique para voltar ao conteúdo
- Adicione um novo arquivo chamado calculadora.py com a função de soma:
Copie o seguinte código:
def soma(a, b):
return a + b
-
Adicione o arquivo ao repositório:
-
Faça um commit com a mensagem “Adicionei a função de soma”.
-
Adicione a função de multiplicação ao arquivo calculadora.py: Copie o código da mesma forma que está aqui abaixo (mesmo com o erro):
def multiplicacao(a, b):
c+b=4
return a * b
-
Adicione e “comite” as mudanças com a seguinte mentagem: “Adicionei a função de multiplicação”
-
Verifique o erro após o commit e corrija-o apagando o “c+b=4” no arquivo.
-
Adicione a modificação ao repositório e faça o commit com a mensagem “Correção de bug na função de multiplicação”
-
Use o comando que sobe as alterações locais para o repositório remoto para subir os seus commits.
Exercício 05 - Clonando um repositório
Clique para voltar ao conteúdo
- Criar e clonar o repositório:
- O aluno responsável pelo primeiro repositório remoto deve criar um novo repositório no GitHub com o nome “projeto 02” e compartilhar o link com o colega de dupla.
- O colega deve clonar esse repositório usando o comando
git clone [link do repositório].
- Criar uma pasta no repositório:
- Cada aluno deve criar uma pasta com seu número de matrícula e primeiro nome, seguindo o formato
201003948_luiz. - Adicione a pasta ao Git com
git add [nome da pasta]e “comite” com a mensagem “Adicionei a pasta 201003948_luiz”.
- Cada aluno deve criar uma pasta com seu número de matrícula e primeiro nome, seguindo o formato
- Desenvolver o projeto individualmente:
- Dentro da pasta criada, cada aluno pode desenvolver o projeto que quiser, aplicando o que foi aprendido:
- Criar uma história fictícia em um arquivo
.txtcom 3 capítulos, fazendo commits a cada capítulo, a cada erro ortográfico corrigido ou a cada modificação de personagem. - Fazer uma calculadora ou qualquer outro programa em qualquer linguagem de programação, fazendo commits a cada funcionalidade implementada.
- Fazer um site pequeno e básico, fazendo commits a cada funcionalidade implementada.
- Criar uma história fictícia em um arquivo
- Dentro da pasta criada, cada aluno pode desenvolver o projeto que quiser, aplicando o que foi aprendido:
- Sincronizar as alterações com o repositório remoto:
- Traga para o repositório local as alterações que estão no remoto com
git pull(para verificar se o colega já subiu algum arquivo). - Após isso, suba todos os commits para o repositório remoto com
git push.
- Traga para o repositório local as alterações que estão no remoto com
- Criar o segundo repositório:
- O outro aluno da dupla deve criar um novo repositório no GitHub com o nome “projeto 03” e repetir os passos 1 a 4, criando sua própria pasta no novo repositório do colega.
- Envio dos links dos repositórios:
- Ao final do exercício, cada aluno deve enviar por e-mail os links de ambos os repositórios (projeto 02 e projeto03) para a avaliação.
O que será avaliado aqui são os commits, e não se os códigos estão corretos. Cada aluno deve fazer, no mínimo, 3 commits em cada projeto
© PET-CC/UFRN 2024 Licenciado sob CC BY-NC-SA.