Aplicar alterações com rebase

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

O Git mantém automaticamente um histórico de desenvolvimento em uma ramificação vinculando cada novo compromisso ao seu antecessor. Quando você funde um ramo em outro, a história pode se tornar menos simples. Por exemplo, uma mesclagem sem avanço rápido combina linhas de desenvolvimento divergentes criando uma confirmação de mesclagem com vários predecessores. Por outro lado, uma rebase Git combina linhas divergentes de desenvolvimento sem criar uma confirmação de mesclagem, o que resulta em um histórico de confirmação mais simples, mas perde informações sobre a mesclagem. Sua escolha do tipo de mesclagem provavelmente é influenciada pelo fato de você querer preservar um registro da mesclagem ou simplificar o histórico de confirmação.

Este artigo discute quando usar uma rebase em vez de uma mesclagem sem avanço rápido e fornece procedimentos para as seguintes tarefas:

  • Rebaseie sua filial local
  • Força empurrar sua filial local após uma rebase
  • Rebase interativo para esmagar compromissos locais

Para obter uma visão geral do fluxo de trabalho do Git, consulte o tutorial do Azure Repos Git.

Rebaseie sua filial local

O Git rebase integra confirmações de uma ramificação de origem à sua ramificação local atual (ramificação de destino). O ramo de origem permanece inalterado. Para comparação, a rebase do Git e outros tipos de mesclagem são mostrados no diagrama a seguir.

Diagrama mostrando as confirmações antes e depois ao usar a base do Git.

A rebase do Git resequencia o histórico de confirmações da ramificação de destino para que ela contenha todas as confirmações de ramificação de origem, seguidas por todas as confirmações de ramificação de destino desde a última confirmação comum. Outra maneira de visualizá-lo é que uma rebase reproduz as alterações na ramificação de destino sobre o histórico da ramificação de origem. Notavelmente, a rebase do Git altera a sequência dos commits de ramificação de destino existentes, o que não é o caso das outras estratégias de mesclagem. No diagrama anterior, commit K' contém as mesmas alterações que K, mas tem um novo ID de commit porque ele se vincula de volta para commit E em vez de C.

Durante uma rebase, se uma alteração de ramificação de origem entrar em conflito com uma alteração de ramificação de destino, o Git solicitará que você resolva o conflito de mesclagem. Você pode resolver conflitos de mesclagem durante uma rebase da mesma forma que resolve conflitos de mesclagem durante uma mesclagem.

Rebase vs. mesclagem sem avanço rápido

A rebase do Git resulta em um histórico de confirmação mais simples, mas menos exato, do que uma mesclagem sem avanço rápido, também conhecida como mesclagem de três vias ou verdadeira . Quando quiser um registro de uma mesclagem no histórico de confirmação, use uma mesclagem sem avanço rápido.

Se você for a única pessoa trabalhando em uma ramificação de recurso ou correção de bugs, considere usar uma rebase para integrar main periodicamente o trabalho recente da ramificação nela. Essa estratégia ajuda a garantir que você fique ciente do trabalho recente de outras pessoas e resolva prontamente quaisquer conflitos de mesclagem que surjam. Ao rebasear, você implementa seu novo recurso sobre o trabalho de ramificação mais recente main , o que ajuda a manter um histórico de confirmação linear.

Para obter mais informações sobre o Git rebase e quando usá-lo, consulte Rebase vs merge.

Diretrizes de rebase e force-push

Se você rebasear uma ramificação local que você enviou anteriormente e, em seguida, executar o comando padrão Git push novamente, o push falhará. O comando push padrão do Git aplica uma mesclagem de avanço rápido para integrar sua ramificação local à ramificação remota. Esse comando falhará após uma rebase porque a rebase altera a sequência de confirmações existentes em sua ramificação de destino local, portanto, não corresponde mais ao histórico de sua contraparte remota. Nesse cenário, um push de força será bem-sucedido — substituindo a ramificação remota.

