{"meta":{"title":"Usar rebase do Git na linha de comando","intro":"Veja um breve tutorial sobre como usar git rebase na linha de comando.","product":"Introdução","breadcrumbs":[{"href":"/pt/get-started","title":"Introdução"},{"href":"/pt/get-started/using-git","title":"Usar o Git"},{"href":"/pt/get-started/using-git/using-git-rebase-on-the-command-line","title":"Rebase do Git"}],"documentType":"article"},"body":"# Usar rebase do Git na linha de comando\n\nVeja um breve tutorial sobre como usar git rebase na linha de comando.\n\n## Usando rebase do Git\n\nNeste exemplo, abordaremos todos os comandos `git rebase` disponíveis, exceto `exec`.\n\nVamos começar nossa troca de base inserindo `git rebase --interactive HEAD~7` no terminal. O nosso editor de texto favorito mostrará as seguintes linhas:\n\n```text\npick 1fc6c95 Patch A\npick 6b2481b Patch B\npick dd1475d something I want to split\npick c619268 A fix for Patch B\npick fa39187 something to add to patch A\npick 4ca2acc i cant' typ goods\npick 7b36971 something to move before patch B\n```\n\nNeste exemplo, vamos:\n\n* Una o quinto commit (`fa39187`) ao commit `\"Patch A\"` (`1fc6c95`) usando `squash`.\n* Mova o último commit (`7b36971`) para cima antes do commit `\"Patch B\"` (`6b2481b`) e mantenha-o como `pick`.\n* Mescle o commit `\"A fix for Patch B\"` (`c619268`) no commit `\"Patch B\"` (`6b2481b`) e ignore a mensagem de commit usando `fixup`.\n* Divida o terceiro commit (`dd1475d`) em dois commits menores usando `edit`.\n* Corrija a mensagem do commit com erro de digitação (`4ca2acc`) utilizando `reword`.\n\nUfa! Parece muito trabalho, mas, executando uma etapa de cada vez, podemos fazer essas alterações facilmente.\n\nPara começar, precisamos modificar os comandos no arquivo para que fiquem assim:\n\n```text\npick 1fc6c95 Patch A\nsquash fa39187 something to add to patch A\npick 7b36971 something to move before patch B\npick 6b2481b Patch B\nfixup c619268 A fix for Patch B\nedit dd1475d something I want to split\nreword 4ca2acc i cant' typ goods\n```\n\nAlteramos o comando de cada linha de `pick` para o comando no qual estamos interessados.\n\nAgora, salve e feche o editor. Isso iniciará o rebase interativo.\n\nO Git ignora o primeiro comando de troca de base, `pick 1fc6c95`, pois ele não precisa fazer nada. Vai para o próximo comando, `squash fa39187`. Como essa operação requer entrada de dados, o Git abre o editor de texto novamente. O arquivo aberto é parecido com este:\n\n```text\n# This is a combination of two commits.\n# The first commit's message is:\n\nPatch A\n\n# This is the 2nd commit message:\n\nsomething to add to patch A\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n# Not currently on any branch.\n# Changes to be committed:\n#   (use \"git reset HEAD <file>...\" to unstage)\n#\n# modified:   a\n#\n```\n\nEste arquivo é a maneira do Git de dizer: \"Ei, é isto o que vou fazer com este `squash`\". Ele lista a mensagem do primeiro commit (`\"Patch A\"`) e a mensagem do segundo commit (`\"something to add to patch A\"`). Se você estiver satisfeito com essas mensagens de commit, salve o arquivo e feche o editor. Caso contrário, tem a opção de alterar a mensagem do commit simplesmente mudando o texto.\n\nDepois que o editor é fechado, o rebase continua:\n\n```text\npick 1fc6c95 Patch A\nsquash fa39187 something to add to patch A\npick 7b36971 something to move before patch B\npick 6b2481b Patch B\nfixup c619268 A fix for Patch B\nedit dd1475d something I want to split\nreword 4ca2acc i cant' typ goods\n```\n\nO Git processa os dois comandos `pick` (para `pick 7b36971` e `pick 6b2481b`). Ele *também* processa o comando `fixup` (`fixup c619268`), pois não exige nenhuma interação.\n`fixup` mescla as alterações de `c619268` no commit que o precede, `6b2481b`. As duas alterações terão a mesma mensagem de commit: `\"Patch B\"`.\n\nO Git chega à operação `edit dd1475d`, para e imprime a seguinte mensagem no terminal:\n\n```shell\nYou can amend the commit now, with\n\n        git commit --amend\n\nOnce you are satisfied with your changes, run\n\n        git rebase --continue\n```\n\nNeste ponto, você pode editar qualquer arquivo no projeto para fazer outras alterações. Para cada alteração feita, você precisará executar um novo commit e poderá fazer isso inserindo o comando `git commit --amend`. Quando terminar de fazer todas as alterações, execute `git rebase --continue`.\n\nEm seguida, o Git chega ao comando `reword 4ca2acc`. Ele abre o editor de texto mais uma vez e apresenta as seguintes informações:\n\n```text\ni cant' typ goods\n\n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n# Not currently on any branch.\n# Changes to be committed:\n#   (use \"git reset HEAD^1 <file>...\" to unstage)\n#\n# modified:   a\n#\n```\n\nComo antes, o Git mostra a mensagem do commit para você editar. Você pode alterar o texto (`\"i cant' typ goods\"`), salvar o arquivo e fechar o editor. O Git terminará o rebase e retornará ao terminal.\n\n## Enviar código rebased para o GitHub por push\n\nComo você alterou o histórico do Git, o comando habitual `git push origin`**não funcionará**. Você precisará modificar o comando efetuando um push forçado das suas alterações mais recentes.\n\n```shell\n# Don't override changes\n$ git push origin main --force-with-lease\n\n# Override changes\n$ git push origin main --force\n```\n\n> \\[!WARNING]\n> Forçar o push tem implicações sérias, pois ele muda a sequência histórica de commits para o ramo. Use-o com cuidado, especialmente se o repositório estiver sendo acessado por várias pessoas.\n\n## Leitura adicional\n\n* [Resolver conflitos de mesclagem após um rebase do Git](/pt/get-started/using-git/resolving-merge-conflicts-after-a-git-rebase)"}