<?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>DEV Community: Vitor Jr.</title>
    <description>The latest articles on DEV Community by Vitor Jr. (@epochchrono).</description>
    <link>https://dev.to/epochchrono</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%2F1096832%2F2e8a67a1-5cf4-4189-8f68-382127eac1e2.png</url>
      <title>DEV Community: Vitor Jr.</title>
      <link>https://dev.to/epochchrono</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/epochchrono"/>
    <language>en</language>
    <item>
      <title>Aprendendo Git Branching - Push &amp; Pull - repositórios remotos no Git!</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Fri, 09 Jun 2023 13:53:39 +0000</pubDate>
      <link>https://dev.to/epochchrono/aprendendo-git-branching-push-pull-repositorios-remotos-no-git-2lh</link>
      <guid>https://dev.to/epochchrono/aprendendo-git-branching-push-pull-repositorios-remotos-no-git-2lh</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Remote
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Push &amp;amp; Pull - repositórios remotos no Git!
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Introdução a clonagem
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Repositórios remotos não são algo muito complicado. Nos dias atuais de computação em nuvem, seria fácil pensar que existiria muita mágica por trás dos remotos do Git, mas não é o caso -- eles são na verdade apenas cópias do seu repositório em outro computador. Você pode geralmente comunicar-se com esse outro computador por meio da Internet, o que permite que você transfira commits de um lado para o outro.&lt;/li&gt;
&lt;li&gt;Tendo dito isto, repositórios remotos tem uma série de propriedades interessantes:

&lt;ul&gt;
&lt;li&gt;Primeiro e antes de tudo, repositórios remotos servem como um ótimo backup! Repositórios Git locais possuem a habilidade de restaurar um arquivo para um estado anterior (como você sabe), mas toda a informação está guardada localmente. Tendo cópias do seu repositório Git em outros computadores, mesmo se você perder todos os seus dados locais, ainda terá como recomeçar do mesmo ponto de onde você tinha parado.&lt;/li&gt;
&lt;li&gt;Ainda mais importante, repositórios remotos tornam o desenvolvimento uma atividade social! Agora que uma cópia do seu projeto está hospedada em outro lugar, seus amigos podem contribuir para o seu projeto (ou obter as suas últimas alterações) de uma forma bastante simples.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Está se tornando bastante popular o uso de websites para visualizar a atividade em repositórios (como o GitHub), mas o recurso de repositórios remotos sempre serve como mecanismo base para essas ferramentas. Então é importante entender como ele funciona!&lt;/li&gt;
&lt;li&gt;Até este ponto, o Learn Git Branching focou em ensinar o básico a respeito de trabalho em repositórios locais (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como repositórios remotos funcionam, precisamos de um comando para configurar o ambiente para essas lições. Esse comando será o &lt;code&gt;git clone&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  2: Branches remotos
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Agora que vimos o &lt;code&gt;git clone&lt;/code&gt; em ação, vamos estudar aquilo que realmente mudou.&lt;/li&gt;
&lt;li&gt;A primeira coisa que você pode ter percebido é que um novo branch chamado &lt;code&gt;o/main&lt;/code&gt; aparece no nosso repositório local. Esse tipo de branch é chamado de branch remoto; branches remotos possuem propriedades especiais pois eles servem a um propósito único.&lt;/li&gt;
&lt;li&gt;branches remotos refletem o estado de repositórios remotos (desde a última vez na qual você falou com eles). Eles ajudam a entender as diferenças entre o trabalho local e o trabalho atualmente público -- um passo crítico a ser dado antes de compartilhar seu trabalho com os outros.&lt;/li&gt;
&lt;li&gt;branches remotos possuem a propriedade especial de, ao sofrerem um checkout, colocarem o repositório em modo "Detached HEAD". O Git faz isso de propósito, porque você não pode trabalhar nesses branches diretamente; você é obrigado a trabalhar em outro lugar e só então compartilhar seu trabalho com o remoto (depois disso, os branches remotos serão atualizados).&lt;/li&gt;
&lt;li&gt;O que é &lt;code&gt;o/&lt;/code&gt;? Você pode estar se perguntando o que o &lt;code&gt;o/&lt;/code&gt; no início do nome dos ramos remotos significa. Bem, ramos remotos possuem uma convenção obrigatória de nomes -- eles são mostrados no seguinte formato:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;nome do repositório remoto&amp;gt;/&amp;lt;nome do ramo&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Então, se o ramo remoto é chamado &lt;code&gt;o/main&lt;/code&gt;, o nome do ramo é &lt;code&gt;main&lt;/code&gt; e o nome do repositório remoto é &lt;code&gt;o&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A maioria dos desenvolvedores na verdade chama o repositório remoto principal de &lt;code&gt;origin&lt;/code&gt;, e não de &lt;code&gt;o&lt;/code&gt;. Isso é tão comum que o Git define por padrão o nome &lt;code&gt;origin&lt;/code&gt; para o repositório remoto quando você usa o comando &lt;code&gt;git clone&lt;/code&gt; para clonar um repositório.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  3: Git fetch
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Trabalhar com remotos no Git, no final das contas, se resume a transferir dados de e para outros repositórios. Desde que possamos enviar commits para um lado e para o outro, poderemos compartilhar qualquer tipo de atualização que seja gerenciada pelo Git (e portanto compartilhar trabalho, novos arquivos, novas ideias, cartas de amor, etc).&lt;/li&gt;
&lt;li&gt;Nesta lição vamos aprender como baixar dados de um repositório remoto -- o comando para isso é convenientemente chamado de &lt;code&gt;git fetch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Você perceberá que conforme atualizarmos a representação do repositório remoto, nossos ramos remotos atualizar-se-ão para refletir essa nova representação. Isso tem a ver com o que vimos na lição anterior sobre ramos remotos.&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;git fetch&lt;/code&gt; realiza dois passos principais, e somente estes dois passos principais. Ele:&lt;/li&gt;
&lt;li&gt;Baixa os commits que o repositório remoto possui mas que estão faltando no repositório local, e...
Atualiza a referência para a qual os ramos remotos (por exemplo, &lt;code&gt;o/main&lt;/code&gt;) estão apontando
O &lt;code&gt;git fetch&lt;/code&gt; essencialmente faz com que nossa representação local do repositório remoto fique sincronizada com a forma com que o repositório remoto de fato se parece (naquele momento).&lt;/li&gt;
&lt;li&gt;Se você lembrar da lição anterior, nós dissemos que os ramos remotos refletem o estado dos repositórios remotos desde a última vez na qual você falou com esses repositórios. O &lt;code&gt;git fetch&lt;/code&gt; é a única forma de falar com esses repositórios remotos! Espero que a conexão entre os ramos remotos e o &lt;code&gt;git fetch&lt;/code&gt; esteja clara agora.&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;git fetch&lt;/code&gt; geralmente conversa com o repositório remoto por meio da Internet (usando um protocolo como &lt;code&gt;http://&lt;/code&gt; ou &lt;code&gt;git://&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;git fetch&lt;/code&gt;, no entanto, não muda nada do estado local do repositório. Ele não atualiza o seu ramo &lt;code&gt;main&lt;/code&gt; nem muda nada na forma como o seu sistema de arquivos está no momento.&lt;/li&gt;
&lt;li&gt;É importante entender isso, pois muitos desenvolvedores pensam que executar &lt;code&gt;git fetch&lt;/code&gt; fará com que o trabalho local reflita o estado do repositório remoto. Ele pode até baixar todos os dados necessários para fazê-lo, mas ele não muda de fato nenhum dos arquivos locais. Vamos aprender comandos para fazê-lo nas lições a seguir :D&lt;/li&gt;
&lt;li&gt;No final das contas, você pode pensar no &lt;code&gt;git fetch&lt;/code&gt; como um passo de download.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4: Git pull
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Agora que vimos como baixar dados de um repositório remoto com &lt;code&gt;git fetch&lt;/code&gt;, vamos atualizar nosso trabalho para refletir essas mudanças!&lt;/li&gt;
&lt;li&gt;Há, na verdade, muitas formas de fazê-lo -- uma vez que você tenha os novos commits disponíveis localmente, você pode incorporá-los como se eles fossem commits normais em outros ramos. Isso significa que você pode executar comandos como estes a seguir:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git cherry-pick o/main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git rebase o/main&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git merge o/main&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;O fluxo de trabalho de executar fetch para baixar as mudanças remotas e depois fazer um merge delas é tão comum que o Git na verdade fornece um comando que faz ambas as coisas de uma vez só! Esse comando é o &lt;code&gt;git pull&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  5: Simulando trabalho em equipe
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Neste ponto, temos uma pequena dificuldade -- para algumas das lições a seguir, precisaremos ensinar como fazer pull de mudanças que foram introduzidas no repositório remoto.&lt;/li&gt;
&lt;li&gt;Isso significa que precisaremos essencialmente "fingir" que o repositório remoto foi atualizado por algum de seus colegas / amigos / colaboradores, algumas vezes em um ramo específico ou com um certo número de commits.&lt;/li&gt;
&lt;li&gt;Para esta finalidade, criamos o comando fictício &lt;code&gt;git fakeTeamwork&lt;/code&gt;! Ele é bastante auto-explicativo, vejamos uma demonstração...&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  6: Git push
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Ok, então vimos como baixar mudanças do repositório remoto e incorporá-las à árvore local. Isso é ótimo e tal... mas como eu faço para compartilhar o meu trabalho sensacional com as outras pessoas?&lt;/li&gt;
&lt;li&gt;Bem, a forma de subir trabalho a ser compartilhado é a oposta daquela de baixar trabalho que foi compartilhado. E qual o oposto de &lt;code&gt;git pull&lt;/code&gt; (puxar)? É &lt;code&gt;git push&lt;/code&gt; (empurrar)!&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;git push&lt;/code&gt; é responsável por subir as suas mudanças para um repositório remoto especificado, e atualizar esse remoto para incorporar seus novos commits. Uma vez que o &lt;code&gt;git push&lt;/code&gt; se completa, todos os seus amigos podem baixar o seu trabalho do repositório remoto.&lt;/li&gt;
&lt;li&gt;Você pode pensar no &lt;code&gt;git push&lt;/code&gt; como um comando para "publicar" o seu trabalho. Ele tem uma série de nuances que vamos abordar em breve, mas comecemos com passos curtos...&lt;/li&gt;
&lt;li&gt;Nota -- o comportamento de &lt;code&gt;git push&lt;/code&gt; sem argumentos varia dependendo da configuração &lt;code&gt;push.default&lt;/code&gt; do Git. O valor padrão para essa configuração depende da versão do Git que você estiver usando, mas vamos assumir o valor &lt;code&gt;upstream&lt;/code&gt; nestas lições. Isso não é um grande problema, mas vale a pena verificar suas configurações antes de fazer push nos seus próprios projetos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  7: Histórico Divergente
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Imagine que você clonou um repositório na segunda-feira e começou a trabalhar em uma funcionalidade nova. Na sexta-feira você está pronto para publicar a funcionalidade -- mas, ah não! Seus colegas escreveram um bocado de código durante a semana, tornando a sua funcionalidade obsoleta. Eles também publicaram esses commits no repositório remoto que vocês compartilham, então agora o seu trabalho é baseado em uma versão antiga do projeto, que não é mais relevante.&lt;/li&gt;
&lt;li&gt;Neste caso, o comando &lt;code&gt;git push&lt;/code&gt; é ambíguo. Se você executar &lt;code&gt;git push&lt;/code&gt;, será que o Git deveria tratar o repositório remoto como se ele ainda estivesse no estado da segunda-feira? Será que ele deveria tentar adicionar seu código dentro do repositório sem tentar remover o código novo? Ou será que ele deveria simplesmente ignorar suas mudanças totalmente, já que elas estão obsoletas?&lt;/li&gt;
&lt;li&gt;Devido à grande ambiguidade que surge neste tipo de situação (quando a história divergiu), o Git não permite que você faça &lt;code&gt;push&lt;/code&gt; das suas mudanças. Ele, de fato, força você a incorporar o último estado do repositório remoto antes de conseguir compartilhar o seu trabalho.&lt;/li&gt;
&lt;li&gt;Como resolver essa situação? É fácil, tudo que você precisa fazer é basear seu trabalho na versão mais recente do ramo remoto.&lt;/li&gt;
&lt;li&gt;Existem algumas maneiras de fazer isso, mas a mais direta é mover o seu trabalho usando &lt;code&gt;rebase&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Vamos fazer a mesma tarefa usando &lt;code&gt;merge&lt;/code&gt; em vez de &lt;code&gt;rebase&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Embora o &lt;code&gt;git merge&lt;/code&gt; não mova o seu trabalho (em vez disso, ele cria um commit de merge), ele é uma forma de contar ao Git que você incorporou todas as mudanças do repositório remoto. Isso acontece porque o ramo remoto passa a ser um ancestral do seu próprio ramo, significando que o seu commit reflete todos os commits contidos no ramo remoto.&lt;/li&gt;
&lt;li&gt;Você já conhece o &lt;code&gt;git pull&lt;/code&gt; e ele é simplesmente um atalho para um fetch e um merge. Convenientemente, entretanto, o comando &lt;code&gt;git pull --rebase&lt;/code&gt; é uma abreviação para um &lt;code&gt;fetch&lt;/code&gt; e um &lt;code&gt;rebase&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  8: Main bloqueado
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Se você trabalha em uma grande equipe colaborativa é provável que o main seja bloqueado e precise de alguns processos de Pull Request para unir mudanças. Se você commitar diretamente para o main localmente e tentar fazer um push você visualizará uma mensagem similar a essa:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;! [remote rejected] main -&amp;gt; main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;O repositório remoto rejeitou o push dos commits diretamente para o main por causa da política do main necessitando do uso dos pull requests.&lt;/li&gt;
&lt;li&gt;Você pretendia seguir o processo de criação de uma ramificação, fazendo um push dessa ramificação e fazendo um pull request, mas você esqueceu e commitou diretamente para o main. Agora você está preso e não consegue publicar suas mudanças.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Temas Avançados</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Fri, 09 Jun 2023 12:07:58 +0000</pubDate>
      <link>https://dev.to/epochchrono/aprendendo-git-branching-temas-avancados-2dh5</link>
      <guid>https://dev.to/epochchrono/aprendendo-git-branching-temas-avancados-2dh5</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Temas avançados
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Fazendo mais de 9000 rebases
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): dificil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Essa lição é mais um cenário proposto que diz:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Cara, temos um monte de branches aqui! Vamos fazer um rebase de todo o trabalho contido nesses branches para o main.&lt;/p&gt;

&lt;p&gt;No entanto, a cúpula da administração está tornando as coisas mais difíceis -- eles querem que os commits estejam todos em ordem sequencial. Isso significa que a nossa árvore final precisa ter o C7' por último, C6' acima disso, e assim por diante, tudo ordenado.&lt;/p&gt;

&lt;p&gt;Se você fizer besteira, sinta-se livre para usar o comando reset para recomeçar do zero. Depois lembre de olhar nossa solução do gabarito para ver se consegue resolver a tarefa usando menos comandos! &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Comandos:

&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1&lt;/span&gt;
git rebase main bugFix

&lt;span class="c"&gt;# 2&lt;/span&gt;
git rebase bugFix side

&lt;span class="c"&gt;# 3&lt;/span&gt;
git rebase side another

&lt;span class="c"&gt;# 4&lt;/span&gt;
git rebase another main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h5&gt;
  
  
  2: Especificando pais
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Essa lição é mais um cenário proposto que diz:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Assim como o modificador &lt;code&gt;~&lt;/code&gt;, o modificador &lt;code&gt;^&lt;/code&gt; também aceita um número opcional depois dele.&lt;/p&gt;

&lt;p&gt;Em vez de especificar o número de gerações a voltar (que é o que o &lt;code&gt;~&lt;/code&gt; faz), o modificador no &lt;code&gt;^&lt;/code&gt; especifica qual referência de pai a ser seguida a partir de um commit de merge. Lembre-se que commits de merge possuem múltiplos pais, então o caminho a seguir é ambíguo.&lt;/p&gt;

&lt;p&gt;O Git normalmente subirá o "primeiro" pai de um commit de merge, mas especificar um número após o &lt;code&gt;^&lt;/code&gt; muda esse comportamento padrão.&lt;/p&gt;

&lt;p&gt;Basta de conversa, vejamos o operador em ação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Comandos:

&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1&lt;/span&gt;
git branch bugWork mmain~^2~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h5&gt;
  
  
  3: Espaguete de branches
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Essa lição é mais um cenário proposto que diz:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Uhuuuuu Nelly! Temos um belo de um objetivo para alcançar neste nível.&lt;/p&gt;

&lt;p&gt;Temos aqui um &lt;code&gt;main&lt;/code&gt; que está alguns commits atrás dos branches &lt;code&gt;one&lt;/code&gt;, &lt;code&gt;two&lt;/code&gt; e &lt;code&gt;three&lt;/code&gt;. Seja lá por qual razão, precisamos atualizar esses três outros branches com versões modificadas dos últimos commits do &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O branch &lt;code&gt;one&lt;/code&gt; precisa de uma reordenação e da exclusão do C5. O &lt;code&gt;two&lt;/code&gt; precisa apenas de reordenação. O &lt;code&gt;three&lt;/code&gt; precisa de um único commit!&lt;/p&gt;

&lt;p&gt;Vamos deixar você descobrir como resolver esta tarefa -- mas não deixe de ver a nossa solução depois com o comando &lt;code&gt;show solution&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comandos:

&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1&lt;/span&gt;
git checkout one

&lt;span class="c"&gt;# 2&lt;/span&gt;
git cherry-pick C4 C3 C2

&lt;span class="c"&gt;# 3&lt;/span&gt;
git checkout two

&lt;span class="c"&gt;# 4&lt;/span&gt;
git cherry-pick C5 C4 C3 C2

&lt;span class="c"&gt;# 5&lt;/span&gt;
git branch &lt;span class="nt"&gt;-f&lt;/span&gt; three C2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Módulo Sortidos</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Thu, 08 Jun 2023 20:35:30 +0000</pubDate>
      <link>https://dev.to/epochchrono/04-aprendendo-git-branching-modulo-sortidos-58bl</link>
      <guid>https://dev.to/epochchrono/04-aprendendo-git-branching-modulo-sortidos-58bl</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Sortidos
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Pegando um único commit
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Aqui está uma situação de acontece frequentemente com desenvolvedores: Estou tentando encontrar um bug, mas ele é escorregadio. Para auxiliar meu trabalho de detetive, eu coloco alguns comandos de debug e prints.&lt;/li&gt;
&lt;li&gt;Todos esses comandos de debug e mensagens estão em seus próprios branches. Finalmente eu encontro o bug, corrijo!&lt;/li&gt;
&lt;li&gt;O único problema é que agora eu preciso devolver o meu &lt;code&gt;bugFix&lt;/code&gt; ao branch &lt;code&gt;main&lt;/code&gt;. Se eu simplesmente der um fast-forward no &lt;code&gt;main&lt;/code&gt;, então o &lt;code&gt;main&lt;/code&gt; terminará contendo todos os comandos de debug, o que é indesejável. &lt;/li&gt;
&lt;li&gt;Precisamos dizer ao git para copiar somente um dos commits. Esta situação é exatamente a mesma dos níveis anteriores a respeito de como mover trabalho -- podemos usar os mesmos comandos:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git rebase -i&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git cherry-pick&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  2: Malabarismo com commits
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): impossível, I have no idea what I'm doing
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Aqui está outra situação que acontece com bastante frequência. Você fez algumas mudanças (&lt;code&gt;newImage&lt;/code&gt;), além de um outro conjunto de mudanças (&lt;code&gt;caption&lt;/code&gt;) que são relacionadas, de forma que elas estão empilhadas uma após a outra no seu repositório.&lt;/li&gt;
&lt;li&gt;O complicado é que algumas vezes você precisa fazer uma pequena modificação em um commit mais antigo. Neste caso, o pessoal do design quer que modifiquemos um pouco as dimensões da imagem introduzida em &lt;code&gt;newImage&lt;/code&gt;, apesar de esse commit estar mais para trás no nosso histórico!!&lt;/li&gt;
&lt;li&gt;Superaremos essa dificuldade fazendo o seguinte:

&lt;ul&gt;
&lt;li&gt;Reordenaremos os commits de forma que aquele que desejamos esteja no topo, com &lt;code&gt;git rebase -i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Usaremos o comando &lt;code&gt;git commit --amend&lt;/code&gt; para fazer uma pequena modificação&lt;/li&gt;
&lt;li&gt;Vamos, então, reordenar os commits na mesma ordem que estavam anteriormente com &lt;code&gt;git rebase -i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Finalmente, moveremos o &lt;code&gt;main&lt;/code&gt; para essa parte atualizada da árvore para finalizar o nível (usando o método de sua escolha)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Há muitas formas de alcançar o objetivo final (eu vejo o cherry-pick passando pela sua mente), e veremos mais delas depois, mas por enquanto foquemos nesta técnica.&lt;/li&gt;
&lt;li&gt;Por último, preste atenção no estado do "objetivo" aqui -- como nós movemos os commits duas vezes, ambos ficam com um apóstrofo. Um apóstrofo adicional é colocado no commit que sofreu o "amend", o que nos dá a forma final da árvore&lt;/li&gt;
&lt;li&gt;Tendo dito isto, posso avaliar a resposta baseado na estrutura e nas diferenças relativas de número de apóstrofos. Desde que o branch &lt;code&gt;main&lt;/code&gt; da sua árvore tenha a mesma estrutura, e o número de apóstrofos seja igual a menos de uma constante, darei a você todos os pontos para esta tarefa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Solução: &lt;a href="https://www.youtube.com/live/HU2ItgyhGNU?feature=share&amp;amp;t=3911"&gt;YouTube&lt;/a&gt;
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Comandos:

&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; caption~2

&lt;span class="c"&gt;# 2&lt;/span&gt;
&lt;span class="c"&gt;# order: C3 -&amp;gt; C2&lt;/span&gt;

&lt;span class="c"&gt;# 3&lt;/span&gt;
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt;

&lt;span class="c"&gt;# 4&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; caption~2

&lt;span class="c"&gt;# 5&lt;/span&gt;
&lt;span class="c"&gt;# order: C2''' -&amp;gt; C3''&lt;/span&gt;

&lt;span class="c"&gt;# 6&lt;/span&gt;
git branch &lt;span class="nt"&gt;-f&lt;/span&gt; main caption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h5&gt;
  
  
  3: Malabarismo com commits #2
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): por incrível que pareça, esse foi fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Como você viu no nível anterior, usamos &lt;code&gt;rebase -i&lt;/code&gt; para reordenar os commits. Uma vez que o commit que queríamos mudar estava no topo, pudemos facilmente usar o &lt;code&gt;--amend&lt;/code&gt; e depois reordená-lo de volta para obter nossa ordem preferida.&lt;/li&gt;
&lt;li&gt;O único problema aqui é que há muita reordenação ocorrendo, o que pode introduzir conflitos de rebase. Vamos dar uma olhada em outro método, usando o &lt;code&gt;git cherry-pick&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lembre-se que o &lt;code&gt;git cherry-pick&lt;/code&gt; copiará um commit de qualquer lugar na árvore sob o HEAD (desde que esse commit não seja um ancestral do HEAD).&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4: Tags no Git
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Como você aprendeu nas lições anteriores, branches são fáceis de mover e geralmente vão se referindo a diferentes commits conforme você vai trabalhando no código. branches são facilmente mutáveis, frequentemente temporários, e estão sempre mudando.&lt;/li&gt;
&lt;li&gt;Se este é o caso, você pode estar se perguntando se não existe uma forma de marcar permanentemente pontos históricos do projeto. Para coisas como grandes releases ou grandes merges, existe alguma forma de marcar commits com algo mais permanente que um branch?&lt;/li&gt;
&lt;li&gt;As tags do Git foram criadas exatamente para esse caso de uso -- elas marcam de forma (relativamente) permanente certos commits como se fossem "milestones" em uma estrada, e você pode referenciá-las exatamente como faz com branches.&lt;/li&gt;
&lt;li&gt;O mais importante, no entanto, é que elas nunca se movem sozinhas quando novos commits são criados. Você pode fazer "checkout" em uma tag e então completar trabalho nessa tag -- tags existem como âncoras na árvore de commits que estão atreladas a certos pontos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  5: Git Describe
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Devido ao fato de as tags servirem como "âncoras" tão boas no código, o Git tem um comando para descrever onde você está com relação à "âncora" (tag) mais próxima. Esse comando é chamado &lt;code&gt;git describe&lt;/code&gt;!&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;git describe&lt;/code&gt; pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias.&lt;/li&gt;
&lt;li&gt;O git describe é chamado da seguinte forma:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git describe &amp;lt;ref&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Onde &lt;code&gt;&amp;lt;ref&amp;gt;&lt;/code&gt; é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (&lt;code&gt;HEAD&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A saída do comando é mais ou menos assim:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;tag&amp;gt;_&amp;lt;numCommits&amp;gt;_g&amp;lt;hash&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Onde &lt;code&gt;tag&lt;/code&gt; é a tag ancestral mais próxima no histórico, &lt;code&gt;numCommits&lt;/code&gt; é o número de commits de distância da &lt;code&gt;tag&lt;/code&gt;, e &lt;code&gt;&amp;lt;hash&amp;gt;&lt;/code&gt; é o hash do commit sendo descrito.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Módulo Movendo trabalho por aí</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Thu, 08 Jun 2023 20:33:16 +0000</pubDate>
      <link>https://dev.to/epochchrono/02-aprendendo-git-branching-modulo-movendo-trabalho-por-ai-37nl</link>
      <guid>https://dev.to/epochchrono/02-aprendendo-git-branching-modulo-movendo-trabalho-por-ai-37nl</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Movendo trabalho por aí
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Introdução ao &lt;code&gt;cherry-pick&lt;/code&gt;
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;O próximo conceito que vamos abordar é "movendo trabalho por aí" -- em outras palavras, veremos as formas como o desenvolvedor pode dizer "eu quero este trabalho aqui, e aquele ali" de formas precisas, eloquentes e flexíveis.&lt;/li&gt;
&lt;li&gt;O primeiro comando desta série é o git &lt;code&gt;cherry-pick&lt;/code&gt;. Ele é chamado da seguinte forma:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git cherry-pick &amp;lt;Commit1&amp;gt; &amp;lt;Commit2&amp;gt; &amp;lt;...&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Trata-se de uma forma bastante direta de dizer que você gostaria de copiar uma série de commits abaixo do seu local atual (HEAD).&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  2: Introdução ao rebase interativo
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!):
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;O cherry-pick é ótimo quando você sabe de antemão quais commits você quer (e você sabe os hashes correspondentes) -- é difícil bater a simplicidade que ele oferece.&lt;/li&gt;
&lt;li&gt;Mas e quando você não sabe quais commits você quer? Felizmente o git pode te ajudar nesta situação também! Podemos usar o rebase interativo para isso -- trata-se da melhor forma de rever uma série de commits sobre os quais você está prestes a fazer um rebase.&lt;/li&gt;
&lt;li&gt;O rebase interativo é simplesmente o comando rebase com a opção &lt;code&gt;-i&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Se você incluir essa opção, o git abrirá uma interface para mostrar quais commits estão prestes a serem copiados abaixo do alvo do rebase. Ele também mostra os hashes e as mensagens dos commits, o que é ótimo para ter noção do que é o que.&lt;/li&gt;
&lt;li&gt;No git "de verdade", a interface nada mais é que um arquivo aberto em um editor de texto (por exemplo o vim).&lt;/li&gt;
&lt;li&gt;Quando a janela de rebase interativo abrir, você pode fazer 3 coisas diferentes:

&lt;ul&gt;
&lt;li&gt;Você pode reordenar os commits simplesmente mudando sua ordem na interface (na nossa janela isso significa arrastar e soltar com o mouse).&lt;/li&gt;
&lt;li&gt;Você pode escolher simplesmente omitir alguns commits. Para isso, clique no botão pick -- deixar o pick desligado significa que você quer descartar o commit.&lt;/li&gt;
&lt;li&gt;Por fim, você pode "esmagar" (fazer squash) nos commits.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Módulo Acelerando</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Thu, 08 Jun 2023 15:33:08 +0000</pubDate>
      <link>https://dev.to/epochchrono/aprendendo-git-branching-modulo-acelerando-51m2</link>
      <guid>https://dev.to/epochchrono/aprendendo-git-branching-modulo-acelerando-51m2</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Acelerando
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Solte a sua cabeça
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.&lt;/li&gt;
&lt;li&gt;O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). &lt;/li&gt;
&lt;li&gt;Normalmente o HEAD aponta para o nome de um branch (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD.&lt;/li&gt;
&lt;li&gt;Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um branch. Antes do estado solto ("detached"), é assim como se parece:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;HEAD -&amp;gt; main -&amp;gt; C1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Depois do comando &lt;code&gt;git checkout C1&lt;/code&gt;, fica:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;HEAD -&amp;gt; C1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  2: Referências relativas (&lt;code&gt;^&lt;/code&gt;)
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Mover-se pela árvore do Git especificando o hash do commit pode se tornar um pouco entediante. No mundo real, você não terá à sua disposição essa bonita visualização da árvore ao lado do seu terminal, então você terá de usar o comando &lt;code&gt;git log&lt;/code&gt; para ver os hashes.&lt;/li&gt;
&lt;li&gt;Além disso, os hashes são geralmente muito maiores no mundo real. Por exemplo, o hash do commit que introduziu o nível de exercícios anterior é &lt;code&gt;fed2da64c0efc5293610bdd892f82a58e8cbc5d8&lt;/code&gt;. Não é algo exatamente fácil de lembrar.&lt;/li&gt;
&lt;li&gt;O que salva é que o Git é inteligente com os hashes. Ele só exige que você especifique a quantidade de caracteres do hash suficiente para identificar unicamente o commit.&lt;/li&gt;
&lt;li&gt;Com referências relativas, você pode começar a partir de um ponto fácil de lembrar (como o branch &lt;code&gt;bugFix&lt;/code&gt; ou o &lt;code&gt;HEAD&lt;/code&gt;) e referenciar a partir dali.&lt;/li&gt;
&lt;li&gt;Commits relativos são poderosos, mas vamos introduzir apenas dois tipos simples aqui:

&lt;ul&gt;
&lt;li&gt;Mover para cima um commit por vez com &lt;code&gt;^&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Mover para cima um número de vezes com &lt;code&gt;~&amp;lt;num&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Vamos dar uma olhada no operador circunflexo (&lt;code&gt;^&lt;/code&gt;) primeiro. Cada vez que você adicioná-lo a um nome de referência, você está dizendo ao Git para encontrar o pai do commit especificado.&lt;/li&gt;
&lt;li&gt;Então, dizer &lt;code&gt;main^&lt;/code&gt; é equivalente a "o primeiro pai do main".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main^^&lt;/code&gt; é o avô (ancestral de segunda geração) do main&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  3: Referências relativas #2 (&lt;code&gt;~&lt;/code&gt;)
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): difícil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Digamos que você queira se mover vários níveis para cima na árvore de commits. Pode ser entediante digitar &lt;code&gt;^&lt;/code&gt; várias vezes, e por isso o Git possui também o operador til (&lt;code&gt;~&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Um número pode ser passado (opcionalmente) após o operador til, especificando o número de ancestrais que você deseja subir. &lt;/li&gt;
&lt;li&gt;Uma das situações mais comuns na qual eu uso referências relativas é quando quero trocar branches de lugar. Você pode redefinir diretamente o commit para o qual um branch aponta com a opção &lt;code&gt;-f&lt;/code&gt;. Desta forma, o seguinte comando:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git branch -f main HEAD~3&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Move (à força) o branch main 3 ancestrais acima do HEAD.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4: Referências relativas #3 (&lt;code&gt;~&lt;/code&gt;)
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): médio
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Existem várias maneiras de reverter mudanças no Git. E assim como o ato de commitar, reverter mudanças no Git também tem um componente de baixo nível (a preparação, ou staging, de arquivos ou trechos de arquivos individuais) e um componente de alto nível (como as mudanças são, de fato, revertidas). &lt;/li&gt;
&lt;li&gt;Há duas maneiras principais de desfazer mudanças no Git -- uma delas é usando &lt;code&gt;git reset&lt;/code&gt;, e a outra é usando &lt;code&gt;git revert&lt;/code&gt;. Vamos olhar cada uma delas na próxima janela&lt;/li&gt;
&lt;li&gt;O comando &lt;code&gt;git reset&lt;/code&gt; reverte mudanças movendo para trás no tempo (para um commit mais antigo) a referência do branch. Desta forma, você pode pensar nessa operação como uma "reescrita do histórico"; o &lt;code&gt;git reset&lt;/code&gt; vai mover o branch para trás como se o commit nunca tivesse existido.&lt;/li&gt;
&lt;li&gt;Embora o  reset  funcione muito bem em branches locais no seu próprio computador, o método utilizado de "reescrever o histórico" não funciona com branches remotos que outras pessoas estejam usando.&lt;/li&gt;
&lt;li&gt;Para reverter mudanças e conseguir compartilhar essas mudanças com os outros, precisamos usar o &lt;code&gt;git revert&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Quando usamos o &lt;code&gt;revert&lt;/code&gt; um novo commit é criado A FRENTE na árvore. Isso é porque o novo commit C2' introduz mudanças -- acontece que as mudanças que ele introduz revertem exatamente aquelas do commit C2.&lt;/li&gt;
&lt;li&gt;Com o &lt;code&gt;revert&lt;/code&gt;, você pode fazer push das suas mudanças para compartilhá-las com os outros.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Módulo Sequência introdutória</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Thu, 08 Jun 2023 15:16:02 +0000</pubDate>
      <link>https://dev.to/epochchrono/aprendendo-git-branching-modulo-sequencia-introdutoria-2b5c</link>
      <guid>https://dev.to/epochchrono/aprendendo-git-branching-modulo-sequencia-introdutoria-2b5c</guid>
      <description>&lt;p&gt;&lt;strong&gt;WIP&lt;/strong&gt;: A descrição e explicação dos comandos está sendo postada &lt;a href="https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2"&gt;aqui&lt;/a&gt; conforme o avanço.&lt;/p&gt;

