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.
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
- Visual Studio 2022
- Visual Studio 2019 - Menu Git
- Visual Studio 2019 - Explorador de Equipa
- Linha de comando Git
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 .
Escolha Git > Manage Branches para abrir a janela Git Repository .
Na janela Repositório Git, clique com o botão direito do mouse na ramificação de destino e selecione Checkout.
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.
O Visual Studio exibirá uma mensagem de confirmação após uma rebase bem-sucedida.
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.
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:
Vá para Opções de Ferramentas>>Controle do>Código-Fonte Configurações Globais do Git.
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.
- Visual Studio 2022
- Visual Studio 2019 - Menu Git
- Visual Studio 2019 - Explorador de Equipa
- Linha de comando Git
Na janela Alterações do Git, selecione o botão para pressionar sua confirmação.
Ou, você pode selecionar Push no menu Git .
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.
O Visual Studio exibirá uma mensagem de confirmação após um envio bem-sucedido.
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.
- Visual Studio 2022
- Visual Studio 2019 - Menu Git
- Visual Studio 2019 - Explorador de Equipa
- Linha de comando Git
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.