Eu sei como resolver isso:
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
Mas não tem como deixar git pull
fazer stash
e pop
dançar para mim?
Se este comando tiver um nome diferente, está tudo bem.
Criar um alias de shell para git stash; git pull; git stash pop
é uma solução, mas procuro uma solução melhor.
git stash; git pull; git stash pop
programaticamente é perigoso, porque se não houver nada para armazenar, nãogit stash
haverá operação , masgit stash pop
exibirá o último esconderijo (se houver), que quase certamente não é o que você deseja. O usuário torek tem uma ótima postagem sobre isso no Stack Overflow, mas não consigo encontrar ...Respostas:
Para Git 2.6+ (lançado em 28 de setembro de 2015)
o
sógit config
configuração que seria de interesse é:(com Git 2.27, Q2 2020, agora você também tem
merge.autostash
, veja abaixo)combine isso com:
Isso seria o suficiente para um simples
git pull
trabalhar mesmo em uma árvore suja.Nenhum alias necessário nesse caso.
Consulte commit 53c76dc (04 de julho de 2015) de Kevin Daudt (
Ikke
) .(Incorporado por Junio C Hamano -
gitster
- no commit e69b408 , 17 de agosto de 2015)Nota: se você quiser puxar sem autostash (mesmo que
rebase.autoStash true
esteja definido), você tem desde o git 2.9 (junho de 2016):Consulte commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 abr 2016) e commit f66398e , commit c48d73b (21 mar 2016) por Mehul Jain (
mehul2029
) .(Incorporado por Junio C Hamano -
gitster
- no commit 7c137bb , 13 de abril de 2016)O compromisso f66398e em particular inclui:
Aviso: antes do Git 2.14 (terceiro trimestre de 2017), "
git pull --rebase --autostash
" não armazenava automaticamente quando o histórico local avançava rapidamente para o upstream.Veja o commit f15e7cf (01 de junho de 2017) de Tyler Brazier (
tylerbrazier
) .(Incorporado por Junio C Hamano -
gitster
- no commit 35898ea , 05 de junho de 2017)Atualização: Mariusz Pawelski faz nos comentários uma pergunta interessante:
Responda:
O tópico original que discute esse recurso de autostash, foi implementado originalmente para
git pull
(mesclar) egit pull --rebase
.Mas ... Junio C Hamano (mantenedor do Git) observou que:
Portanto, em relação a um pull-merge clássico, é melhor:
Dito isso, com o Git 2.27 (Q2 2020), "
git pull
" aprendeu a avisar quando nenhumapull.rebase
configuração existe, e nem--[no-]rebase
nem--ff-only
é fornecido (o que resultaria em uma fusão).Consulte o commit d18c950 (10 de março de 2020) de Alex Henrie (
alexhenrie
) .(Fundido por Junio C Hamano -
gitster
- no commit 1c56d6f , 27 de março de 2020)Com o Git 2.27 (Q2 2020), "
git merge
" aprende a--autostash
opção " " e a novamerge.autostash
configuração.Veja cometer d9f15d3 , cometer f8a1785 , cometer a03b555 , cometer 804fe31 , cometer 12b6e13 , cometer 0dd562e , cometer 0816f1d , cometer 9bb3dea , cometer 4d4bc15 , cometer b309a97 , cometer f213f06 , cometer 86ed00a , cometer facca7f , cometer be1bb60 , cometer efcf6cf , cometer c20de8b , cometer bfa50c2 , commit 3442c3d , commit 5b2f6d9 (07 de abril de 2020), commit 65c425a(04 de abril de 2020), e cometer fd6852c , cometer 805d9ea (21 de março de 2020) por Denton Liu (
Denton-L
) .(Incorporado por Junio C Hamano -
gitster
- no commit bf10200 , 29 de abril de 2020)E:
fonte
rebase.autoStash
aplica-se apenas ao usar rebase.pull.rebase
aplica-se apenas ao usar pull.die_on_unclean_work_tree
.2.5.5
.rebase
(oupull --rebase
). Mas ninguém está falando sobre autostashing quando você faz o normalpull
com mesclagens. Portanto, não existe uma mudança automática para isso? Ou estou perdendo alguma coisa? Eu prefiro fazer,git pull --rebase
mas OP perguntou sobre "padrão"git pull
Para economizar alguns segundos para os exploradores que se aproximam, aqui está um resumo (graças a @VonC):
fonte
git config pull.rebase true
egit config rebase.autoStash true
, tudo o que você precisa égit pull
. Apenasgit pull
. Nenhuma outra opção necessária.--autostash
opção. O-c rebase.autoStash=true
funciona em Git 2.6 em diante.Como o comentário acima afirmou, definir os dois valores de configuração não funciona atualmente
git pull
, já que a configuração de autostash se aplica apenas a rebases reais. Esses comandos git fazem o que você deseja:Ou defina-o como um alias:
Então faça:
É claro que esse alias pode ser renomeado conforme desejado.
fonte
Com Git 2.6+, você pode usar o seguinte:
Isso
--rebase
faz com que git-pull use emrebase
vez demerge
, então configurações / opções como--ff-only
não se aplicam.Estou usando um alias para puxar
--ff-only
por padrão (git pull --ff-only
) e posso usargup
(de cima) no caso de uma mesclagem rápida não ser possível ou se houver alterações ocultas.fonte
git pull --ff-only
egit pull pull --rebase --autostash
Como você já mencionou, esta é a maneira de se fazer. Você pode usá-lo como um alias para economizar digitação e usar atalhos ou pode usá-lo em uma única linha (pode ser um apelido também)
git stash && git pull --rebase && git stash pop
Ele fará a mesma coisa que você fez, mas em uma única linha (&&) e se você definir como alias, será ainda mais curto.
As linhas a seguir exibirão as mudanças de entrada / saída antes de você puxar / empurrar
fonte
stash pop
, removerá algumas coisas aleatórias de antes.git stash
não faz nada stash-lo ainda "retornos" não errorcode para que o && ainda vai continuar comgit pull
egit stash pop
e pop um estoque anterior. Então é melhor não usar isso a menos que você tenha certeza de que vai esconder alguma coisa!