<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Luiz Eduardo Prado Veltroni</title>
    <description>The latest articles on Forem by Luiz Eduardo Prado Veltroni (@eduardoopv).</description>
    <link>https://forem.com/eduardoopv</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F786504%2Ff2609f50-14ea-41ba-8e41-609b2ded5651.jpg</url>
      <title>Forem: Luiz Eduardo Prado Veltroni</title>
      <link>https://forem.com/eduardoopv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/eduardoopv"/>
    <language>en</language>
    <item>
      <title>O que é nome de domínio - Internet</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 26 Oct 2023 16:23:18 +0000</pubDate>
      <link>https://forem.com/eduardoopv/o-que-e-nome-de-dominio-41le</link>
      <guid>https://forem.com/eduardoopv/o-que-e-nome-de-dominio-41le</guid>
      <description>&lt;p&gt;Nomes de Domínio são uma parte fundamental da infraestrutura da Internet. Eles são essenciais para nossa navegação na web, permitindo que identifiquemos e acessemos facilmente os sites. Os nomes de domínio fornecem endereços legíveis para servidores web disponíveis na Internet.&lt;/p&gt;

&lt;p&gt;Qualquer computador conectado na Internet pode ser alcançado através de um endereço IP público, consistido de 32 bits para IPv4 e 128 bits para IPv6 como vimos no artigo falando sobre DNS. Computadores podem manipular esses endereços facilmente, mas as pessoas tem dificuldade em descobrir quem está executando o servidor ou que serviço o site oferece. Endereços de IP são difíceis de lembrar e podem mudar com o tempo. Para resolver todos esses problemas nós usamos endereços legíveis chamados domain names (nomes de domínio).&lt;/p&gt;




&lt;h2&gt;
  
  
  Estrutura dos domínios
&lt;/h2&gt;

&lt;p&gt;Um "nome de domínio" tem uma estrutura simples construída por algumas partes, que são separadas por pontos e lidos da direita para a esquerda. Cada uma dessas partes nos fornecem informações importantes sobre o domínio, exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsyoafa2oy5uft7n1xrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsyoafa2oy5uft7n1xrr.png" alt="Explicando cada parte de um nome de dominio" width="705" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é TLD (Top-Level Domain):
&lt;/h3&gt;

&lt;p&gt;O TLD nos trazem informações mais genéricas, como informar aos usuários o propósito geral do serviço por trás do nome de domínio. &lt;/p&gt;

&lt;p&gt;Existem os TLDs mais genéricos como: .com, .org, .net.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Alguns TLDs como: .us, .fr, or .sh podem exigir que o serviço seja fornecido em um determinado idioma ou hospedado em um determinado país.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é Label (ou componente):
&lt;/h3&gt;

&lt;p&gt;Os labels são os que seguem o TLD. Não existe uma forma correta de escrever um label, pode ser qualquer coisa, de uma letra a uma frase completa, geralmente no label vai o nome da empresa ou produto que irá conter no site. &lt;/p&gt;

&lt;p&gt;Também podemos chamar eles de &lt;em&gt;Domínio de Nível Secundário&lt;/em&gt; (SLD) ou ******&lt;strong&gt;&lt;em&gt;Subdomínio&lt;/em&gt;&lt;/strong&gt;*****&lt;em&gt;. Um *nome de domínio&lt;/em&gt; pode ter muitos labels, não é obrigatório ter 3 labels para formar um nome de domínio. &lt;/p&gt;




&lt;h2&gt;
  
  
  Como ter um nome de domínio
&lt;/h2&gt;

&lt;p&gt;Diferente do que dizem por ai, não é possível você "comprar um nome de domínio". O que nós fazemos é pagar pelo direito de usar um nome de domínio por um ano ou mais (depende do que está no plano contratado).&lt;/p&gt;

&lt;p&gt;Você pode renovar seu direito quantas vezes/anos quiser, e sua renovação tem prioridade sobre as aplicações de outras pessoas (sim, da para outra pessoa comprar o seu nome de domínio caso você  não renove, então fique de olho). &lt;/p&gt;

&lt;p&gt;As empresas famosas que vendem esse tipo de serviço são chamadas registradoras, que utilizam registros de nome de domínio para acompanhar as informações técnicas e administrativas que conectam você a seu nome de domínio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CUIDADO&lt;/strong&gt;: &lt;em&gt;Em alguns casos, os registradores se aproveitam dos nomes de domínio expirados, comprando esses domínios no momento em que expiram e, vendendo de volta ao registrante original por um preço elevado.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Diferença entre nome de domínio e URL
&lt;/h2&gt;

&lt;p&gt;Um localizador uniforme de recursos (URL) que muitas é vezes chamado de endereço, caminho, site, entre outros, contém o nome de domínio e também trás outras informações importantes, como, o protocolo usado no site e o caminho que você se encontra.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1hkmpkqovfhjn0knc0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1hkmpkqovfhjn0knc0z.png" alt="Diferença entre URL e nome de dominio" width="704" height="98"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Os nomes de domínio desempenham um papel fundamental na nossa experiência na web, fornecendo endereços legíveis que simplificam a navegação e o acesso a sites. Eles são uma parte vital da infraestrutura da Internet, conectando-nos a servidores web em todo o mundo.&lt;/p&gt;

&lt;p&gt;Lembre-se de que a renovação do seu nome de domínio é crucial para mantê-lo sob seu controle.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>internet</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DNS e como funciona - Internet</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Wed, 04 Oct 2023 13:53:26 +0000</pubDate>
      <link>https://forem.com/eduardoopv/dns-e-como-funciona-l3i</link>
      <guid>https://forem.com/eduardoopv/dns-e-como-funciona-l3i</guid>
      <description>&lt;h2&gt;
  
  
  O que é DNS?
&lt;/h2&gt;

&lt;p&gt;O Domain Name System (DNS) é como um "tradutor" da internet que ajuda a encontrar sites. Imagine que a internet é como um mundo com milhões de endereços secretos. Nós, seres humanos, lembramos melhor de nomes amigáveis, como "&lt;a href="http://www.exemplo.com" rel="noopener noreferrer"&gt;www.exemplo.com&lt;/a&gt;", em vez de números complicados, como "192.168.1.1".&lt;/p&gt;

&lt;p&gt;Aqui está uma comparação simples: pense no DNS como uma lista telefônica enorme, mas em vez de números de telefone, ela tem nomes de sites. Quando você digita um nome de site, o DNS pega esse nome e o transforma em um número especial que os computadores usam para encontrar o site na internet. É como se o DNS dissesse ao seu computador: "Ei, o site que você está procurando fica no número 192.168.1.1".&lt;/p&gt;

&lt;p&gt;Atualmente, existem dois tipos de números que o DNS usa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IPv4: São números como "192.168.1.1".&lt;/li&gt;
&lt;li&gt;IPv6: São números ainda mais longos, como "2400:cb00:2048:1::c629:d7a2". Mas você não precisa se preocupar muito com eles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se quiser saber mais sobre as diferenças entre IPv4 e IPv6, você pode ler este &lt;a href="https://www.eletronet.com/blog/entenda-as-diferencas-entre-ipv4-e-ipv6/#:~:text=IPv4vs%20IPv6%20%E2%80%93%20Combina%C3%A7%C3%B5es,de%20340%20undecilh%C3%B5es%20de%20endere%C3%A7os" rel="noopener noreferrer"&gt;artigo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona o DNS?
&lt;/h2&gt;

&lt;p&gt;O DNS se preocupa em transformar nomes de sites em números de internet (endereços IP). Vamos ver como isso acontece em algumas etapas simples:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Muitas vezes, as informações de pesquisa de DNS serão armazenadas em cache ignorando algumas etapas que iremos mostrar abaixo.&lt;/em&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  E*&lt;em&gt;tapas de uma pesquisa de DNS:&lt;/em&gt;*
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Você abre seu navegador e digita um nome de site, como "&lt;a href="http://exemplo.com/" rel="noopener noreferrer"&gt;exemplo.com&lt;/a&gt;". Essa solicitação é enviada para um tipo especial de computador chamado "resolvedor DNS".&lt;/li&gt;
&lt;li&gt;O resolvedor pega esse endereço e então consulta em um servidor de nomes raiz DNS.&lt;/li&gt;
&lt;li&gt;O servidor raiz então responde ao resolvedor com o endereço de um servidor DNS de nível superior (TLD) (como .com ou .net), que armazena as informações de seus domínios. Ao pesquisar por example.com, nossa solicitação é direcionada para o TLD .com.&lt;/li&gt;
&lt;li&gt;O resolvedor então realiza uma solicitação para o Servidor DNS de nível superior (TLD) .com.&lt;/li&gt;
&lt;li&gt;Servidor DNS de nível superior (TLD) então responde com o endereço IP do servidor de nomes do domínio, exemplo.com.&lt;/li&gt;
&lt;li&gt;Por fim, o resolvedor recursivo envia uma consulta ao servidor de nomes do domínio.&lt;/li&gt;
&lt;li&gt;O endereço IP de example.com é retornado ao resolvedor do servidor de nomes (192.168.1.1).&lt;/li&gt;
&lt;li&gt;O resolvedor de DNS responde ao navegador da Web com o endereço IP do domínio solicitado inicialmente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois que as 8 etapas da pesquisa de DNS retornarem o endereço IP de example.com, o navegador poderá fazer a solicitação para a página da web:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O navegador faz uma solicitação &lt;a href="https://www.cloudflare.com/learning/ddos/glossary/hypertext-transfer-protocol-http/" rel="noopener noreferrer"&gt;HTTP&lt;/a&gt; para o endereço IP.&lt;/li&gt;
&lt;li&gt;O servidor naquele IP retorna a página da web para ser renderizada no navegador.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcl04t7n6s07e43lb3yp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcl04t7n6s07e43lb3yp.png" alt="Mostrando o fluxo que o DNS faz até retornar a página solicitada" width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;O que é um resolvedor de DNS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pense no resolvedor de DNS como um detetive da internet que ajuda seu computador a encontrar os sites que você deseja visitar. Ele é o primeiro passo em uma busca na internet e lida com a solicitação inicial do cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Servidor Raiz
&lt;/h2&gt;

&lt;p&gt;Imagine o Servidor Raiz como o "diretório principal" da internet. É o ponto de partida na pesquisa de DNS. Ele não possui informações específicas sobre domínios individuais, como "example.com", mas ele saberá guiar até os domínios de topo, como ".com", ".org", ".net" e assim por diante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Servidor TLD (Top-Level Domain)
&lt;/h2&gt;

&lt;p&gt;Ele está um passo mais próximo dos domínios específicos. Quando você digita um domínio, como "example.com", o Servidor Raiz encaminha sua solicitação para o servidor TLD correspondente ao domínio de topo, que no caso de "example.com" seria o servidor TLD ".com".&lt;/p&gt;

&lt;h2&gt;
  
  
  Servidor Autoritativo
&lt;/h2&gt;

&lt;p&gt;Um servidor autoritativo é um servidor que é a "fonte definitiva" de informações sobre um domínio específico. Isso significa que ele possui registros detalhados e precisos para um domínio específico.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;O que é cache de DNS? Onde ocorre o cache de DNS?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O cache de DNS é como a memória temporária do seu computador. Ele armazena informações sobre sites que você visitou recentemente para tornar a navegação mais rápida e eficiente.&lt;/p&gt;

&lt;p&gt;O cache de DNS é armazenado em diferentes lugares e cada um deles mantém as informações por um período específico, chamado "tempo de vida" (TTL).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cache de DNS do navegador&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Quando você usa um navegador da web moderno, ele armazena temporariamente informações de DNS dos sites que você visita. Isso significa que, se você retornar a um site recentemente visitado, o navegador verificará primeiro no cache de DNS para encontrar o endereço, tornando a navegação mais rápida.&lt;/p&gt;

&lt;p&gt;Por exemplo, o Google Chrome permite verificar o status do seu cache DNS através do link chrome://net-internals/#dns.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cache de DNS no nível do sistema operacional (SO)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O sistema operacional do seu computador também possui seu próprio cache de DNS. Quando um aplicativo, como um navegador, precisa encontrar o endereço IP de um site, ele verifica primeiro o cache do sistema operacional.&lt;/p&gt;