A rebase do Git e o force push são ferramentas poderosas, mas tenha estas diretrizes em mente ao decidir se deseja usá-las:

  • Não rebaseie uma ramificação local que tenha sido enviada por push e compartilhada com outras pessoas, a menos que você tenha certeza de que ninguém está usando a ramificação compartilhada. Após uma rebaseação, sua filial local não corresponderá mais ao histórico de sua contraparte remota.
  • Não force o push para uma ramificação remota que esteja em uso por outras pessoas, pois sua versão local da ramificação remota não corresponderá mais ao histórico de ramificação remota atualizado.
  • Sua equipe deve concordar com os cenários de uso para rebase e force push.

Gorjeta

Para um processo de revisão colaborativa, use uma solicitação pull para mesclar um novo trabalho na ramificação padrão de um repositório remoto.

Como rebasear

O Visual Studio 2022 fornece uma experiência de controle de versão do Git usando o menu Git, Alterações do Git e por meio de menus de contexto no Gerenciador de Soluções. O Visual Studio 2019 versão 16.8 também oferece a interface de usuário do Team Explorer Git. Para obter mais informações, consulte a guia Visual Studio 2019 - Team Explorer .

  1. Escolha Git > Manage Branches para abrir a janela Git Repository .

    Captura de tela da opção Gerenciar ramificações no menu Git do Visual Studio.

  2. Na janela Repositório Git, clique com o botão direito do mouse na ramificação de destino e selecione Checkout.

    Captura de tela da opção Checkout no menu de contexto da ramificação na janela Repositório Git do Visual Studio.

  3. Clique com o botão direito do mouse na ramificação de origem e selecione Rebasear <ramificação> de destino na <ramificação> de origem.

    Captura de tela da opção Rebase no menu de contexto de ramificação na janela Repositório Git do Visual Studio.

  4. O Visual Studio exibirá uma mensagem de confirmação após uma rebase bem-sucedida.

    Captura de tela da mensagem de confirmação de rebase na janela Repositório Git do Visual Studio.

    Se a rebase for interrompida devido a conflitos de mesclagem, o Visual Studio irá notificá-lo. Você pode resolver os conflitos ou cancelar a rebase e retornar ao estado de pré-rebase.

    Captura de tela da mensagem de conflito de rebase na janela Repositório Git do Visual Studio.

Força empurrar sua filial local após uma rebase

Se você rebasear uma ramificação local que você enviou anteriormente, um push Git padrão subsequente falhará. Em vez disso, você pode forçar o push de sua ramificação local a substituir sua contraparte remota para que seus históricos de confirmação correspondam.

Aviso

Nunca force a empurrar um ramo em que os outros estão trabalhando. Para obter mais informações, consulte Rebasear e forçar diretrizes de push.

Para forçar push no Visual Studio, você deve primeiro habilitar a opção force push:

  1. Vá para Opções de Ferramentas>>Controle do>Código-Fonte Configurações Globais do Git.

  2. Selecione a opção Ativar push --force-with-lease .

O sinalizador de push --force-with-lease do Git é mais seguro do que o --force sinalizador porque ele não substituirá uma ramificação remota que tenha confirmações que não estejam integradas à ramificação local que você está forçando a empurrar.

  1. Na janela Alterações do Git, selecione o botão para pressionar sua confirmação.

    Captura de tela do botão de seta para cima na janela Alterações do Git do Visual Studio.

    Ou, você pode selecionar Push no menu Git .

    Captura de tela da opção Push no menu Git no Visual Studio.

  2. Se a operação de push padrão do Git falhar, o Visual Studio iniciará a caixa de diálogo com falha do Git-Push. Escolha Force Push.

    Captura de tela da caixa de diálogo com falha do Git-push no Visual Studio.

  3. O Visual Studio exibirá uma mensagem de confirmação após um envio bem-sucedido.

    Captura de tela da mensagem de confirmação por push no Visual Studio.

Rebase interativo para esmagar compromissos locais

Normalmente, ao trabalhar em um novo recurso em sua ramificação de recurso local, você criará várias confirmações. Quando estiver pronto para publicar o novo recurso, convém consolidar essas confirmações em uma única confirmação para simplificar o histórico de confirmações. Você pode usar uma rebase interativa para esmagar várias confirmações em uma única confirmação.

O Visual Studio 2022 não oferece suporte à redefinição de base interativa. Em vez disso, use a linha de comando do Git.

Nota

Os usuários do Azure DevOps podem esmagar a mesclagem para condensar o histórico de confirmação de uma ramificação de tópico durante uma solicitação pull.

Próximos passos