&lt;p&gt;Aprendi git no dia a dia, e fazendo alguns cursos. Mas nunca estudei mais a fundo.&lt;br&gt;
Decidi entender melhor como funciona toda essa parada de &lt;code&gt;branch&lt;/code&gt; entre tantas outras palavrinhas que vemos durante o uso.&lt;br&gt;
Pra isso, comecei com os exercícios no literalmente chamado &lt;a href="https://learngitbranching.js.org/?locale=pt_BR"&gt;Aprendendo Git Branching&lt;/a&gt;.&lt;br&gt;
O que eu aprendi até o momento?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use commits curtos;&lt;/li&gt;
&lt;li&gt;use pequenas branches;&lt;/li&gt;
&lt;li&gt;não esqueça o checkout;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sobre a ferramenta/site?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;é possível exportar a sua 'árvore' usando o comando &lt;code&gt;export tree&lt;/code&gt; e &lt;code&gt;import tree&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;é possível construir seu próprio  com o comando &lt;code&gt;build level&lt;/code&gt; e importar cenário com o comando &lt;code&gt;import level&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  levels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Módulo: Sequência introdutória
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Introdução aos commits no Git
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Um commit em um repositório git registra uma fotografia (snapshot) de todos os arquivos no seu diretório.&lt;/li&gt;
&lt;li&gt;O Git tem por objetivo manter os commits tão leves quanto possível.&lt;/li&gt;
&lt;li&gt;Ele pode (quando possível) comprimir um commit como um conjunto de mudanças (ou um "delta") entre uma versão do seu repositório e a seguinte.&lt;/li&gt;
&lt;li&gt;O Git também mantém um histórico de quando ocorreu cada commit. É por isso que a maioria dos commits tem ancestrais acima de si.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  2: Ramos (&lt;code&gt;branch&lt;/code&gt;) no Git
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Branch no Git também são incrivelmente leves. Eles são simplesmente referências a um commit específico -- e nada mais.&lt;/li&gt;
&lt;li&gt;Lembre-se do mantra:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;branch early, and branch often&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Devido a não existir sobrecarga de armazenamento / memória associada à criação de branchs, é mais fácil dividir logicamente o seu trabalho do que ter branches grandes e complexos.&lt;/li&gt;
&lt;li&gt;Quando começarmos a misturar branches e commits, vamos ver como esses dois recursos combinam bem. Por enquanto, só lembre que um branch diz essencialmente "Quero incluir o trabalho deste commit e de todos os seus ancestrais".&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  3: Branches e Merge
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;O primeiro método para combinar trabalho que vamos examinar é o &lt;code&gt;git merge&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;O merge do Git cria um commit especial que possui dois pais únicos. &lt;/li&gt;
&lt;li&gt;Um commit com dois pais essencialmente significa "Quero incluir todo o trabalho deste pai aqui com o daquele outro pai ali, e com o do conjunto de todos os seus ancestrais."&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  4: Rebase no Git
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): médio
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;A segunda forma de combinar trabalho entre branchs é o rebase. O rebase essencialmente pega um conjunto de commits, "copia" os mesmos, e os despeja em outro lugar.&lt;/li&gt;
&lt;li&gt;Isso pode parecer confuso, mas a vantagem do rebase é que ele pode ser usado para construir uma sequência mais bonita e linear de commits. &lt;/li&gt;
&lt;li&gt;O registro de commits (história do repositório) ficará muito mais limpa se for utilizado apenas rebase em vez de merge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Módulo: Acelerando
&lt;/h4&gt;