&lt;p&gt;Com isso nós vimos o básico de DNS, o que é, qual o caminho que ele faz até nos retornar o arquivo da página e seus possíveis cache, lembrando que o conteúdo é bem mais complexo do que foi apresentado aqui, a ideia é dar apenas uma pincelada no assunto.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>interne</category>
      <category>webdev</category>
    </item>
    <item>
      <title>O que é HTTP - Internet</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 13 Jul 2023 22:03:58 +0000</pubDate>
      <link>https://forem.com/eduardoopv/o-que-e-http-internet-25-5bd3</link>
      <guid>https://forem.com/eduardoopv/o-que-e-http-internet-25-5bd3</guid>
      <description>&lt;p&gt;Dando continuidade à nossa série de introdução à internet, no post anterior &lt;strong&gt;&lt;a href="https://dev.to/eduardoopv/como-funciona-a-internet-internet-15-lcn"&gt;Como funciona a internet? - Internet 1/5&lt;/a&gt;,&lt;/strong&gt; introduzimos algumas siglas como HTTP e HTTPS. Desta vez, iremos nos aprofundar mais no conceito do HTTP e entender por que ele foi criado, além de explorar sua linha do tempo ao longo do desenvolvimento da web.&lt;/p&gt;

&lt;p&gt;Falaremos sobre "What is HTTP? / O que é HTTP?".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlqzw563cg2we7ni0o4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdlqzw563cg2we7ni0o4u.png" alt="Roadmap mostrando os tópicos" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Motivação e criação do HTTP
&lt;/h2&gt;

&lt;p&gt;O HTTP (Hypertext Transfer Protocol) foi desenvolvido por Tim Berners-Lee, conhecido como o pai da internet, juntamente com sua equipe no CERN (Organização Europeia para a Pesquisa Nuclear), no início dos anos 1990. A criação do HTTP surgiu da necessidade de compartilhar informações e recursos de forma eficiente na World Wide Web, que já tinha 30 anos na época.&lt;/p&gt;

&lt;p&gt;Berners-Lee estava trabalhando no desenvolvimento da Web, que envolvia a criação de um sistema para interligar documentos por meio de links. No entanto, foi necessário criar um protocolo que permitisse a transferência de dados de maneira padronizada e confiável entre os servidores web e os clientes, como navegadores.&lt;/p&gt;

&lt;p&gt;Para isso, Berners-Lee e sua equipe se basearam em várias tecnologias e conceitos que já existiam na época:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hipertexto: conceito que permite a criação de links entre diferentes documentos.&lt;/li&gt;
&lt;li&gt;Modelo cliente-servidor: no qual um cliente solicita informações a um servidor que responde com os dados solicitados.&lt;/li&gt;
&lt;li&gt;FTP (File Transfer Protocol): ideia de comandos e respostas para estabelecer uma comunicação entre o cliente e o servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajjzbjs14gfmgsdcbauz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajjzbjs14gfmgsdcbauz.png" alt="A comunicação realizada pelo HTTP" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante destacar que o HTTP foi projetado para ser um protocolo simples e extensível, permitindo a adição de novos recursos e funcionalidades no futuro. Essa visão de futuro foi uma das razões pelas quais o HTTP se tornou amplamente adotado e evoluiu ao longo dos anos.&lt;/p&gt;

&lt;p&gt;Vale ressaltar que houve várias atualizações menores e extensões ao longo dos anos para melhorar o protocolo e adicionar recursos adicionais. Apresentarei apenas algumas atualizações grandes e relevantes para o entendimento.&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP/0.9 - 1991
&lt;/h2&gt;

&lt;p&gt;A primeira versão documentada do HTTP foi a HTTP/0.9, lançada em 1991. Foi o protocolo mais simples de todos os tempos, com apenas um método chamado GET para que um cliente pudesse solicitar uma página da web ao servidor.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de como uma requisição HTTP/0.9 poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /index.html
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;lt;html&amp;gt;
  ...
&amp;lt;/html&amp;gt;

(connection closed)

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  HTTP/1.0 - 1996
&lt;/h2&gt;

&lt;p&gt;Ao contrário de seu antecessor, o HTTP/1.0 era capaz de lidar com outros tipos de resposta, como imagens, arquivos de vídeo, texto simples ou qualquer outro tipo de conteúdo. Algumas das principais atualizações lançadas foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adição de novos métodos, incluindo GET, POST e HEAD.&lt;/li&gt;
&lt;li&gt;Adição de cabeçalhos HTTP tanto nas solicitações quanto nas respostas.&lt;/li&gt;
&lt;li&gt;Adição de códigos de status para identificar a resposta.&lt;/li&gt;
&lt;li&gt;Introdução de suporte a conjuntos de caracteres.&lt;/li&gt;
&lt;li&gt;Adição de recursos como autorização e codificação de conteúdo.&lt;/li&gt;
&lt;li&gt;Entre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como uma requisição HTTP/1.0 poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/api/users/123&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;Referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;https://www.google.com/&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;If-Modified-Since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sat, 1 Jul 2023 12:00:00 GMT&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.0&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 3 Jul 2023 15:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache/1.3.29 (Unix) PHP/4.4.2&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html; charset=UTF-8&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1024&lt;/span&gt;
&lt;span class="na"&gt;Expires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 3 Jul 2023 16:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Last-Modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mon, 2 Jul 2023 14:30:00 GMT&lt;/span&gt;

(response body)
(connection closed)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No início da resposta, há o HTTP/1.0 (HTTP seguido pelo número da versão), seguido pelo código de status 200 e a descrição do código de status.&lt;/p&gt;

&lt;p&gt;Nesta versão mais recente, os cabeçalhos de solicitação e resposta eram mantidos em formato ASCII, mas o corpo da resposta poderia ser de qualquer tipo, como imagem, vídeo, HTML, texto simples ou qualquer outro tipo de conteúdo.&lt;/p&gt;

&lt;p&gt;Uma das principais desvantagens do HTTP/1.0 era que não era possível ter várias solicitações em uma única conexão. Isso significa que, sempre que um cliente precisava de algo do servidor, ele precisava abrir uma nova conexão TCP e, após o atendimento dessa única requisição, a conexão era encerrada.&lt;/p&gt;




&lt;h3&gt;
  
  
  HTTP/1.1 - 1999
&lt;/h3&gt;

&lt;p&gt;Após três anos do HTTP 1.0, foi lançada a nova versão HTTP/1.1 em 1999. Ela trouxe diversas melhorias em comparação ao seu antecessor (HTTP/1.0). Algumas das principais melhorias incluídas foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adição de novos métodos HTTP, incluindo PUT, PATCH, OPTIONS e DELETE.&lt;/li&gt;
&lt;li&gt;Obrigação de identificação do nome do host no cabeçalho.&lt;/li&gt;
&lt;li&gt;Conexões persistentes, ou seja, as conexões não eram fechadas por padrão e eram mantidas abertas, permitindo várias solicitações. Para fechar as conexões, era necessário enviar o cabeçalho "Connection: close" na requisição.&lt;/li&gt;
&lt;li&gt;Pipelining, onde o cliente podia enviar múltiplas requisições ao servidor sem esperar a resposta do servidor. O servidor era responsável por retornar as respostas na ordem em que foram solicitadas. Para lidar com essas diversas requisições, era necessário enviar o cabeçalho "Content-Length".&lt;/li&gt;
&lt;li&gt;Transferência em chunks, para conteúdo dinâmico em que não é possível identificar o "Content-Length". O servidor enviava o conteúdo em pedaços (chunks), adicionando o "Content-Length" para cada chunk. Após enviar todos os chunks, o servidor enviava um bloco vazio, com "Content-Length" igual a zero, indicando que a transferência foi concluída. Para isso, era necessário enviar o cabeçalho "Transfer-Encoding: chunked".&lt;/li&gt;
&lt;li&gt;Cache.&lt;/li&gt;
&lt;li&gt;Suporte a conjuntos de caracteres.&lt;/li&gt;
&lt;li&gt;Negociação de idiomas.&lt;/li&gt;
&lt;li&gt;Cookies de cliente.&lt;/li&gt;
&lt;li&gt;Melhor suporte de compressão.&lt;/li&gt;
&lt;li&gt;Entre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como uma requisição HTTP/1.1 poderia ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/api/users/123&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;Accept-Language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en-US,en;q=0.9&lt;/span&gt;
&lt;span class="na"&gt;Referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;https://www.google.com/&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwiaWF0IjoxNjI1NDU2NTY4LCJleHAiOjE2MjU0NTY3NjgsImlzcyI6ImV4YW1wbGUuY29tIiwic3ViIjoiYXV0aDB8NTg4ZjFmZGE0NzM0MDMwMDZkM2Y2Y2JhIiwiYXVkIjoiaHR0cHM6Ly9leGFtcGxlLmNvbSJ9.TMszXmUKITDFPf4AiwQ6MCdMbMw8uZlFWmBkOe4CEsA&lt;/span&gt;
&lt;span class="na"&gt;If-None-Match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"abcdef123456"&lt;/span&gt;
&lt;span class="na"&gt;If-Modified-Since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sat, 1 Jul 2023 12:00:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Cache-Control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no-cache&lt;/span&gt;
&lt;span class="na"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sessionid=abcde12345; lang=en-US&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 3 Jul 2023 15:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache/2.4.7 (Ubuntu)&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;256&lt;/span&gt;
&lt;span class="na"&gt;Cache-Control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;public, max-age=3600&lt;/span&gt;
&lt;span class="na"&gt;Expires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 3 Jul 2023 16:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Last-Modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mon, 2 Jul 2023 14:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;ETag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"abcdef123456"&lt;/span&gt;
&lt;span class="na"&gt;X-Powered-By&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PHP/7.3.9&lt;/span&gt;
&lt;span class="na"&gt;Set-Cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sessionid=abcde12345; path=/; HttpOnly; Secure&lt;/span&gt;
&lt;span class="na"&gt;Strict-Transport-Security&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;max-age=31536000; includeSubDomains; preload&lt;/span&gt;
&lt;span class="na"&gt;X-Frame-Options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DENY&lt;/span&gt;
&lt;span class="na"&gt;X-Content-Type-Options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nosniff&lt;/span&gt;

&lt;span class="err"&gt;(response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;body)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;(connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;closed)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  SPDY - 2009
&lt;/h3&gt;

&lt;p&gt;O Google começou a experimentar protocolos alternativos para tornar a web mais rápida e melhorar a segurança nas trocas de requisições. O principal objetivo era reduzir a latência das páginas. Com isso, em 2009, o projeto SPDY foi anunciado.&lt;/p&gt;

&lt;p&gt;Foram realizados diversos testes para otimizar a velocidade e o desempenho, e percebeu-se que, ao focar na latência, haveria um ganho de desempenho constante. Isso levou ao desenvolvimento do SPDY.&lt;/p&gt;

&lt;p&gt;Os principais recursos introduzidos pelo SPDY foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compressão de cabeçalhos.&lt;/li&gt;
&lt;li&gt;Multiplexação.&lt;/li&gt;
&lt;li&gt;Priorização de requisições.&lt;/li&gt;
&lt;li&gt;Push de recursos.&lt;/li&gt;
&lt;li&gt;Stream ID e Stream Dependency.&lt;/li&gt;
&lt;li&gt;Melhorias na segurança.&lt;/li&gt;
&lt;li&gt;Entre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como uma solicitação e resposta no SPDY poderiam ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/pagina&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.exemplo.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&lt;/span&gt;
&lt;span class="na"&gt;Accept-Language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en-US,en;q=0.5&lt;/span&gt;
&lt;span class="na"&gt;Referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;https://www.exemplo.com/pagina-anterior&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nome=valor; outro_nome=outro_valor&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Stream-ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Session-ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;abcd1234&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Referrer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;https://www.exemplo.com/referencia&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-URL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/pagina&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Scheme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.exemplo.com&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http/1.1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;spdy/3, http/1.1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;name,value&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-SSL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;active&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Compression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Content-Encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deflate&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;HTTP/1.1, HTTPS/1.3, IRC/6.9, RTA/x11, websocket&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep-alive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wed, 07 Jul 2023 15:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache/2.4.39 (Unix)&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;245&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html; charset=UTF-8&lt;/span&gt;
&lt;span class="na"&gt;Expires&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wed, 07 Jul 2023 15:45:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Cache-Control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;max-age=900&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Stream-ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.1&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-SSL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;active&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Compression&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Content-Encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deflate&lt;/span&gt;
&lt;span class="na"&gt;X-SPDY-Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep-alive&lt;/span&gt;

