{"id":4191,"date":"2018-07-23T15:00:15","date_gmt":"2018-07-23T18:00:15","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=4191"},"modified":"2021-10-18T19:09:10","modified_gmt":"2021-10-18T22:09:10","slug":"comandos-do-git-para-desenvolvedores","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/comandos-do-git-para-desenvolvedores\/","title":{"rendered":"GIT: 5 comandos necess\u00e1rios que todo desenvolvedor deveria conhecer"},"content":{"rendered":"<p>O <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> se popularizou fortemente nos \u00faltimos anos.<\/p>\n<p>Dificilmente iremos encontrar um desenvolvedor que n\u00e3o use ou tenha usado o Git alguma vez na vida.<\/p>\n<p>De fato, versionar c\u00f3digo transcendeu as boas pr\u00e1ticas, e passou a ser um aspecto fundamental para qualquer projeto de software.<\/p>\n<p>O Git \u00e9 um sistema complet\u00edssimo para controle de vers\u00e3o de forma distribu\u00edda.<\/p>\n<p>Isso porque ele permite in\u00fameras<strong> estrat\u00e9gias de versionamento<\/strong>, e atualmente est\u00e1 integrado a uma infinidade de ferramentas relacionadas a<strong> processos de desenvolvimento de software<\/strong>.<\/p>\n<p>Mas ser\u00e1 que usamos todo o potencial desse sistema? No dia a dia, estamos aproveitando os comandos e op\u00e7\u00f5es que o Git possui nativamente para facilitar nossa vida?<\/p>\n<p>Pois bem, nesse post vamos come\u00e7ar falando sobre cinco comandos que o Git oferece e que podem trazer algumas facilidades consider\u00e1veis para o cotidiano de algu\u00e9m que versiona c\u00f3digo, s\u00e3o eles:<\/p>\n<ol>\n<li><strong>Analisando diferen\u00e7as<\/strong>: git diff;<\/li>\n<li><strong>Avaliando altera\u00e7\u00f5es<\/strong>: git log;<\/li>\n<li><strong>Visualizando objetos<\/strong>: git show;<\/li>\n<li><strong>Guardando altera\u00e7\u00f5es temporariamente<\/strong>: git stash;<\/li>\n<li><strong>Copiando e colando commits<\/strong>: git cherry-pick.<\/li>\n<\/ol>\n<p>Vamos l\u00e1!<\/p>\n<hr \/>\n<h2>Analisando diferen\u00e7as: git diff<\/h2>\n<p>Embora pare\u00e7a \u00f3bvio, preciso lhe dizer isso: <strong>fique sempre atento ao que voc\u00ea est\u00e1 alterando. <\/strong><\/p>\n<p>Isso porque \u00e9 muito comum mudarmos um c\u00f3digo para realizar um teste ou uma prova de conceito e esquecermos de desfazer a altera\u00e7\u00e3o. Ent\u00e3o, use e abuse do comando:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff <\/code><\/pre>\n<p>O comando<em> git diff<\/em>, sem par\u00e2metros, <strong>permite visualizar as altera\u00e7\u00f5es ainda n\u00e3o selecionadas para o commit<\/strong>.<\/p>\n<p>Portanto, na linha de comando, o Git indica essas altera\u00e7\u00f5es como: <em>Changes not staged for commit<\/em>.<\/p>\n<p>Arquivos n\u00e3o versionados (<em>untracked files<\/em>) ou altera\u00e7\u00f5es selecionadas para o commit n\u00e3o s\u00e3o consideradas pelo <em>git diff<\/em>. Mas, por experi\u00eancia pr\u00f3pria, revisar as altera\u00e7\u00f5es antes de inclu\u00ed-las no commit pode ser muito \u00fatil. \ud83d\ude42<\/p>\n<p>Por outro lado, uma vez que voc\u00ea j\u00e1 tenha feito o commit, voc\u00ea ainda pode usufruir do comando para<strong> revisar as diferen\u00e7as<\/strong> que ainda n\u00e3o foram enviadas para o reposit\u00f3rio remoto, evitando transtornos. \ud83d\ude09<\/p>\n<p>Assim, o comando <em>git diff<\/em> possui par\u00e2metros que lhe permitem<strong> comparar vers\u00f5es<\/strong> incluindo refer\u00eancias por commit, branches, tags.<\/p>\n<h3>Vejamos alguns exemplos<\/h3>\n<p>Para revisar as diferen\u00e7as entre seu c\u00f3digo atual e uma branch local chamada <em>development<\/em>:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff development <\/code><\/pre>\n<p>Para revisar as diferen\u00e7as entre seu c\u00f3digo atual e uma branch remota chamada <em>development<\/em>:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff origin\/development <\/code><\/pre>\n<p>Para revisar as diferen\u00e7as entre dois commits:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff 22dbbf5a1113e76493834ed70fecfd23c9052cd1 4a129c8f8a5f52501a9bfc8c5f720b3a75b8c2eb <\/code><\/pre>\n<p><strong>Dica:<\/strong> voc\u00ea tamb\u00e9m pode usar parte do SHA1 (usado para identificar um commit de forma \u00fanica), desde que n\u00e3o seja uma refer\u00eancia amb\u00edgua:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff 22dbbf5 4a129c8 <\/code><\/pre>\n<p>Para revisar as diferen\u00e7as entre seu c\u00f3digo atual e um commit nomeado com uma tag chamada 1.0:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git diff 1.0 <\/code><\/pre>\n<hr \/>\n<h2>Avaliando altera\u00e7\u00f5es: git log<\/h2>\n<p>Os commits do seu reposit\u00f3rio Git contam a<strong> hist\u00f3ria do seu projeto<\/strong>. Por isso, \u00e9 recomendado que voc\u00ea cuide bem dele. \ud83d\ude09<\/p>\n<p>Com o comando<em> git log<\/em>, voc\u00ea pode <strong>visualizar o que vem sendo feito em uma determinada branch<\/strong> ou <strong>avaliar as altera\u00e7\u00f5es de um arquivo em especial. <\/strong><\/p>\n<p>Isso pode ser \u00fatil para voc\u00ea entender como alguma parte do c\u00f3digo vem sendo evolu\u00edda, ou pode ajudar a avaliar os commits locais antes de dar git push.<\/p>\n<p>Para ver o hist\u00f3rico de commits, com informa\u00e7\u00f5es tais como SHA1, autor, data e descri\u00e7\u00e3o, voc\u00ea pode usar o comando sem par\u00e2metros:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log <\/code><\/pre>\n<p>Mas pode ser \u00fatil para voc\u00ea tamb\u00e9m visualizar as altera\u00e7\u00f5es nos commits em geral, ou as mudan\u00e7as que ocorreram em um arquivo.<\/p>\n<p>Ent\u00e3o, vamos ver algumas possibilidades interessantes desse comando:<\/p>\n<p>Para visualizar o detalhamento de altera\u00e7\u00f5es inclu\u00eddas em cada commit:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log -p <\/code><\/pre>\n<p>Para visualizar as altera\u00e7\u00f5es de um determinado arquivo chamado file.txt, por commit:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log -p file.txt <\/code><\/pre>\n<p>Para visualizar uma lista simplificada dos commits (pode ser \u00fatil para automa\u00e7\u00f5es):<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log --oneline <\/code><\/pre>\n<p>Para visualizar os \u00faltimos 5 commits:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log -5 <\/code><\/pre>\n<p>Para visualizar apenas os commits de merge:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git log --merges <\/code><\/pre>\n<hr \/>\n<h2>Visualizando objetos: git show<\/h2>\n<p>Vamos dizer que voc\u00ea esteja passeando por a\u00ed e queira dar uma espiada no \u00faltimo commit neste momento ou no topo de uma branch.<\/p>\n<p>Ou talvez queira fazer um script para automatizar algum procedimento que precise de dados do \u00faltimo commit em quest\u00e3o. Pois bem, ent\u00e3o voc\u00ea pode se beneficiar com o comando <em>git show<\/em>.<\/p>\n<p>O comando git show sem par\u00e2metros mostra a voc\u00ea <strong>detalhes do commit atual<\/strong>:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git show <\/code><\/pre>\n<p>Por outro lado, se voc\u00ea gostaria de saber rapidamente sobre o commit da vers\u00e3o nomeada com a tag 1.4:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git show 1.4 <\/code><\/pre>\n<p>Para ver o \u00faltimo commit da branch master:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git show master <\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode escolher o formato no qual gostaria de visualizar os detalhes do commit usando a op\u00e7\u00e3o <em>&#8211;pretty<\/em>. Por exemplo:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git show --pretty=oneline <\/code><\/pre>\n<hr \/>\n<h2>Guardando altera\u00e7\u00f5es temporariamente: git stash<\/h2>\n<p>Certamente voc\u00ea j\u00e1 se deparou com a situa\u00e7\u00e3o em que precisava urgentemente trocar de branch ou coisa do tipo, para realizar outra altera\u00e7\u00e3o, mas j\u00e1 havia \u201csujado\u201d seu diret\u00f3rio de trabalho.<\/p>\n<p>Ent\u00e3o ser\u00e1 \u00fatil para voc\u00ea saber que o Git oferece um recurso bem interessante chamado <em>stash<\/em>.<\/p>\n<p>O comando <em>git stash<\/em> permite a voc\u00ea \u201cesconder\u201d suas altera\u00e7\u00f5es. Cada vez que voc\u00ea executa o comando <em>git stash<\/em>, o Git gera um <em>stash<\/em> para guardar suas altera\u00e7\u00f5es.<\/p>\n<p>Obviamente, o comando s\u00f3 funciona quando seu diret\u00f3rio de trabalho atual est\u00e1 \u201csujo\u201d (com altera\u00e7\u00f5es n\u00e3o versionadas ainda).<\/p>\n<p>Supondo que voc\u00ea esteja querendo<strong> colocar de canto algumas altera\u00e7\u00f5es<\/strong>, pode usar o comando sem par\u00e2metros:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash <\/code><\/pre>\n<p>Para saber quantos e quais<em> stashes<\/em> voc\u00ea tem, pode usar o comando de listagem:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash list <\/code><\/pre>\n<p>E se voc\u00ea esqueceu o que tem em um <em>stash<\/em>, use:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash show stash@{1} <\/code><\/pre>\n<p>Ou para visualizar os detalhes da altera\u00e7\u00e3o do <em>stash<\/em>:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash show -p stash@{1} <\/code><\/pre>\n<p>Agora, vamos supor que voc\u00ea deseje aplicar novamente as altera\u00e7\u00f5es do \u00faltimo <em>stash<\/em> que voc\u00ea criou, sem apag\u00e1-lo. Para tanto, use:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash apply <\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode indicar o <em>stash<\/em> que deseja recuperar (use a nomenclatura mostrada pelo<em> git stash list<\/em>):<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash apply stash@{3} <\/code><\/pre>\n<p>Por outro lado, se voc\u00ea quer aplicar o <em>stash<\/em> e apag\u00e1-lo logo depois, use:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash pop <\/code><\/pre>\n<p>E se definitivamente voc\u00ea quer apagar um <em>stash<\/em> em especial, pode usar o comando:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git stash drop stash@{2} <\/code><\/pre>\n<hr \/>\n<h2>Copiando e colando commits: git cherry-pick<\/h2>\n<p>O<strong> hist\u00f3rico de altera\u00e7\u00f5es<\/strong> \u00e9 muito importante para o projeto, pois nos conta <strong>como ele est\u00e1 evoluindo<\/strong>.<\/p>\n<p>Por isso,<strong> todo o cuidado \u00e9 pouco<\/strong> na hora de escolher uma mensagem de commit, de fazer um merge ou de aplicar altera\u00e7\u00f5es em uma determinada branch.<\/p>\n<p>Ent\u00e3o, tendo isso em mente, o Git oferece um recurso que muitos desconhecem chamado <em>cherry-pick<\/em>.<\/p>\n<p>O comando <em>git cherry-pick<\/em> permite que voc\u00ea<strong> aplique altera\u00e7\u00f5es introduzidas por commits que voc\u00ea tenha feito anteriormente<\/strong>.<\/p>\n<div class=\"alert alert-warning\"><strong>Aten\u00e7\u00e3o:<\/strong> Apesar de m\u00e1gico, use esse comando com modera\u00e7\u00e3o para n\u00e3o gerar conflitos ou reescrita inadequada do hist\u00f3rico!<\/div>\n<p>Talvez fique melhor de entender usando um exemplo. Ent\u00e3o, vamos supor que voc\u00ea tenha feito uma altera\u00e7\u00e3o pontual em uma branch.<\/p>\n<p>Ent\u00e3o, voc\u00ea cochilou sobre o teclado e sonhou que precisava levar aquele commit para outra branch. Para fazer isso de forma r\u00e1pida, depois que voc\u00ea estiver na branch alvo, voc\u00ea pode usar o comando:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git cherry-pick 22dbbf5a1113e76493834ed70fecfd23c9052cd1 <\/code><\/pre>\n<p>Por outro lado, se voc\u00ea gostaria de aplicar no diret\u00f3rio de trabalho atual o commit do topo de uma branch chamada master, pode fazer assim:<\/p>\n<pre class=\"code-highlighter theme-dark\"><code class=\"language-git\"> $ git cherry-pick master <\/code><\/pre>\n<p>Para todos os comandos apresentados, voc\u00ea pode buscar mais informa\u00e7\u00f5es na documenta\u00e7\u00e3o do <a href=\"https:\/\/git-scm.com\/docs\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git na web<\/a>\u00a0ou usando a op\u00e7\u00e3o<em> &#8211;help<\/em> na linha de comando.<\/p>\n<p>Ficou interessado em saber mais sobre comandos do Git? E que tal git hooks e outros recursos? Ent\u00e3o deixe seu coment\u00e1rio e fale mais sobre o que voc\u00ea gostaria de ler por aqui. \ud83d\ude09<\/p>\n<hr \/>\n<p><strong>Confira tamb\u00e9m:<\/strong><br \/>\n<a href=\"https:\/\/blog.umbler.com\/br\/o-que-pode-mudar-com-a-compra-do-github-pela-microsoft\/\" target=\"_blank\" rel=\"noopener noreferrer\">O que pode mudar com a compra do GitHub pela Microsoft?<\/a><br \/>\n<a href=\"https:\/\/blog.umbler.com\/br\/controle-de-versoes-do-seu-wordpress-com-git\/\" target=\"_blank\" rel=\"noopener noreferrer\">Controle de vers\u00f5es do seu WordPress com GIT<\/a><br \/>\n<a href=\"https:\/\/blog.umbler.com\/br\/do-github-a-umbler-em-apenas-um-push\/\" target=\"_blank\" rel=\"noopener noreferrer\">Do GitHub \u00e0 Umbler em apenas um push<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O Git se popularizou fortemente nos \u00faltimos anos. Dificilmente iremos encontrar um desenvolvedor que n\u00e3o use ou tenha usado o Git alguma vez na vida. De fato, versionar c\u00f3digo transcendeu as boas pr\u00e1ticas, e passou a ser um aspecto fundamental para qualquer projeto de software. O Git \u00e9 um sistema complet\u00edssimo para controle de vers\u00e3o [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":5018,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[366,24,350,367],"class_list":["post-4191","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-comandos-do-git","tag-git","tag-open-source","tag-versionamento"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/4191"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=4191"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/4191\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5018"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=4191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=4191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=4191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}