git fetch
git merge origin/$CURRENT_BRANCHo origin/$CURRENT_BRANCH parte significa que:
- O Git mesclará as alterações do repositório remoto chamado
origin(aquele de quem você clonou) - que foram adicionados ao
$CURRENT_BRANCH - que ainda não estão presentes em sua agência local de check-out
Como o Git só executa mesclagens quando não há alterações não confirmadas, toda vez que você executa git pull Com alterações não confirmadas, você pode ter problemas. Felizmente, existem maneiras de sair do problema de uma só vez!
Quando você tem alterações locais não confirmadas e ainda deseja extrair uma nova versão do servidor remoto, seu caso de uso geralmente se enquadra em um dos seguintes cenários. Ou:
- você não se importa com as alterações locais e deseja substituí-las,
- você se preocupa muito com as alterações e gostaria de aplicá-las após as alterações remotas,
- você deseja fazer o download das modificações remotas, mas ainda não as aplica
Cada uma das abordagens requer uma solução diferente.
Você não se importa com as mudanças locais
Nesse caso, você deseja excluir todas as alterações locais não confirmadas. Talvez você tenha modificado um arquivo para experimentar, mas não precisa mais da modificação. Tudo o que importa é estar atualizado com o upstream.
Isso significa que você adiciona mais uma etapa entre buscar as alterações remotas e mesclá-las. Esta etapa redefinirá a ramificação para seu estado não modificado, permitindo assim git merge trabalhar.
git fetch
git reset --hard HEAD
git merge origin/$CURRENT_BRANCHSe você não quiser digitar o nome da ramificação toda vez que executar este comando, o Git terá um bom atalho apontando para a ramificação upstream: @{u}. Uma ramificação upstream é a ramificação no repositório remoto para o qual você envia e busca.
É assim que os comandos acima se pareceriam com o atalho:
git fetch
git reset --hard HEAD
git merge '@{u}'Estamos citando o atalho no exemplo para impedir que o shell o interprete.
Você se importa muito com as mudanças locais
Quando suas alterações não confirmadas são significativas para você, há duas opções. Você pode confirmar e executar git pull, ou você pode escondê-los.
Esconder significa guardar as alterações por um momento para trazê-las de volta mais tarde. Para ser mais preciso, git stash cria uma confirmação que não é visível no seu ramo atual, mas ainda é acessível pelo Git.
Para recuperar as alterações salvas no último stash, use o botão git stash pop comando. Após a aplicação bem-sucedida das alterações armazenadas, este comando também remove a confirmação stash, pois não é mais necessária.
O fluxo de trabalho pode ficar assim:
git fetch
git stash
git merge '@{u}'
git stash popPor padrão, as alterações do stash serão preparadas. Se você deseja desestabilizá-los, use o comando git restore --staged (se estiver usando o Git mais recente que 2.25.0).
Você só quer baixar as alterações remotas
O último cenário é um pouco diferente dos anteriores. Digamos que você esteja no meio de uma refatoração muito confusa. Nem perder as alterações nem escondê-las é uma opção. No entanto, você ainda deseja ter as alterações remotas disponíveis para execução git diff contra eles.
Como você provavelmente já descobriu, o download das alterações remotas não requer git pull em absoluto! git fetch é apenas o suficiente.
Uma coisa a observar é que, por padrão, git fetch trará apenas alterações da ramificação atual. Para obter todas as alterações de todas as ramificações, use git fetch --all. E se você deseja limpar algumas ramificações que não existem mais no repositório remoto, git fetch --all --prune vai fazer a limpeza!
Você já ouviu falar do Git Config? É um arquivo em que o Git armazena todas as configurações definidas pelo usuário. Ele reside no seu diretório pessoal: como ~/.gitconfig ou ~/.config/git/config. Você pode editá-lo para adicionar alguns aliases personalizados que serão entendidos como comandos do Git.
Por exemplo, para ter um atalho equivalente a git diff --cached (que mostra a diferença entre a ramificação atual e os arquivos temporários), você adicionaria a seguinte seção:
[alias]
dc = diff --cachedDepois disso, você pode executar git dc sempre que desejar revisar as alterações. Seguindo esse caminho, podemos configurar alguns aliases relacionados aos casos de uso anteriores.
[alias]
pull_force = !"git fetch --all; git reset --hard HEAD; git merge @{u}"
pf = pull_force
pull_stash = !"git fetch --all; git stash; git merge @{u}; git stash pop"Dessa forma, correndo git pull_force substituirá as alterações locais, enquanto git pull_stash irá preservá-los.
Mentes curiosas podem já ter descoberto que existe algo como git pull --force. No entanto, este é um animal muito diferente do que é apresentado neste artigo.
Pode parecer algo que nos ajudaria a substituir as alterações locais. Em vez disso, permite buscar as alterações de uma ramificação remota em uma ramificação local diferente. git pull --force somente modifica o comportamento da parte de busca. É, portanto, equivalente a git fetch --force.
Gostar git push, git fetch nos permite especificar em qual filial local e remota queremos operar. git fetch origin/feature-1:my-feature significará que as mudanças no feature-1 A ramificação do repositório remoto será visível na ramificação local my-feature. Quando tal operação modifica o histórico existente, não é permitido pelo Git sem um explícito --force parâmetro.
Assim como git push --force permite substituir ramificações remotas, git fetch --force (ou git pull --force) permite substituir ramificações locais. É sempre usado com ramificações de origem e destino mencionadas como parâmetros. Uma abordagem alternativa para substituir alterações locais usando git --pull force poderia ser git pull --force "@{u}:HEAD".
O mundo do Git é vasto. Este artigo abordou apenas uma das facetas da manutenção do repositório: incorporar alterações remotas em um repositório local. Mesmo esse cenário cotidiano exigia que analisássemos um pouco mais profundamente os mecanismos internos dessa ferramenta de controle de versão.
Aprender casos de uso reais ajuda a entender melhor como o Git funciona sob o capô. Isso, por sua vez, fará com que você se sinta empoderado sempre que tiver problemas. Todos fazemos isso de tempos em tempos.