(response body)
(connection closed)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  HTTP/2 - 2015
&lt;/h3&gt;

&lt;p&gt;Inspirado pelo SPDY, o HTTP/2 foi lançado em 2015 e trouxe recursos essenciais para a web como a conhecemos atualmente. Ele baseou-se na versão lançada pelo Google e aprimorou alguns recursos.&lt;/p&gt;

&lt;p&gt;Os principais recursos introduzidos pelo HTTP/2 foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uso de formato binário em vez de texto.&lt;/li&gt;
&lt;li&gt;Multiplexação.&lt;/li&gt;
&lt;li&gt;Compressão de cabeçalhos utilizando o HPACK.&lt;/li&gt;
&lt;li&gt;Server Push.&lt;/li&gt;
&lt;li&gt;Priorização de solicitações.&lt;/li&gt;
&lt;li&gt;Melhorias na segurança.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um exemplo de como uma solicitação e resposta no HTTP/2 poderiam ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/api/example?param1=value1&amp;amp;param2=value2&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9&lt;/span&gt;
&lt;span class="na"&gt;Accept-Charset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;utf-8&lt;/span&gt;
&lt;span class="na"&gt;Accept-Encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gzip, deflate, br&lt;/span&gt;
&lt;span class="na"&gt;Accept-Language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en-US,en;q=0.9&lt;/span&gt;
&lt;span class="na"&gt;Referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;https://www.example.com/home&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;session_id=1234567890; language=en_US&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c&lt;/span&gt;
&lt;span class="na"&gt;Cache-Control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no-cache&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep-alive&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;DNT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;If-Match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"abcdef"&lt;/span&gt;
&lt;span class="na"&gt;If-Modified-Since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mon, 01 Jan 2023 00:00:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;If-None-Match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"xyz123"&lt;/span&gt;
&lt;span class="na"&gt;If-Range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bytes=500-999&lt;/span&gt;
&lt;span class="na"&gt;If-Unmodified-Since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 01 Jan 2023 00:00:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Max-Forwards&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="na"&gt;Pragma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no-cache&lt;/span&gt;
&lt;span class="na"&gt;TE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trailers, deflate, gzip&lt;/span&gt;
&lt;span class="na"&gt;Upgrade-Insecure-Requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;192.168.0.1&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-Port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;443&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
&lt;span class="na"&gt;X-Requested-With&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;XMLHttpRequest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;content-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;
&lt;span class="na"&gt;content-length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;124&lt;/span&gt;
&lt;span class="na"&gt;cache-control&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;public, max-age=3600&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wed, 07 Jul 2023 12:00:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ExampleServer/2.0&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value2"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Request processed successfully"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  HTTP/3 - 2021
&lt;/h3&gt;

&lt;p&gt;A ultima versão lançada, e que usamos atualmente, é o HTTP/3, ele possuitodos os recursos das versões anteriores, porém utiliza QUIC invés de TCP para a parte da camada de transporte.&lt;/p&gt;

&lt;p&gt;A maior motivação para que fosse trocado o TCP pelo QUIC, foi que por conta do HTTP/2 ser multiplexado, e o TCP ser executado em uma única conexão, todas as percas e retransmissão de pacotes que ocorrem na camada do TCP pode bloquear todos os outros fluxos.&lt;/p&gt;

&lt;p&gt;Já o QUIC executa múltiplos fluxos e implementa as percas e retransmissão de pacotes  independente para cara fluxo, ou seja, caso ocorra um erro, apenas o fluxo com dados naquele pacote irá ser bloqueado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Em outubro de 2022, 26% de todos os sites estavam usando HTTP/3 .&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Pudemos conhecer um pouco sobre as motivações que a CERN teve para dar inicio ao HTTP, sendo a base da web que conhecemos hoje.&lt;/p&gt;

&lt;p&gt;Lembrando que o time da CERN reutilizou vários conceitos já existentes na época, trazendo uma nova perspectiva para nós como desenvolvedores, deixo a reflexão no ar.&lt;/p&gt;

&lt;p&gt;Passei por cima de todas as atualizações mais impactantes para a evolução do HTTP que conhecemos hoje. Cada atualização é bem mais complexa do que eu apresentei, trouxe apenas alguns conceitos chaves.&lt;/p&gt;

&lt;p&gt;No próximo artigo, irei introduzir o conceito de “DNS e como funciona”.&lt;/p&gt;




&lt;p&gt;Fontes:&lt;/p&gt;

&lt;p&gt;Everything you need to know about HTTP: &lt;a href="https://cs.fyi/guide/http-in-depth" rel="noopener noreferrer"&gt;https://cs.fyi/guide/http-in-depth&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is HTTP?: &lt;a href="https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/" rel="noopener noreferrer"&gt;https://www.cloudflare.com/en-gb/learning/ddos/glossary/hypertext-transfer-protocol-http/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An overview of HTTP: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Protocolo HTTP: Estrutura, solicitações, respostas, métodos e códigos de status: &lt;a href="https://www.diegomacedo.com.br/protocolo-http-estrutura-solicitacoes-respostas-metodos-e-codigos-de-status/#google_vignette" rel="noopener noreferrer"&gt;https://www.diegomacedo.com.br/protocolo-http-estrutura-solicitacoes-respostas-metodos-e-codigos-de-status/#google_vignette&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>internet</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Como funciona a internet? - Internet</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Tue, 27 Jun 2023 12:28:11 +0000</pubDate>
      <link>https://forem.com/eduardoopv/como-funciona-a-internet-internet-15-lcn</link>
      <guid>https://forem.com/eduardoopv/como-funciona-a-internet-internet-15-lcn</guid>
      <description>&lt;p&gt;Você está começando no mundo da web e quer entender melhor como a internet funciona? Como você digita um endereço no campo de busca do navegador, e ele te retorna uma página? Pensando nisso decidi criar uma série com cinco artigos introduzindo os principais temas para compreender melhor o mundo da internet.&lt;/p&gt;

&lt;p&gt;Lembrando que todos os assuntos são bem mais complexos do que irei apresentar aqui, a ideia é te dar uma introdução para que você possa ter uma base e conhecer um pouco dos conceitos.&lt;/p&gt;

&lt;p&gt;Todas as cinco partes serão baseadas no &lt;a href="http://roadmap.sh/" rel="noopener noreferrer"&gt;roadmap.sh&lt;/a&gt; criado por Kamran Ahmed, onde eu irei fazer um compilado de todo o conteúdo e resumir em artigos mais direcionados e exemplificado.&lt;/p&gt;

&lt;p&gt;Iremos começar pelo “How does the internet work? / Como funciona a internet?”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqalae4qzzustsh12jzbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqalae4qzzustsh12jzbl.png" alt="Roadmap.sh ilustrando o tema Internet" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Início da Internet
&lt;/h2&gt;

&lt;p&gt;A internet teve início durante a Guerra Fria, nos Estados Unidos. Como um projeto de pesquisa do Departamento de Defesa dos Estados Unidos, chamado ARPANET, na década de 1960. Foi desenvolvida como uma rede de computadores para compartilhamento de informações entre universidades e instituições de pesquisa. O objetivo era criar uma rede robusta e descentralizada que pudesse resistir a um possível ataque de seus inimigos, e mesmo assim poder transitar as informações sem perigo de perda, permitindo a troca de dados de forma eficiente. &lt;/p&gt;

&lt;p&gt;A ideia é que eles pudessem trocar informações e documentos em vários pontos a qualquer momento, caso alguma dessas estruturas (computador) viesse a sofrer algum ataque, ou deixar de funcionar, os outros computadores ainda teria a capacidade de acessar aquele documento,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihq482864qhp0eiiu8nw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihq482864qhp0eiiu8nw.png" alt="Ilustração de uma rede utilizando uma analogia de um bairro" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao longo do tempo, a internet evoluiu, expandindo-se para além das fronteiras acadêmicas e se tornando uma rede global acessível a todos, conectando pessoas, empresas e organizações em todo o mundo, abrindo as portas para o que nós temos hoje.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é uma rede
&lt;/h2&gt;

&lt;p&gt;No mundo da internet, uma rede é um sistema de conexão entre diferentes dispositivos, como computadores, smartphones e servidores, que permite a troca de informações e recursos. É como uma teia de conexões que permite que esses dispositivos se comuniquem entre si.&lt;/p&gt;

&lt;p&gt;Uma simples analogia, seria pensar em uma rede de telefones fixos em uma vizinhança. Cada casa tem um telefone e está conectada a outras casas por fios telefônicos. Se alguém em uma casa quer ligar para outra, ele discará o número do telefone daquela casa e a ligação será estabelecida através da rede de fios. Da mesma forma, na internet, os dispositivos estão conectados através de cabos, sinais sem fio ou até mesmo redes móveis, permitindo a comunicação entre eles.&lt;/p&gt;

&lt;p&gt;Usando o exemplo do telefone, é como se cada roteador fosse uma rua, e cada dispositivo fosse uma casa. Em cada rua, nós temos diversas casas que se conversam entre si através de cabos, e existem diversas ruas que se conectam.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2bndmpr6kuthcukicm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2bndmpr6kuthcukicm2.png" alt="Ilustração de uma rede utilizando uma analogia de um bairro" width="681" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Atualmente, com o avanço da tecnologia e a proliferação de dispositivos conectados, a rede da internet se expandiu globalmente. É como se fosse uma rede mundial interconectada. Agora, podemos imaginar algo como um grande sistema de estradas, onde cada dispositivo é como um veículo na estrada. Esses dispositivos podem se comunicar com outros dispositivos em qualquer parte do mundo, enviando informações, compartilhando arquivos, transmitindo vídeos e muito mais. É uma rede global que conecta pessoas, empresas e serviços, permitindo a comunicação instantânea e o acesso a uma infinidade de recursos e informações.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se quiser ler um pouco mais sobre Rede:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://aws.amazon.com/pt/what-is/computer-networking/" rel="noopener noreferrer"&gt;https://aws.amazon.com/pt/what-is/computer-networking/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Visão geral da Internet
&lt;/h2&gt;

&lt;p&gt;A Internet é uma rede global que permite a comunicação e transferência de dados entre dispositivos conectados. Para entender como ela funciona, é importante conhecer alguns conceitos básicos. Vou explorar esses conceitos de forma clara e simples para aqueles que estão começando na área.&lt;/p&gt;

&lt;p&gt;Vamos começar com o básico: a Internet é como uma superestrada que conecta todos os dispositivos do mundo. E o segredo por trás dessa conexão são dois heróis: o Protocolo de Internet (IP) e o Transmission Control Protocol (TCP). O IP é o guia que ajuda os pacotes de dados a encontrarem seu destino, enquanto o TCP garante que esses pacotes cheguem lá.&lt;/p&gt;

&lt;p&gt;Para ter um melhor entendimento é interessante conhecer alguns conceitos que se repetem a todo momento, aqui vai alguns importantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pacote: É uma pequena unidade de dados que a Internet envia pelos ares.&lt;/li&gt;
&lt;li&gt;Roteador: É um dispositivo que direciona os pacotes de dados para o lugar certo, pulando de rede em rede.&lt;/li&gt;
&lt;li&gt;Endereço IP: É como um RG da Internet, um identificador exclusivo para cada dispositivo conectado.&lt;/li&gt;
&lt;li&gt;Nome de domínio: É um nome legível usado para identificar um site, como "&lt;a href="http://google.com/" rel="noopener noreferrer"&gt;google.com&lt;/a&gt;".&lt;/li&gt;
&lt;li&gt;DNS: É o sistema responsável por traduzir nomes de domínio em endereços IP.&lt;/li&gt;
&lt;li&gt;HTTP: É a linguagem dos navegadores e sites, que permite a transferência de dados.&lt;/li&gt;
&lt;li&gt;HTTPS: É a versão criptografada do HTTP, que garante que a comunicação entre cliente e servidor seja segura e tranquila.&lt;/li&gt;
&lt;li&gt;SSL/TLS: São protocolos de segurança usados para proteger nossas informações pessoais durante a navegação na Internet.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  IP e DNS
&lt;/h2&gt;

