{"id":569,"date":"2022-10-11T13:06:42","date_gmt":"2022-10-11T13:06:42","guid":{"rendered":"https:\/\/blogs.ua.es\/jpm33\/?p=569"},"modified":"2022-11-23T14:13:22","modified_gmt":"2022-11-23T14:13:22","slug":"como-unir-commits-en-git-en-uno-solo","status":"publish","type":"post","link":"https:\/\/blogs.ua.es\/jpm33\/2022\/10\/11\/como-unir-commits-en-git-en-uno-solo\/","title":{"rendered":"C\u00f3mo unir commits en git en uno s\u00f3lo [ACTUALIZADO]"},"content":{"rendered":"<p>En ocasiones ocurre que necesitamos juntar varios commits the git. Cas\u00f3 t\u00edpico: en tu trabajo diario con git vas cumpliendo poco a poco mini hitos que te pones, pero a la hora de compartir el trabajo o de enviar los cambios a un repositorio compartido s\u00f3lo se permite enviar el trabajo en un \u00fanico commit agrupado.<\/p>\n<p>\u00bfC\u00f3mo solucionarlo? La soluci\u00f3n se llama hacer un squash de los commits.<\/p>\n<p><!--more--><\/p>\n<p>Una forma es usar un rebase de git e indicar los \u00faltimos X commits hasta el HEAD que queremos juntar.<\/p>\n<p>Con un ejemplo, he creado un repo git con un fichero &#8220;ejemplo.txt&#8221; y he puesto 3 l\u00edneas, para cada una he hecho un commit como se puede ver:<\/p>\n<pre>PS C:\\Users\\jperez\\Desktop\\SquashCommits&gt; <strong>git log --pretty=format:\"%h - %an, %ar : %s\"<\/strong>\r\nc38c676 - Jose PEREZ, 13 seconds ago : commit 3\r\ne6cf0c2 - Jose PEREZ, 23 seconds ago : commit 2\r\ne9f1267 - Jose PEREZ, 35 seconds ago : commit 1<\/pre>\n<p>Ahora, lo que busco es tener esos cambio en un \u00fanico commit (ponemos ~3 para \u00edndicar que desde HEAD vamos a trabajar con los \u00faltimo 3 commits (b58318d, 6967fdf y 7c45e93):<\/p>\n<pre><strong><span class=\"crayon-e\">git <\/span><span class=\"crayon-v\">rebase<\/span> <span class=\"crayon-o\">-<\/span><span class=\"crayon-i\">i<\/span> <span class=\"crayon-v\">HEAD<\/span><span class=\"crayon-o\">~3<\/span><\/strong><\/pre>\n<p>Esto abrir\u00e1 un editor de texto (en mi caso vim) y pondr\u00e1 algo as\u00ed:<\/p>\n<pre>pick c38c676 commit 3\r\nsquash e6cf0c2 commit 2\r\nsquash e9f1267 commit 1\r\n\r\n\r\n# Rebase 710f0f8..e9f1267 onto 710f0f8 \r\n# \r\n# Commands: \r\n# p, pick &lt;commit&gt; = use commit \r\n# r, reword &lt;commit&gt; = use commit, but edit the commit message \r\n# e, edit &lt;commit&gt; = use commit, but stop for amending \r\n# s, squash &lt;commit&gt; = use commit, but meld into previous commit \r\n# f, fixup &lt;commit&gt; = like \"squash\", but discard this commit's log message \r\n# x, exec &lt;command&gt; = run command (the rest of the line) using shell \r\n# b, break = stop here (continue rebase later with 'git rebase --continue') \r\n# d, drop &lt;commit&gt; = remove commit \r\n# l, label &lt;label&gt; = label current HEAD with a name \r\n# t, reset &lt;label&gt; = reset HEAD to a label \r\n# m, merge [-C &lt;commit&gt; | -c &lt;commit&gt;] &lt;label&gt; [\r\n# &lt;oneline&gt;] \r\n# . create a merge commit using the original merge commit's \r\n# . message (or the oneline, if no original merge commit was \r\n# . specified). Use -c &lt;commit&gt; to reword the commit message. \r\n#<\/pre>\n<p>(las l\u00edneas con # no hay que tocarlas son anotaciones que nos pone GIT para que sepamos que operaciones podemos poner aqui).<\/p>\n<p>Con esto indicamos que los dos primeros commit se tienen que integrar (squash) en commit que hemos &#8220;codigo&#8221; (pick) y as\u00ed todo queda un uno solo. Al guardar el editor y cerrar se nos abre otro donde escribimos el mensaje del nuevo commit que reescribe la historia de git.<\/p>\n<p>Aqu\u00ed suelen venir los mensajes de los commits indicados y podemos ver la lista de los ficheros implicados como en un parche.<\/p>\n<p>Al final se nos queda un \u00fanico commit nuevo con todos los cambios de todos los anteriores y el mensaje de commit que uno todos los anteriores.<\/p>\n<p>\u00a1Solucionado!<\/p>\n<h1>Actualizaci\u00f3n (usando intellij)<\/h1>\n<p>El proceso que hemos descrito anteriormente se puede hacer muy f\u00e1cilmente con un IDE. En mi caso, uso IntelliJ y se sigue el procedimiento:<\/p>\n<ol>\n<li>Ir a la pesta\u00f1a &#8220;git&#8221; del IDE<\/li>\n<li>Ir a la rama que se quiere (la actual o checkout a otra)<\/li>\n<li>Elegir los commits sucesivos que queremos unir<\/li>\n<li>Seleccionar &#8220;squash commits&#8221;<\/li>\n<\/ol>\n<p>Como en este imagen:<a href=\"https:\/\/blogs.ua.es\/jpm33\/files\/2022\/11\/git_squash_intellij.png\" target=\"_new\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/blogs.ua.es\/jpm33\/files\/2022\/11\/git_squash_intellij.png\" width=\"100%\" \/><br \/>\n<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En ocasiones ocurre que necesitamos juntar varios commits the git. Cas\u00f3 t\u00edpico: en tu trabajo diario con git vas cumpliendo poco a poco mini hitos que te pones, pero a la hora de compartir el trabajo o de enviar los &hellip; <a href=\"https:\/\/blogs.ua.es\/jpm33\/2022\/10\/11\/como-unir-commits-en-git-en-uno-solo\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":3080,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[374],"tags":[6236,236718],"class_list":["post-569","post","type-post","status-publish","format-standard","hentry","category-programacion","tag-git","tag-programacion-2"],"_links":{"self":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/users\/3080"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/comments?post=569"}],"version-history":[{"count":10,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/569\/revisions"}],"predecessor-version":[{"id":586,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/posts\/569\/revisions\/586"}],"wp:attachment":[{"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/media?parent=569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/categories?post=569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ua.es\/jpm33\/wp-json\/wp\/v2\/tags?post=569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}