&lt;h5&gt;
  
  
  1: Solte a sua cabeça
&lt;/h5&gt;

&lt;h6&gt;
  
  
  Dificuldade (pra mim!): fácil
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.&lt;/li&gt;
&lt;li&gt;O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). &lt;/li&gt;
&lt;li&gt;Normalmente o HEAD aponta para o nome de um branch (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD.&lt;/li&gt;
&lt;li&gt;Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um branch. Antes do estado solto ("detached"), é assim como se parece:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;HEAD -&amp;gt; main -&amp;gt; C1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Depois do comando &lt;code&gt;git checkout C1&lt;/code&gt;, fica:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;HEAD -&amp;gt; C1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>Aprendendo Git Branching - Comandos</title>
      <dc:creator>Vitor Jr.</dc:creator>
      <pubDate>Thu, 08 Jun 2023 15:12:39 +0000</pubDate>
      <link>https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2</link>
      <guid>https://dev.to/epochchrono/aprendendo-git-branching-comandos-24d2</guid>
      <description>&lt;p&gt;Comandos utilizados e aprendidos na série &lt;strong&gt;Aprendendo Git Branching&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;commit&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cria um snapshot do trabalho atual&lt;/span&gt;
git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;branch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cria uma nova branch chamada newImage&lt;/span&gt;
git branch newImage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;checkout&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cria a nova branch bugFix e altera para a mesma&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; bugFix

&lt;span class="c"&gt;# C1: hash do commit&lt;/span&gt;
&lt;span class="c"&gt;# faz checkout e aponta o head para o commit C1&lt;/span&gt;
git checkout C1

&lt;span class="c"&gt;# sendo que a branch bugFix está em C4:&lt;/span&gt;
&lt;span class="c"&gt;# 1-fazer checkout para a branch bugFix&lt;/span&gt;
&lt;span class="c"&gt;# 2-fazer checkout para o commit C3&lt;/span&gt;
git checkout bugFix^

&lt;span class="c"&gt;# sendo que HEAD e a branch main está em C4:&lt;/span&gt;
&lt;span class="c"&gt;# 1-fazer checkout para a branch main&lt;/span&gt;
&lt;span class="c"&gt;# 2-fazer checkout para o commit C0&lt;/span&gt;
git checkout HEAD~4

&lt;span class="c"&gt;# sendo que HEAD e a branch main está em C7:&lt;/span&gt;
&lt;span class="c"&gt;# 1-fazer checkout para o segundo pai do commit C7&lt;/span&gt;
&lt;span class="c"&gt;# 2-fazer checkout para dois commits atrás do segundo pai&lt;/span&gt;
git checkout HEAD~^2~2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;cherry-pick&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# dados os commits C1, C2, C3, C4, C5, C6 e C7&lt;/span&gt;
&lt;span class="c"&gt;# escolher apenas os commits C7, C3 e C5 nessa ordem&lt;/span&gt;
&lt;span class="c"&gt;# para serem adicionados na branch main&lt;/span&gt;
git cherry-pick C7 C3 C5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;reset&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# move a referêcia para o commit anterior repo LOCAL&lt;/span&gt;
git reset HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;revert&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# move a referêcia para o commit anterior repo REMOTO&lt;/span&gt;
git revert HEAD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;rebase&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# tendo feito o checkout para branch bugFix&lt;/span&gt;
&lt;span class="c"&gt;# move o trabalho dessa branch para a main&lt;/span&gt;
git rebase main

&lt;span class="c"&gt;# tendo a branch main como HEAD&lt;/span&gt;
&lt;span class="c"&gt;# selecionar opções dentro dos útimos 3 commits&lt;/span&gt;
git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;merge&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;tag&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cria uma tag para o commit C1 com o nome v1.0&lt;/span&gt;
git tag v1.0 C1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;fetch&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;pull&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# faz o pull e rebase ao mesmo tempo&lt;/span&gt;
git pull &lt;span class="nt"&gt;--rebase&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;push&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
    </item>
  </channel>
</rss>