&lt;p&gt;Um endereço IP é como o endereço de uma casa, é o identificador único do seu dispositivo na Internet. Representado por uma série de números separados por pontos, como "192.168.1.1".&lt;/p&gt;

&lt;p&gt;Os nome de domínio é o apelido charmoso que atribuímos aos sites. O DNS (Domain Name System) entra em ação para traduzir esses apelidos em endereços IP, por exemplo, "google.com" é um nome de domínio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a7szwfq8w62b9ul1v2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a7szwfq8w62b9ul1v2j.png" alt="Ilustração de uma requisção e resposta ao entrar em um site" width="669" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O fluxo que ocorre nos bastidores da internet é o seguinte:&lt;/p&gt;

&lt;p&gt;Quando você digita um domínio na barra de busca do seu navegador, como por exemplo "&lt;strong&gt;&lt;a href="https://www.google.com/" rel="noopener noreferrer"&gt;https://www.google.com&lt;/a&gt;&lt;/strong&gt;", o navegador envia uma solicitação a um servidor DNS, perguntando se ele tem o IP correspondente àquele domínio. Caso o servidor DNS não possua essa informação, ele busca em outros servidores DNS até encontrar o IP correto. Assim que o servidor encontra o IP, ele o retorna ao usuário para que possa se conectar ao site desejado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se quiser ler um pouco mais sobre IP e DNS:&lt;/em&gt;  &lt;a href="https://support.google.com/a/answer/2573637?hl=pt" rel="noopener noreferrer"&gt;https://support.google.com/a/answer/2573637?hl=pt&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP e HTTPS
&lt;/h2&gt;

&lt;p&gt;HTTP (Hypertext Transfer Protocol) e HTTPS (HTTP Secure) são dois dos protocolos mais usados em aplicativos e serviços baseados na Internet.&lt;/p&gt;

&lt;p&gt;HTTP é o protocolo usado para transferir dados entre um cliente (navegador) e um servidor (site). Ao entrar em um site, o seu navegador realiza uma solicitação HTTP para o servidor, essa solicitação pode ser a própria página ou recursos como imagens, vídeos, etc. O trabalho do servidor é responder, com os recursos que foram solicitados pelo cliente.&lt;/p&gt;

&lt;p&gt;HTTPS é uma versão mais segura do HTTP, que criptografa os dados transmitidos entre o cliente e o servidor usando SSL/TLS, com isso temos uma camada extra em questão de segurança, já que essa comunicação é realizada com a criptografia SSL/TLS, protegendo dados sensíveis, como é mostrado na imagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pa39rxfei5n6bod657e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1pa39rxfei5n6bod657e.png" alt="Ilustração de um site com HTTP e HTTPS" width="800" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se quiser ler um pouco mais sobre HTTP e HTTPS:&lt;/em&gt; &lt;a href="https://www.alura.com.br/artigos/qual-e-diferenca-entre-http-e-https?gclid=Cj0KCQjw7uSkBhDGARIsAMCZNJsCrmh2CPNjpRzQFwRbetkjJbkd3oN0ab_7JS-idxXEKlHQJvTyO0EaApwxEALw_wcB" rel="noopener noreferrer"&gt;https://www.alura.com.br/artigos/qual-e-diferenca-entre-http-e-https?gclid=Cj0KCQjw7uSkBhDGARIsAMCZNJsCrmh2CPNjpRzQFwRbetkjJbkd3oN0ab_7JS-idxXEKlHQJvTyO0EaApwxEALw_wcB&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TCP/IP
&lt;/h2&gt;

&lt;p&gt;O TCP/IP (Transmission Control Protocol/Internet Protocol) é um protocolo de comunicação utilizado pela maior parte dos aplicativos e serviços que nós temos hoje na internet, focando na entrega de dados confiáveis, ordenadas e com verificação de erros entre aplicativos executados em diferentes dispositivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffk9rbehyhgsav3yddtni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffk9rbehyhgsav3yddtni.png" alt="Ilustração de como é uma conexão utilizando o protocolo TPC/IP" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Termos e conceitos chaves para entender melhor o TCP/IP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portas: São usadas para identificar o aplicativo ou serviço em execução em um dispositivo, cada aplicativo ou serviço recebe um número de porta exclusivo.&lt;/li&gt;
&lt;li&gt;Sockets: São como fones de ouvido, conectando os endereços IP e as portas para uma conversa exclusiva entre aplicativos.&lt;/li&gt;
&lt;li&gt;Conexões: São estabelecidas entre dois sockets quando dispositivos desejam se comunicar. Durante o processo de estabelecimento da conexão, são negociados parâmetros importantes.&lt;/li&gt;
&lt;li&gt;Transferência de dados: Uma vez que a conexão está rolando, os dados fluem entre os aplicativos em pacotes com metadados, garantindo uma entrega de sucesso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Se quiser ler um pouco mais sobre TCP/IP:&lt;/em&gt; &lt;a href="https://tecnoblog.net/responde/o-que-e-tcp-ip/" rel="noopener noreferrer"&gt;https://tecnoblog.net/responde/o-que-e-tcp-ip/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SSL/TLS
&lt;/h2&gt;

&lt;p&gt;SSL/TLS é um protocolo usado para criptografar os nossos dados que são transmitidos pela Internet. É usado para fornecer conexões seguras para aplicativos.&lt;/p&gt;

&lt;p&gt;Termos e conceitos chaves para entender melhor o SSL/TLS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificados: São usados para estabelecer a confiança entre cliente e servidor. Contêm informações sobre a identidade do servidor e são assinados por terceiros confiáveis.&lt;/li&gt;
&lt;li&gt;Handshake: É o processo de troca de informações entre cliente e servidor para negociar a criptografia e outros parâmetros para a conexão segura.&lt;/li&gt;
&lt;li&gt;Criptografia: Após a conexão segura ser estabelecida, os dados são criptografados usando o algoritmo acordado e transmitidos com segurança entre cliente e servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Se quiser ler um pouco mais sobre SSL/TLS:&lt;/em&gt; &lt;a href="https://rockcontent.com/br/blog/tls-ssl/" rel="noopener noreferrer"&gt;https://rockcontent.com/br/blog/tls-ssl/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Dessa maneira chegamos ao fim desse artigo, falamos um pouco sobre alguns tópicos de como a internet é formada, o objetivo era apenas trazer alguns conceitos para que nós possamos nos aprofundar futuramente. No segundo artigo, irei trazer um pouco mais sobre “O que é HTTP”.&lt;/p&gt;




&lt;p&gt;Fonte:&lt;/p&gt;

&lt;p&gt;How does the Internet Work?: &lt;a href="https://cs.fyi/guide/how-does-internet-work" rel="noopener noreferrer"&gt;https://cs.fyi/guide/how-does-internet-work&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Internet: IP Addresses &amp;amp; DNS: &lt;a href="https://www.youtube.com/watch?v=5o8CwafCxnU&amp;amp;ab_channel=Code.org" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=5o8CwafCxnU&amp;amp;ab_channel=Code.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How does the Internet work?: &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/How_does_the_Internet_work" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/How_does_the_Internet_work&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;História da internet: &lt;br&gt;
 &lt;a href="https://pt.wikipedia.org/wiki/Hist%C3%B3ria_da_Internet" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/Hist%C3%B3ria_da_Internet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O surgimento da internet: &lt;a href="https://www.fatosdesconhecidos.com.br/o-surgimento-da-internet/" rel="noopener noreferrer"&gt;https://www.fatosdesconhecidos.com.br/o-surgimento-da-internet/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>internet</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Git Stash - Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Sat, 01 Oct 2022 00:37:08 +0000</pubDate>
      <link>https://forem.com/eduardoopv/padronizacao-com-gitflow-git-e-github-55hj</link>
      <guid>https://forem.com/eduardoopv/padronizacao-com-gitflow-git-e-github-55hj</guid>
      <description>&lt;p&gt;Você com certeza já se deparou com uma situação na qual sua responsabilidade é desenvolver/corrigir uma feature, e em algum momento surge uma urgência de última hora, em uma outra branch, mas e o seu código que ainda não está pronto para o commit, o que fazer com ele? Com essa situação em mente, o git stash vem para nos ajudar.&lt;/p&gt;




&lt;h1&gt;
  
  
  Git Stash
&lt;/h1&gt;

&lt;p&gt;git stash arquiva (ou faz o stash) de alterações que você fez na cópia de trabalho durante um determinado período, para que você possa trabalhar em outra coisa, depois voltar e fazer a reaplicação mais tarde. O stashing é útil quando você precisa alternar com rapidez o contexto e trabalhar em outra coisa, mas está no meio da alteração de código e não está pronto para fazer commit.&lt;/p&gt;

&lt;p&gt;Com o git stash é possível “salvar” suas alterações sem precisar realizar um commit (Lembrando que arquivos preparados e não preparados são incluídos no stash) para você utilizar em algum outro momento.&lt;/p&gt;




&lt;h2&gt;
  
  
  Criando um Stashes
&lt;/h2&gt;

&lt;p&gt;Digamos que você realizou parte da sua task no arquivo index.html e criou o styles.css, porém foi pedido para você realizar uma correção em uma outra branch, podemos então criar o nosso primeiro Stash.&lt;/p&gt;

&lt;p&gt;Antes do stash, podemos ver o status dos nossos arquivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git status

Changes not staged &lt;span class="k"&gt;for &lt;/span&gt;commit:
modified: index.html

Untracked files:
new file: styles.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que existe o index.html como modified e o nosso styles.css como new file, agora criaremos o nosso Stash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash

Saved working directory and index state WIP on main: fe442e6 Delete comments on index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E rodando novamente o git status, ele nos mostra que não existe alterações/criações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git status

On branch main
Your branch is up to &lt;span class="nb"&gt;date &lt;/span&gt;with &lt;span class="s1"&gt;'origin/main'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

nothing to commit, working tree clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento, você pode realizar alteração, criar novos commits, alternar branchs e executar quaisquer outras operações do Git. Quando estiver satisfeito, poderá “trazer” de volta o seu stash, explicarei mais a frente como realizar o git stash pop.&lt;/p&gt;

&lt;p&gt;Lembrando que o stash só existe no local, e stashes não são enviados para o servidor remoto quando você realizar o push.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trazendo as alterações com o pop
&lt;/h2&gt;

&lt;p&gt;Nesse momento você já finalizou o que tinha que fazer em alguma outra ramificação do projeto, e está pronto para dar continuidade a sua antiga task, agora iremos ver como aplicar as alterações existentes no stash utilizando o git stash pop&lt;/p&gt;

&lt;p&gt;Executamos o status para visualizarmos as alterações existentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git status

On branch main
Your branch is up to &lt;span class="nb"&gt;date &lt;/span&gt;with &lt;span class="s1"&gt;'origin/main'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

nothing to commit, working tree clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora trazemos as alterações utilizando o pop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash pop
On branch main

Changes not staged &lt;span class="k"&gt;for &lt;/span&gt;commit:
modified: index.html

Untracked files:
new file: styles.css

Dropped refs/stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;04aa236313d158de0edbf4a9d50e84ed7c23b92c&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executar o pop no stash aplica as alterações no projeto e as remove.&lt;/p&gt;

&lt;p&gt;Uma outra flag interessante nesse sentido é o apply que irá aplicar as alterações, porém o stash ainda vai existir, caso você queria aplicar em alguma outra branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash apply
On branch main
Changes to be committed:

new file: style.css

Changes not staged &lt;span class="k"&gt;for &lt;/span&gt;commit:

modified: index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, o Git não vai fazer o stash de alterações feitas a arquivos ignorados ou não rastreados.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gerenciar múltiplos stashes
&lt;/h2&gt;

&lt;p&gt;Importante destacar, que você não fica limitado a apenas um único stash, você é capaz de criar múltiplos stathes. Sendo possivel visualizar todos os stashes criados utilizando a flag list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash list
stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;: WIP on main: 5002d47 our new homepage
stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;: WIP on main: 5002d47 our new homepage
stash@&lt;span class="o"&gt;{&lt;/span&gt;2&lt;span class="o"&gt;}&lt;/span&gt;: WIP on main: 5002d47 our new homepage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, os stashes são nomeados com "WIP" — Work in Progress (Trabalho em progresso), Branch e Commit que foi criado.&lt;/p&gt;

&lt;p&gt;Uma boa prática existente para você criar os seus stashes a longo prazo sem se perder, ou ficar totalmente confuso, é a flag save ela permite nós passarmos uma string que seria o nome/descrição daquele stash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash save &lt;span class="s2"&gt;"add style to our site"&lt;/span&gt;
Saved working directory and index state On main: add style to our site
HEAD is now at 5002d47 our new homepage

&lt;span class="nv"&gt;$ &lt;/span&gt;git stash list
stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;: On main: add style to our site
stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;: WIP on main: 5002d47 our new homepage
stash@&lt;span class="o"&gt;{&lt;/span&gt;2&lt;span class="o"&gt;}&lt;/span&gt;: WIP on main: 5002d47 our new homepage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por padrão, git stash pop vai trazer o stash mais recente: stash@{0}&lt;/p&gt;

&lt;p&gt;Podemos escolher qual stash aplicar, utilizando o seu identificador (stash@{number}):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash pop stash@&lt;span class="o"&gt;{&lt;/span&gt;2&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Limpar seu stash
&lt;/h2&gt;

&lt;p&gt;Se em determinado momento você decidir que um stash não será mais necessário, é possível excluir um ou mais stashes:&lt;/p&gt;

&lt;p&gt;Para apagar um stash isolado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash drop stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt;
Dropped stash@&lt;span class="o"&gt;{&lt;/span&gt;1&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;17e2697fd8251df6163117cb3d58c1f62a5e7cdb&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou você pode excluir todos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Visualizar comparações de stash
&lt;/h2&gt;

&lt;p&gt;Imagine uma situação onde você tem alguns stashes criados, e não se lembra o que tem exatamente naquele primeiro stash criado, para isso temos a flag show , vale lembrar que ele sempre vai mostrar por padrão o stash mais recente (stash@{0}):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash show
index.html | 1 +
style.css | 3 +++
2 files changed, 4 insertions&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para visualizar um stash em especifico, basta passar o identificador dele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git stash show &lt;span class="k"&gt;*&lt;/span&gt;stash@&lt;span class="o"&gt;{&lt;/span&gt;0&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;
index.html | 3 +++
style.css | 1 +
2 files changed, 4 insertions&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembrando que ele mostra de uma forma resumida, podemos utilizar o -p (ou --patch) para uma inspeção mais detalhada.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fazer stash em arquivos ignorados ou não rastreados
&lt;/h2&gt;

&lt;p&gt;Um problema (ou não), é que o stash não irá ser aplicado em arquivos não rastreados (Arquivos criados que não passaram por nenhum commit), para resolver essa questão, podemos adicionar a flag -u (ou --include-untracked).&lt;/p&gt;

&lt;p&gt;Você também pode incluir alterações para arquivos ignorados (Dentro do .gitignore), passando a flag -a ou --all).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhug5hkqcop9uirbp7l2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhug5hkqcop9uirbp7l2.png" alt="Stash" width="700" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fonte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-stash" rel="noopener noreferrer"&gt;https://git-scm.com/docs/git-stash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.atlassian.com/br/git/tutorials/saving-changes/git-stash" rel="noopener noreferrer"&gt;https://www.atlassian.com/br/git/tutorials/saving-changes/git-stash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Padronização com GitFlow - Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 12 May 2022 02:40:48 +0000</pubDate>
      <link>https://forem.com/eduardoopv/padronizacao-com-gitflow-git-e-github-p8i</link>
      <guid>https://forem.com/eduardoopv/padronizacao-com-gitflow-git-e-github-p8i</guid>
      <description>&lt;p&gt;Depois que aprendemos a trabalhar com as Branchs e os Merges, é importantes nós criarmos alguns padrões e organização do projeto, para não ficar aquela bagunça no histórico. Com esse pensamento o Holandês &lt;a href="https://nvie.com/posts/a-successful-git-branching-model/" rel="noopener noreferrer"&gt;Vincent Driessen&lt;/a&gt; teve a brilhante ideia de criar o GitFlow.&lt;br&gt;
O Gitflow é apenas uma ideia abstrata do fluxo de trabalho normal do Git, ou seja, ele dita que tipos de branchs configurar e como realizar o merge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oaqq29hei1a2zafjhi5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5oaqq29hei1a2zafjhi5.jpeg" alt="GitFlow Preview" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Branchs e Merge
&lt;/h2&gt;

&lt;p&gt;Antes de entendermos o GitFlow, é necessário termos dois conceito que são fundamentais, &lt;strong&gt;branch&lt;/strong&gt; e &lt;strong&gt;merge&lt;/strong&gt; bem claro, para isso sinta-se avontade de ler meus dois artigo onde eu explico bem isso, &lt;em&gt;&lt;a href="https://dev.to/eduardoopv/conceito-de-branch-git-e-github-2bfe"&gt;Conceito de Branch - Git e Github&lt;/a&gt;&lt;/em&gt; onde explico bem sobre a Branch, e &lt;em&gt;&lt;a href="https://dev.to/eduardoopv/conceito-de-merge-git-e-github-4j0g"&gt;Conceito de Merge - Git e Github&lt;/a&gt;&lt;/em&gt; onde falo sobre Merge.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fluxo do GitFlow
&lt;/h2&gt;

&lt;p&gt;Para ficar mais claro, podemos classificar o GitFlow em dois tipos de Branch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Principais&lt;/strong&gt;: São as Branch Master e Develop;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suporte&lt;/strong&gt;: São as conhecidas como Feature, Release e Hotfix.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x6u7pngkk947uo0qlov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x6u7pngkk947uo0qlov.png" alt="Classificação das branchs" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Regras das branchs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Master:&lt;/strong&gt; Utilizada para receber os commits estáveis que foram desenvolvidos na Develop, digamos que são códigos &lt;em&gt;prontos para produção&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Develop:&lt;/strong&gt; A branch que irá desenvolver todas as novas Features, após revisar e estar estável, ela será responsavél por realizar um merge na Master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt; São as branchs criadas a partir da Develop que irão desenvolver uma funcionalidade especifica, fazendo Merge na Develop também.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Releases:&lt;/strong&gt; Uma vez que se tem uma nova Feature incorporada na Develop, é preciso prepará-la para entrar em produção, o que não pode ser feito levando-a apenas para a Master, é preciso utilizar uma outra Branch de suporte, chamada Release.&lt;br&gt;
Pode ser que apenas após a criação de um conjunto de novas Features que você tenha uma Release pronto. Porém, uma vez que essas Features estejam prontas na Develop, será possível uní-las em um Branch Release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hotfixes:&lt;/strong&gt;  São branches para realizar correçõs especificas e criticas que são encontradas em produção, criada a partir da Master, deve ser unida tanto com Develop quanto com a Master.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após entender a base de todo conceito, existe uma ferramenta para auxiliar a criação e exclusão de branch, chamado GitFlow Extensão.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitFlow Extensão:
&lt;/h2&gt;

&lt;p&gt;O GitFlow Extensões é uma extensão que auxilia no desenvolvimentos de projetos que utilizam Git, ele tem como objetivo automatizar algumas funções repetivias no processo das branchss, o que ajuda a poupar algumas linhas no terminal.&lt;br&gt;
Para começar a utilizar o GitFlow Extensões, depois de iniciar o Git com o comando &lt;code&gt;git init&lt;/code&gt;, basta digitar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git flow init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsob2tk5ml7q9upk9qan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsob2tk5ml7q9upk9qan.png" alt="Iniciando o GitFlow extensão" width="755" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele dá a liberdade de você alterar o nome das Branch de produção, ou a develop, como mudar os prefixos das outras Branches, por exemplo:&lt;br&gt;
Alterar a branch Feature para Feat, dando uma maior liberdade para cada pessoa/time.&lt;/p&gt;

&lt;p&gt;Usando &lt;code&gt;$ git flow init [-d]&lt;/code&gt; , ele aceita todos os nomes automaticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeira feature:
&lt;/h2&gt;

&lt;p&gt;Para criar a primeira Feature, o processo é extremamente simples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git flow feature start &amp;lt;NomeDaBranch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqfsnrq0v9kqwgjet26x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqfsnrq0v9kqwgjet26x.png" alt="Criando uma feature com o GitFlow" width="702" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso ele nos retorna algumas coisas, no &lt;code&gt;Summary of actions:&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma nova branch foi criada 'feature/formulairo' baseada na 'develop'.&lt;/li&gt;
&lt;li&gt;Agora você está na branch 'feature/formulario'.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Encerrando a feature:
&lt;/h2&gt;

&lt;p&gt;Após criar a primeira Feature, digamos que você já implementou e commitou todas as funcionalidades e agora precisa dar um Merge na Develop e excluir ela, para isso rodamos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git flow feature finish &amp;lt;NomeDaBranch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz1nvr2k9wpoetxxbxsq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnz1nvr2k9wpoetxxbxsq.png" alt="Finalizando a feature com o GitFlow" width="701" height="227"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Voltando para o &lt;code&gt;Summary of actions:&lt;/code&gt;, ele explica o que foi realizado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A branch de feature 'feature/formulario' foi mesclada com a 'develop'.&lt;/li&gt;
&lt;li&gt;Branch de feature 'feature/formulario' foi deletada localmente.&lt;/li&gt;
&lt;li&gt;Agora você está na branch 'develop'.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Chegamos ao fim, com isso você será capaz de organizar a linha do tempo do seu projeto, a ideia do GitFlow não é fundamental para o desenvolvedor, mas ao longo do tempo, conforme o projeto escala e existem diversas pessoas trabalhando em conjunto ele ajuda a manter a clareza no projeto, e ajuda a padronizar a forma que é realizado o processo de branchs.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Cherry pick — Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Wed, 09 Mar 2022 04:05:00 +0000</pubDate>
      <link>https://forem.com/eduardoopv/cherry-pick-git-e-github-5eph</link>
      <guid>https://forem.com/eduardoopv/cherry-pick-git-e-github-5eph</guid>
      <description>&lt;p&gt;As vezes precisamos &lt;strong&gt;pegar um commit&lt;/strong&gt; individual que se encontra em uma outra branch, com alguma feature ou correção que aconteceu em paralelo, o &lt;code&gt;Cherry pick&lt;/code&gt; faz exatamente isso, &lt;strong&gt;ele junta dois&lt;/strong&gt; commits em uma linha do tempo, evitando de repente de realizar um &lt;code&gt;Merge&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cherry pick
&lt;/h2&gt;

&lt;p&gt;Em alguns momentos nos vemos em uma situação onde estamos desenvolvendo em uma branch(chamaremos de Branch X), porém existe outro integrante do time que está trabalhando em uma task em outra branch (chamaremos de Branch Y), as duas estão sendo desenvolvidas juntas. O dev da branch Y encontrou e corrigiu um bug que impacta diretamente na task da branch X.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraysns0x8pxomd1i6f59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fraysns0x8pxomd1i6f59.png" alt="Cherry pick" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao invés de ter que realizar um commit e fazer um merge ou qualquer outra gambiarra (&lt;em&gt;Não precisa mandar o código pelo privado&lt;/em&gt;) pode ser feito um commit da correção e o dev da branch X usa o &lt;code&gt;Cherry pick&lt;/code&gt; para &lt;strong&gt;pegar apenas a correção&lt;/strong&gt; e trazer para a sua linha do tempo.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lembrando que o cherry pick não é bala de prata, as vezes realmente é melhor fazer um merge.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Cherry pick na prática
&lt;/h3&gt;

&lt;p&gt;Antes de irmos para o &lt;em&gt;Bash&lt;/em&gt;, é interessante esclarecer que é necessário ter duas branchs e pelo menos um commit na branch que você vai pegar o commit.&lt;/p&gt;

&lt;p&gt;Vamos começar bem do início, precisamos criar uma branch:&lt;br&gt;
&lt;code&gt;git checkout -b feat/header&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Realizar um commit:&lt;br&gt;
&lt;code&gt;git commit -am "Feat: create header"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criar uma nova branch (a que vai receber o commit, no caso da branch &lt;em&gt;feat/header&lt;/em&gt;).&lt;br&gt;
&lt;code&gt;git checkout -b feat/menu-hamburger&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ayuf8eszjw5gwohr2lq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ayuf8eszjw5gwohr2lq.png" alt="Output" width="580" height="194"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Imagine agora que o dev que está desenvolvendo na branch &lt;em&gt;feat/header&lt;/em&gt; encontrou um problema e já corrigiu, e a pessoa que está na &lt;em&gt;feat/menu-hamburger&lt;/em&gt; precisava ter acesso a essa correção.&lt;/p&gt;

&lt;p&gt;Agora precisamos pegar o &lt;em&gt;HASH&lt;/em&gt; (Identificador) do commit que queremos, para isso vamos na branch que está o commit:&lt;br&gt;
&lt;code&gt;git checkout feat/header&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Rodamos um git log para mostrar os commit e seu respectivo HASH:&lt;br&gt;
&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Voltamos para a branch que ira receber o commit:&lt;br&gt;
&lt;code&gt;git checkout feat/menu-hamburger&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E rodamos o tão famoso &lt;em&gt;Cherry-pick&lt;/em&gt;, lembrando de passar o &lt;em&gt;HASH&lt;/em&gt;:&lt;br&gt;
&lt;code&gt;git cherry-pick 68bbe92&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dleowj2e6zk6usmsr8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dleowj2e6zk6usmsr8n.png" alt="Output" width="644" height="299"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Resolva os conflitos, se existirem&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Pegar um conjunto de commit
&lt;/h3&gt;

&lt;p&gt;Mas e se eu quiser pegar mais de um commit, será que dá? &lt;strong&gt;SIM!&lt;/strong&gt;, o &lt;code&gt;Cherry pick&lt;/code&gt; suporta esse tipo de ação.&lt;br&gt;
Segue os mesmo passos do anterior, porém, invés de pegar apenas um HASH você precisa pegar o último e o primeiro (&lt;em&gt;Calma, eu não digitei errado, o último realmente vem na frente&lt;/em&gt;) commit que você quer, e ira pegar todos que estiverem dentro dele, a sintaxe é extremamente fácil:&lt;/p&gt;

&lt;p&gt;Devemos pegar os dois HASH (o ultimo e o primeiro):&lt;br&gt;
&lt;em&gt;Lembrando que o &lt;code&gt;HASH-A&lt;/code&gt; (o ultimo) deve estar após o &lt;code&gt;HASH-B&lt;/code&gt; (o primeiro), ou seja ser mais velho na linha do tempo.&lt;/em&gt;&lt;br&gt;
&lt;code&gt;git cherry-pick HASH-A HASH-B&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbwkyw91shqqrz5qfv6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbwkyw91shqqrz5qfv6e.png" alt="Output" width="644" height="274"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Conflitos:
&lt;/h3&gt;

&lt;p&gt;Caso você queira cancelar um &lt;code&gt;Cherry pick&lt;/code&gt;, é simples, passe a &lt;strong&gt;flag&lt;/strong&gt; —abort:&lt;br&gt;
&lt;code&gt;git cherry-pick --abort&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para continuar, use a &lt;strong&gt;flag&lt;/strong&gt; —continue: &lt;br&gt;
&lt;code&gt;git cherry-pick --continue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E para pular, —skip:&lt;br&gt;
&lt;code&gt;git cherry-pick --skip&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;Nesse post vimos como o &lt;code&gt;Cherry pick&lt;/code&gt; é &lt;strong&gt;extremamente poderoso e importante de conhecer&lt;/strong&gt;, em algum momento você vai precisar usar, e ele vai salvar a sua vida. É importante identificar quando é melhor utilizar o &lt;code&gt;Cherry pick&lt;/code&gt; e quando usar o &lt;code&gt;Merge&lt;/code&gt;, mas fique tranquilo por que isso vem com o tempo.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Conceito de Merge — Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 13 Jan 2022 14:41:43 +0000</pubDate>
      <link>https://forem.com/eduardoopv/conceito-de-merge-git-e-github-4j0g</link>
      <guid>https://forem.com/eduardoopv/conceito-de-merge-git-e-github-4j0g</guid>
      <description>&lt;p&gt;Após conhecermos a tão famosa &lt;strong&gt;Branch&lt;/strong&gt; que tem como propósito &lt;em&gt;dividir&lt;/em&gt; a linha original do desenvolvimento do projeto, precisamos &lt;em&gt;"trazer"&lt;/em&gt; de volta para a branch main/master, dei uma breve explicação de como fazer isso em &lt;em&gt;&lt;a href="https://dev.to/eduardoopv/conceito-de-branch-git-e-github-2bfe"&gt;Conceito de branch&lt;/a&gt;&lt;/em&gt;, porém chegou a hora de se aprofundar no &lt;strong&gt;merge&lt;/strong&gt; e resolver os possíveis conflitos que irão aparecer(uma hora ou outra).&lt;/p&gt;




&lt;h2&gt;
  
  
  Merge
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://git-scm.com/book/pt-br/v2/Branches-no-Git-O-b%C3%A1sico-de-Ramifica%C3%A7%C3%A3o-Branch-e-Mesclagem-Merge" rel="noopener noreferrer"&gt;merge&lt;/a&gt;(mesclagem) é o jeito do Git de pegar duas branchs e unificar em apenas um histórico. O comando &lt;code&gt;git merge&lt;/code&gt; permite que você pegue as linhas de desenvolvimento independentes criadas pelo &lt;code&gt;git branch&lt;/code&gt; e junta elas em apenas uma ramificação.&lt;/p&gt;

&lt;p&gt;É de extrema importância ter algo bem claro na hora de realizar um merge, sempre a branch que você está &lt;strong&gt;(HEAD)&lt;/strong&gt; vai ser a que vai "receber" a branch, sendo atualizado para refletir a mesclagem, a branch alvo não sofre nenhum tipo de alteração.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git merge&lt;/code&gt; é usado sempre depois do &lt;code&gt;git checkout&lt;/code&gt; para selecionar o branch atual que irá receber e com o &lt;code&gt;git branch -d&lt;/code&gt; para excluir o branch alvo obsoleto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0tg9kcg9dlp2vuy5hbd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0tg9kcg9dlp2vuy5hbd.jpg" alt="Ilustração de varias ramificações" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Merge na prática
&lt;/h2&gt;

&lt;p&gt;Vamos utilizar um exemplo prático, digamos que você desenvolveu um &lt;em&gt;Header&lt;/em&gt; bem básico representado pela branch &lt;em&gt;feat/header (Nomenclatura tirada do &lt;a href="https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow" rel="noopener noreferrer"&gt;Git Flow&lt;/a&gt;, explicarei futuramente)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxymop9un20l1zge3mrt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxymop9un20l1zge3mrt.png" alt="Branch criada com o header" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de ter criado uma branch com &lt;code&gt;git checkcout -b feat/header&lt;/code&gt; &lt;em&gt;(Lembrando que a flag -b do checkout cria uma branch e já move para ela)&lt;/em&gt;, realizamos as criações necessárias e commitamos o arquivo &lt;code&gt;index.html&lt;/code&gt; com &lt;code&gt;git commit -am "feat: header"&lt;/code&gt;&lt;em&gt;(Lembrando que a flag -am adiciona os arquivos e já realiza o commit)&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Agora o que precisamos fazer para juntar essa nova feature na branch principal, precisamos ir para a branch receptora, sempre atento para onde o HEAD está apontado, e realizamos o merge. Uma vez que a branch ficou obsoleta podemos excluir ela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxv50fa19tamwks65obow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxv50fa19tamwks65obow.png" alt="Output após o comando merge" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resolvendo Conflitos
&lt;/h2&gt;

&lt;p&gt;Durante o processo de criação e branchs e a junção com o merge, é possível que mais de um desenvolvedor edite a mesma linha de código, com isso o Git gera um conflito, por ter dois commits o Git não sabe qual utilizar, e não consegue resolver esse problema sozinho, é necessário que o usuário decida qual é o correto.&lt;/p&gt;

&lt;p&gt;Digamos que você ficou responsável por editar um link do header e um colega recebeu uma task para alterar a logo do footer, porém acabou adicionando alguns caracteres sem querer no link que você está alterando.&lt;/p&gt;

&lt;p&gt;Primeiro você cria uma nova branch de correção e realiza a alteração, cria um commit e mescla com a branch master, durante esse processo um colega adicionou o caractere acidental e realizou um commit na master.&lt;/p&gt;

&lt;p&gt;Nossa alteração:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tf9bhrnpy7kpsx4fjah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tf9bhrnpy7kpsx4fjah.png" alt="Alterações no Index.html" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acidente: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys7bgr54ci700kzdsh18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys7bgr54ci700kzdsh18.png" alt="Index.html com as alterações acidentais" width="361" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você finalizou todas as alterações e da um &lt;code&gt;git checkout master&lt;/code&gt; que será a branch receptora, e realiza o &lt;code&gt;git merge fix/header&lt;/code&gt;, e acaba vendo um output no terminal &lt;em&gt;CONFLICT&lt;/em&gt;, e repara que algo mudou no editor de texto (&lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Terminal: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipvy4mcdaf78ezogm36m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipvy4mcdaf78ezogm36m.png" alt="Output terminal conflict" width="489" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual Studio Code:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygsgjuxkkrgzwzu63p7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygsgjuxkkrgzwzu63p7s.png" alt="Vistual Studio Code resolvendo conflito" width="702" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reparamos que ele adicionou alguns caracteres:&lt;br&gt;
&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; Branch receptora (HEAD)&lt;br&gt;
&lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; Branch de mesclagem (fix/header)&lt;br&gt;
&lt;code&gt;=======&lt;/code&gt; Separa as branchs, o de cima represente a branch recepctora e de baixo a de mesclagem.&lt;/p&gt;

&lt;p&gt;E podemos ver que existe um menu (clicavel) acima do conflito, nele existe algumas opções rápidas que podemos realizar, as mais importantes são:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Accept Current Change&lt;/code&gt;: Irá aceitar a branch receptora, nesse caso ele iria manter os caracteres acidentais.&lt;br&gt;
&lt;code&gt;Accept Incoming Change&lt;/code&gt;: Irá aceitar a alteração realizada no header, nesse caso seria "Conheça nossa empresa"&lt;br&gt;
&lt;code&gt;Accpet Both Changes&lt;/code&gt;: Ele aceita as duas modificações, criando então duas linhas, uma com os caracteres e outra com as alterações.&lt;/p&gt;

&lt;p&gt;No nosso caso queremos aceitar apenas o &lt;code&gt;Accept Incoming Change&lt;/code&gt; para manter as alterações que realizamos na branch &lt;code&gt;fix/header&lt;/code&gt;, podemos ver que nada muda, por que os arquivos conflitantes agora estão como &lt;em&gt;"&lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging" rel="noopener noreferrer"&gt;Unmerged&lt;/a&gt; patch"&lt;/em&gt;, precisamos adicionar ele no próximo commit &lt;code&gt;git add .&lt;/code&gt; e criar um commit de resolução &lt;code&gt;git commit -m "resolve conflitos no header"&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklwqxajl58krft2qmb0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fklwqxajl58krft2qmb0m.png" alt="Terminal de commit do conflito" width="519" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;E pronto temos o nosso conflito mais comum de acontecer resolvido e já podemos excluir a branch obsoleta das modificações.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Conceito de Branch — Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Sun, 09 Jan 2022 03:07:01 +0000</pubDate>
      <link>https://forem.com/eduardoopv/conceito-de-branch-git-e-github-2bfe</link>
      <guid>https://forem.com/eduardoopv/conceito-de-branch-git-e-github-2bfe</guid>
      <description>&lt;p&gt;Depois de conhecermos os &lt;em&gt;&lt;a href="https://dev.to/eduardoopv/3-estados-dos-arquivos-git-e-github-3ee6"&gt;3 Estados dos arquivos&lt;/a&gt;&lt;/em&gt; rastreados pelo Git, conseguimos entender e criar o nosso &lt;em&gt;&lt;a href="https://dev.to/eduardoopv/primeiro-repositorio-git-e-github-jeo"&gt;Primeiro repositório&lt;/a&gt;&lt;/em&gt; no Github, já enviando os arquivos do projeto para o repositório remoto, agora precisamos entender um conceito um pouco mais avançado do Git, as &lt;em&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Branching-Branch-Management" rel="noopener noreferrer"&gt;Branchs&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que são as Branchs?
&lt;/h2&gt;

&lt;p&gt;As &lt;em&gt;branchs(ramificações)&lt;/em&gt; é como se fosse uma &lt;strong&gt;linha independente de desenvolvimento&lt;/strong&gt;, todo projeto precisa conter pelo menos uma que é criada automaticamente após o primeiro commit, chamada de &lt;em&gt;main/master&lt;/em&gt;. Podemos criar novas ramificações principalmente quando precisamos &lt;strong&gt;adicionar uma nova funcionalidade, ou corrigir algum bug&lt;/strong&gt;, sem interferir no desenvolvimento e andamento do projeto.&lt;/p&gt;

&lt;p&gt;Podemos abstrair um pouco tudo isso imaginando a branch como uma &lt;em&gt;"linha do tempo"&lt;/em&gt;, possuímos a main/master onde o progresso de desenvolvimento ocorre naturalmente, ao criarmos uma nova branch criamos uma nova &lt;em&gt;"linha do tempo"&lt;/em&gt; com o mesmo código da main, a diferença é que podemos realizar alterações tranquilamente, já que estamos em uma &lt;em&gt;"linha do tempo"&lt;/em&gt; paralela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu5t8kxe4h1mcmvbrvm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzu5t8kxe4h1mcmvbrvm0.png" alt="Imagem descrevendo as Branchs" width="450" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa imagem ilustra bem o conceito, onde a &lt;em&gt;Branch 1&lt;/em&gt; e a &lt;em&gt;Branch 2&lt;/em&gt; podem ser uma nova feature ou uma correção/alteração e a &lt;em&gt;master&lt;/em&gt; segue intacta, agora partiremos para o terminal &lt;em&gt;Bash&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Branch na prática
&lt;/h2&gt;

&lt;p&gt;Para começarmos, que tal nós visualizarmos as novas branchs existentes? no git bash podemos utilizar o comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Caso nenhuma branch tenha sido criada, só irá mostrar a &lt;em&gt;main/master&lt;/em&gt; que vem por padrão, para criarmos uma nova é realmente simples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch NomeDaBranch&lt;/code&gt;&lt;br&gt;
&lt;em&gt;(Lembrando que precisamos ter pelo menos um commit no projeto, para o git identificar qual é a branch principal)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Algo normal de acontecer na correria do dia a dia é criar branch com nome errado, para isso o Git tem um comando super simples para renomear uma branch.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch -m NovoNomeDaBranch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aparentemente nada mudou, isso é por que você precisa "mover" para a branch criada, você ainda está na &lt;em&gt;main/master&lt;/em&gt;, para irmos basta utilizar o comando &lt;em&gt;checkout&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git checkout NomeDaBranch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora podemos realizar as nossas modificações no código sem interferir na versão principal.&lt;/p&gt;

&lt;p&gt;Caso queira excluir a branch, uma vez que ela não será mais usada, lembrando que para isso precisamos estar "fora" da ramificação que vamos deletar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch -d NomeDaBranch&lt;/code&gt;&lt;br&gt;
ou&lt;br&gt;
&lt;code&gt;$ git branch -D NomeDaBranch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ok, mas qual a diferença de &lt;code&gt;-d&lt;/code&gt; para &lt;code&gt;-D&lt;/code&gt;?&lt;br&gt;
Ao usar o &lt;code&gt;-d&lt;/code&gt; minúsculo, seria uma forma "segura", já que o Git irá impedir de excluir a ramificação se existirem mudanças não mescladas(Irei explicar um pouco a frente o que significa mesclagem).&lt;br&gt;
E o &lt;code&gt;-D&lt;/code&gt; maiúsculo seria ao contrario, ele força uma exclusão mesmo se houver mudanças não mescladas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88k7736et8tdla247uap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88k7736et8tdla247uap.png" alt="Demonstração dos comandos na prática" width="576" height="455"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Merge
&lt;/h2&gt;

&lt;p&gt;Chegou o momento mais esperado, você finalizou a task, corrigiu o bendito bug no header, e está usando uma branch separada &lt;code&gt;fix/header&lt;/code&gt;, agora como podemos juntar essa &lt;em&gt;"linha do tempo"&lt;/em&gt; com a ramificação principal? Bem simples, podemos utilizar o &lt;em&gt;&lt;a href="https://git-scm.com/docs/git-merge" rel="noopener noreferrer"&gt;Merge&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3r4etsulibq9er474czj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3r4etsulibq9er474czj.jpg" alt="Antes de depois do merge" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiro precisamos ir para a branch que queremos receber as alterações e em seguida mesclar as alterações com o merge:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git merge fix/header&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyygxjaslelgspwkxhh84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyygxjaslelgspwkxhh84.png" alt="Usando o comando merge" width="544" height="197"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Agora você conhece um dos principais conceitos do Git, muito utilizado quando existe mais de um desenvolvedor em um projeto, dessa maneira fica tudo bem divido evitando mexerem na mesma linha de código e criarem um conflito ou até pior...&lt;/p&gt;

&lt;p&gt;Fontes:&lt;br&gt;
&lt;a href="https://www.hostinger.com.br/tutoriais/git-branch" rel="noopener noreferrer"&gt;https://www.hostinger.com.br/tutoriais/git-branch&lt;/a&gt;&lt;br&gt;
&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;https://git-scm.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Primeiro repositório — Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 06 Jan 2022 13:26:03 +0000</pubDate>
      <link>https://forem.com/eduardoopv/primeiro-repositorio-git-e-github-jeo</link>
      <guid>https://forem.com/eduardoopv/primeiro-repositorio-git-e-github-jeo</guid>
      <description>&lt;p&gt;Um pouco sobre o que é &lt;em&gt;&lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;Git&lt;/a&gt;&lt;/em&gt; e &lt;em&gt;&lt;a href="https://github.com/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/em&gt; e como podemos criar repositórios remotos através de projetos já existentes ou até criar um do zero, após ler o artigo anterior &lt;em&gt;‘&lt;a href="https://dev.to/eduardoopv/3-estados-dos-arquivos-git-e-github-3ee6"&gt;3 Estados dos arquivos — Git e Github&lt;/a&gt;’&lt;/em&gt; que mostra os estados dos arquivos rastreados pelo Git.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Git é um sistema de controle de versão distribuído gratuito e de código aberto projetado para lidar com tudo, desde projetos pequenos a muito grandes com velocidade e eficiência.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Através deles podemos desenvolver projetos locais e manter eles guardados remotamente, e temos uma segurança na qual diversas pessoas podem contribuir simultaneamente no mesmo projeto, &lt;strong&gt;editando e criando&lt;/strong&gt; novos arquivos e permitindo que os mesmos possam existir sem o risco de suas alterações serem sobrescritas.&lt;/p&gt;

&lt;p&gt;Junto a ferramenta do &lt;strong&gt;Git&lt;/strong&gt; temos a plataforma do &lt;strong&gt;Github&lt;/strong&gt;, pense nele como um &lt;strong&gt;Cloud&lt;/strong&gt; (nuvem) dos códigos, ele representa um serviço de hospedagem de repositório online. Ou seja, é uma rede planejada para projetos que utilizem o &lt;strong&gt;Git&lt;/strong&gt; como controlador de versão.&lt;/p&gt;




&lt;h2&gt;
  
  
  Git:
&lt;/h2&gt;

&lt;p&gt;Para começarmos a utilizar o &lt;strong&gt;Git&lt;/strong&gt;, precisamos fazer o download dele. Link aqui e instale ele normalmente. E agora temos o tão famoso &lt;strong&gt;Git Bash&lt;/strong&gt; que seria mais ou menos um ‘Prompt de comando’ do &lt;strong&gt;Git&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Use no &lt;strong&gt;Git bash&lt;/strong&gt; o comando &lt;code&gt;git --version&lt;/code&gt; para verificar se a instalação foi concluída.&lt;/p&gt;

&lt;p&gt;Agora vamos configurar o seu &lt;strong&gt;Git local&lt;/strong&gt; com a sua conta do &lt;strong&gt;Github&lt;/strong&gt; (Não tem conta no Github? &lt;a href="https://github.com/signup?ref_cta=Sign+up&amp;amp;ref_loc=header+logged+out&amp;amp;ref_page=%2F%3Cuser-name%3E&amp;amp;source=header" rel="noopener noreferrer"&gt;Crie uma aqui&lt;/a&gt;)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$ git config --global user.name SeuUsernameDoGitHub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ git config --global user.email seuemail@gmail.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ git config --global core.editor SeuEditorDeTexto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ git config --list&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Uma explicação de cada comando:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Para definir o seu nome (ira aparecer no Github quando fizer um commit, e outras coisas),&lt;/li&gt;
&lt;li&gt;Para definir o seu email (também ira aparecer nos commits),&lt;/li&gt;
&lt;li&gt;Configurar o Editor de texto,&lt;/li&gt;
&lt;li&gt;Visualizar se as alterações foram salvas com sucesso.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Github:
&lt;/h2&gt;

&lt;p&gt;Agora que estamos com o nosso ambiente local com o &lt;strong&gt;Git&lt;/strong&gt; instalado e configurado, chegou a hora de irmos para a ferramenta Github, primeiro vamos criar o primeiro repositório (projeto).&lt;/p&gt;

&lt;p&gt;Clicar em ‘New’ na Dashboard do Github.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1nbwvqoyy50b27xssxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1nbwvqoyy50b27xssxl.png" alt="Clicar para criar novo projeto" width="409" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa parte podemos criar algumas configurações do repositório (Elas podem ser alteradas futuramente, não se preocupe).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvlilj5ty933v8s3ffdj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvlilj5ty933v8s3ffdj.png" alt="Configurações do repositório github" width="700" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository name&lt;/strong&gt;: O nome do repositório que ira aparecer no seu perfil.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: A descrição que ira mostrar quando abrirem o repositório (Escrita em &lt;em&gt;&lt;a href="https://www.markdownguide.org/getting-started/" rel="noopener noreferrer"&gt;Markdown&lt;/a&gt;&lt;/em&gt; pelo arquivo &lt;em&gt;README.md&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public/Private&lt;/strong&gt;: Isso ira definir se outras pessoas poderão visualizar o projeto&lt;/p&gt;

&lt;p&gt;Clicando em &lt;em&gt;‘Create repository’&lt;/em&gt; seremos redirecionado para a seguinte página:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod3utlu0dwty1549qsmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fod3utlu0dwty1549qsmo.png" alt="Orientação do github para sincronizar" width="700" height="396"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sincronizando repositório remoto
&lt;/h2&gt;

&lt;p&gt;Já temos o Git configurado e o repositório no Github criado, e agora o que falta? precisamos criar e enviar arquivos do nosso projeto local onde ele existe apenas no seu computador pessoal, para o novo projeto remoto que existe remotamente no Github, para isso vamos para a pasta do projeto, clique com direito em qualquer lugar e selecione a opção &lt;em&gt;‘Git Bash’&lt;/em&gt; (No meu caso é uma pasta chamada Git no Desktop).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ echo "# Estudo Git e Github" &amp;gt;&amp;gt; README.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criamos o arquivo &lt;code&gt;README.md&lt;/code&gt; responsável pela documentação do projeto, o Github sempre ira ler ele &lt;em&gt;(Markdown)&lt;/em&gt; e mostrar na tela inicial do repositório.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git init&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inicializamos o Git naquela pasta, ou seja a partir de agora ele irá rastrear todos os arquivos novos dessa pasta.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git add README.md&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Diz ao Git adicionar o arquivo &lt;code&gt;README.md&lt;/code&gt;ao estado de &lt;em&gt;‘Staged area’&lt;/em&gt; basicamente o arquivo ainda está local porém está pronto para ser Commitado.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git commit -m "First commit"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;É como se o Git tirasse uma foto de todos os arquivos que estão em &lt;em&gt;‘Staged area’&lt;/em&gt; e guardasse em um bloco, com uma mensagem identificadora &lt;em&gt;‘First commit’&lt;/em&gt; uma boa prática é conjugar o verbo no &lt;strong&gt;presente do indicativo&lt;/strong&gt;, utilizando a &lt;strong&gt;terceira pessoa do singular&lt;/strong&gt; (Mais tarde isso irá fazer mais sentido).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch -M main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Criamos e movemos para uma nova branch &lt;em&gt;‘main’&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git remote add origin https://github.com/EduardooPV/git-e-github.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Adicionamos um novo controle remoto&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git push -u origin main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Estamos enviando todos os commits realizados localmente para o repositório remoto, se atualizarmos a página no Github veremos que agora existe um novo arquivo chamado &lt;code&gt;README.md&lt;/code&gt; que nós criamos com o &lt;code&gt;echo &amp;gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Extra: sempre use o &lt;code&gt;$ git status&lt;/code&gt; para verificar o status dos seus comandos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yswwbmk4jpud4sl93ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yswwbmk4jpud4sl93ew.png" alt="Repositório já no github" width="700" height="311"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Por enquanto é isso, se você adicionar ou modificar arquivos na sua pasta que está sincronizada com o repositório remoto, você só precisara adicionar eles ao &lt;em&gt;‘Staged area’&lt;/em&gt; usando o &lt;br&gt;
&lt;code&gt;$ git add .&lt;/code&gt; (O ponto adiciona todos os arquivos), após adicionar todos os arquivos desejados para formar um commit, use o comando &lt;code&gt;$ git commit -m "Nome do commit"&lt;/code&gt;, e mande suas alterações para o repositório remoto com &lt;code&gt;$ git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Essa é a primeira parte de uma série de tutoriais sobre Git e Github, futuramente irei trazer novos conceitos mais avançados e até uma forma de padronizar seus commits e branchs utilizando um conceito bem famoso chamado Gitflow.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>3 Estados dos arquivos — Git e Github</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Thu, 06 Jan 2022 13:04:28 +0000</pubDate>
      <link>https://forem.com/eduardoopv/3-estados-dos-arquivos-git-e-github-3ee6</link>
      <guid>https://forem.com/eduardoopv/3-estados-dos-arquivos-git-e-github-3ee6</guid>
      <description>&lt;p&gt;Chegou a hora de entendermos sobre os &lt;strong&gt;três estados&lt;/strong&gt; dos arquivos dentro de um projeto, e como somos capazes de alterar o estado deles e até visualizar as &lt;strong&gt;modificações atuais&lt;/strong&gt; comparado com o commit anterior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl71mnta18v8fecoldcd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl71mnta18v8fecoldcd2.png" alt="Lifecycle dos arquivos" width="498" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Working directory (modified)
&lt;/h2&gt;

&lt;p&gt;É o estado em que todo arquivo que foi &lt;strong&gt;adicionado, modificado ou removido&lt;/strong&gt;, resulta em arquivo modificado, já que está diferente do estado atual, porém ele ainda não está dentro do próximo commit. Ou seja, o projeto está diferente comparado com a ultima versão.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Staging area (staged)
&lt;/h2&gt;

&lt;p&gt;O arquivo só fica &lt;strong&gt;‘preparado’&lt;/strong&gt; após executarmos o comando &lt;code&gt;git add&lt;/code&gt; , resumindo o git já reconhece o arquivo que foi modificado e agora ele está na área de preparação e estará dentro do próximo commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Commit area (commited)
&lt;/h2&gt;

&lt;p&gt;Agora que já temos todos os arquivos modificados e adicionados no Staged area, podemos formar um commit, com o seguinte comando &lt;code&gt;git commit "Nome commit"&lt;/code&gt; , é importante lembrar que se existirem arquivos fora do Staged, ainda como &lt;strong&gt;modified&lt;/strong&gt; ele não será adicionado no commit atual. Podemos formar um commit de diferentes maneiras, uma nova feature ou uma correção, depende da ocasião.&lt;br&gt;
Podemos enviar para o Github com o comando &lt;code&gt;git push&lt;/code&gt; e recomeça todo o ciclo novamente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Restaurando arquivos
&lt;/h2&gt;

&lt;p&gt;Já conhecemos o fluxo dos arquivos dentro do Git, podemos criar um cenário hipotético onde você ficou encarregado de realizar algumas modificações no projeto, você fez todas as alterações e adicionou os arquivos ao &lt;code&gt;staged area&lt;/code&gt; com o &lt;code&gt;git add .&lt;/code&gt; porém um arquivo foi de intruso e precisa ser adicionado em um outro commit, precisamos tirar ele usando o comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git restore --staged File.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esse comando irá &lt;strong&gt;retirar o arquivo&lt;/strong&gt; ‘File.html’ do staged, ou seja, ele vai voltar para o inicio do processo e vai estar apenas como modified.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git restore --staged *.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Remove todos os arquivos na staged que terminem com &lt;code&gt;.css&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git restore .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Remove todos os arquivos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xiz9vz1jr17gdskz069.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xiz9vz1jr17gdskz069.png" alt="Output do comando git restore" width="659" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos também restaurar um ponto histórico exato usando o &lt;code&gt;git restore --source&lt;/code&gt; porém é um conceito um pouco mais avançado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visualizando diferenças
&lt;/h2&gt;

&lt;p&gt;Sabemos adicionar e remover os arquivos entre os estados, existe um comando bem interessante na hora que você está desenvolvendo algo e precisa &lt;strong&gt;visualizar&lt;/strong&gt; as modificações que você realizou.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git diff&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ele permite ver as alterações que foram realizadas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz9h8hrr3cagwqdnfy51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz9h8hrr3cagwqdnfy51.png" alt="Output do comando git diff" width="717" height="347"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Nesse post apresentei alguns conceitos ainda iniciante porem &lt;strong&gt;fundamental&lt;/strong&gt; para um bom desenvolvimento, são comando usado no &lt;strong&gt;dia a dia de um projeto&lt;/strong&gt;. Importante você conhecer os três estados para saber quais arquivos vão para o próximo commit, ou quais arquivos precisam ser adicionados/removidos, também vimos uma forma de &lt;strong&gt;visualizar as alterações&lt;/strong&gt; que foram realizadas sendo comparadas com as do commit anterior.&lt;/p&gt;

&lt;p&gt;Fontes:&lt;br&gt;
&lt;a href="https://git-scm.com/book/pt-br/v2/Fundamentos-de-Git-Gravando-Altera%C3%A7%C3%B5es-em-Seu-Reposit%C3%B3rio" rel="noopener noreferrer"&gt;https://git-scm.com/book/pt-br/v2/Fundamentos-de-Git-Gravando-Altera%C3%A7%C3%B5es-em-Seu-Reposit%C3%B3rio&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>programming</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introdução a testes unitários com Jest e Testing Library React.js</title>
      <dc:creator>Luiz Eduardo Prado Veltroni</dc:creator>
      <pubDate>Wed, 05 Jan 2022 13:14:05 +0000</pubDate>
      <link>https://forem.com/eduardoopv/introducao-a-testes-unitarios-com-jest-e-testing-library-reactjs-491n</link>
      <guid>https://forem.com/eduardoopv/introducao-a-testes-unitarios-com-jest-e-testing-library-reactjs-491n</guid>
      <description>&lt;p&gt;Nesse guia, eu trago uma introdução de teste unitários utilizando duas ferramentas, Jest e Testing Library no React.js&lt;/p&gt;

&lt;p&gt;É de extrema importância a implementação de testes em seus projetos, principalmente naqueles que serão grandes, e que existem uma grande probabilidade de inclusão de novos desenvolvedores durante o processo de criação.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“No começo criar testes pode atrasar o desenvolvimento e não mostrar explicitamente a vantagem da criação desses testes, mas com o crescimento da aplicação ou sendo uma aplicação pequena mas muito importante, é essencial ter essa confiança de desenvolver sabendo que o código novo não vai afetar a funcionalidade do antigo e abranger várias situações que podem acontecer com o componente.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Entendendo os testes
&lt;/h2&gt;

&lt;p&gt;As vezes algumas dúvidas surgem, do tipo, como que eu irei testar um componente? O que eu preciso testar nele? Preciso checar o valor das variáveis? O foco desses testes não são checar todas as linhas e entranhas do código, você precisa testar o tem que acontecer com o componente, como se fosse realmente um usuário.&lt;br&gt;
Um exemplo de linha de raciocínio de testes, sendo ele um &lt;code&gt;&amp;lt;Button /&amp;gt;&lt;/code&gt;, quais são as funcionalidades de um botão?:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deve apareça na tela,&lt;/li&gt;
&lt;li&gt;Deve ter um atributo (href, role, onClick, etc...),&lt;/li&gt;
&lt;li&gt;Deve chamar uma função quando houver um click(onClick),&lt;/li&gt;
&lt;li&gt;Deve estar desativado quando eu mandar desativado,&lt;/li&gt;
&lt;li&gt;Deve estar ativo quando eu mandar ativado.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Criando nosso projeto
&lt;/h2&gt;

&lt;p&gt;Para criar um projeto com tudo organizado e configurado, utilize o comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn create next-app --exemple with-jest with-jest-ap&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Todos os testes terão uma extensão &lt;code&gt;.test.jsx&lt;/code&gt; ou &lt;code&gt;spec.jsx&lt;/code&gt; , é uma boa prática incluir todos em uma pasta na raiz do projeto chamada &lt;code&gt;__tests__&lt;/code&gt;, agora para rodar o nosso primeiro teste que já vem implementado, basta digitar no console&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn test&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E Teremos um output parecido com esse:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8d92c59wudwmjvzo33gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8d92c59wudwmjvzo33gv.png" alt="Output terminal com as informações dos tests" width="432" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basta pressionar a tecla “a” e ele ia rodar no formato &lt;code&gt;--watch&lt;/code&gt; passando esse parâmetro, é como se o teste ficasse assistindo toda alteração que é salva no projeto e ele roda os testes novamente, evitando o trabalho de ficar digitando &lt;code&gt;yarn dev&lt;/code&gt; toda hora no console.&lt;/p&gt;


&lt;h2&gt;
  
  
  Testes na prática:
&lt;/h2&gt;

&lt;p&gt;A estrutura base do teste ficaria mais ou menos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;describe('&amp;lt;Componente /&amp;gt;', () =&amp;gt; {
  it('should test', () =&amp;gt; {
    expect()
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;describe:&lt;/strong&gt; seria um conjunto de testes de um mesmo componente (No caso o &lt;code&gt;&amp;lt;Home /&amp;gt;&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;it:&lt;/strong&gt; seria uma unidade de teste, uma boa prática começar com “should” para ficar mais intuitivo,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;expect:&lt;/strong&gt; espera que contem algo.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Uma boa prática seria na parte do “describe” sempre colocar o nome do Componente &lt;code&gt;&amp;lt;Home /&amp;gt;&lt;/code&gt; para ficar claro onde o teste falhou, já que nunca teremos dois componentes com o mesmo nome.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora trazendo para um cenário um pouco mais real, iremos testar um componente &lt;code&gt;&amp;lt;Button /&amp;gt;&lt;/code&gt; checando algumas coisas simples, como texto e atributo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfqrqew5nq9aygx86rnn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfqrqew5nq9aygx86rnn.png" alt="Estrutura de exemplo usando um botão" width="482" height="233"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;6- Importação necessárias para rodar os testes,&lt;br&gt;
7- Importação do componente.&lt;br&gt;
9- Agrupamento dos testes, descrever o componente para ficar fácil a identificação,&lt;br&gt;
10- O teste em si, lembrando de sempre começar com should, para ficar intuitivo,&lt;br&gt;
11- Utilizando o &lt;code&gt;render()&lt;/code&gt; função para "renderizar" o componente,&lt;br&gt;
13- Nós capturamos o componente através do &lt;br&gt;
&lt;code&gt;getByRole()&lt;/code&gt; e jogamos ele na variável &lt;code&gt;button&lt;/code&gt;,&lt;br&gt;
15- Chamamos &lt;code&gt;expect()&lt;/code&gt; funcão para chegar se o &lt;code&gt;button&lt;/code&gt; existe no documento com a função &lt;code&gt;toBeInTheDocument()&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;E com isso encerro a primeira parte da introdução de testes unitários utilizando Jest e Testing Library no React.js. Claro que tudo isso é apenas um pedaço desse mundo gigante de testes no Front-end, essa introdução foi só para mostrar na pratica como podemos testar alguns componentes um pouco mais simples.&lt;/p&gt;

&lt;p&gt;Fontes:&lt;br&gt;
&lt;a href="https://pt-br.reactjs.org/" rel="noopener noreferrer"&gt;https://pt-br.reactjs.org/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://jestjs.io/pt-BR/" rel="noopener noreferrer"&gt;https://jestjs.io/pt-BR/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://testing-library.com/" rel="noopener noreferrer"&gt;https://testing-library.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>programming</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
