Я знаю, как это решить:
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
Но разве нет способа позволить git pull
мне танцевать stash
и pop
танцевать для меня?
Если у этой команды другое имя, ничего страшного.
Создание псевдонима оболочки для git stash; git pull; git stash pop
- это решение, но я ищу лучшее решение.
git stash; git pull; git stash pop
Программный запуск опасен, потому что, если нечего спрятать, операцияgit stash
будет невозможна, ноgit stash pop
выскочит последний тайник (если есть), что почти наверняка не то, что вам нужно. У пользователя torek есть отличный пост об этом на Stack Overflow, но я не могу его найти ...Ответы:
Для Git 2.6+ (выпущен 28 сентября 2015 г.)
толькоgit config
интересующая настройка:(Git 2.27, Q2 2020, теперь у вас тоже есть
merge.autostash
, см. ниже)объедините это с:
Этого хватило бы, чтобы простая
git pull
работала даже на грязном дереве.В этом случае псевдоним не нужен.
См. Commit 53c76dc (4 июля 2015 г.) Кевина Даудта (
Ikke
) .(Объединено Junio C Hamano -
gitster
- в фиксации e69b408 , 17 августа 2015 г.)Примечание: если вы хотите тянуть без autostash (даже если
rebase.autoStash true
он установлен), у вас с git 2.9 (июнь 2016 г.) есть:См. Фиксацию 450dd1d , фиксацию 1662297 , фиксацию 44a59ff , фиксацию 5c82bcd , фиксацию 6ddc97c , фиксацию eff960b , фиксацию efa195d (2 апреля 2016 г.) и фиксацию f66398e , фиксацию c48d73b (21 марта 2016 г.) Мехул Джайн (
mehul2029
) .(Объединено Junio C Hamano -
gitster
- в коммите 7c137bb , 13 апреля 2016 г.)В частности, коммит f66398e включает:
Предупреждение: до Git 2.14 (3 квартал 2017 г.) "
git pull --rebase --autostash
" не сохранялась автоматически при быстрой пересылке локальной истории в вышестоящий.См. Commit f15e7cf (01 июня 2017 г.) Тайлера Брейзера (
tylerbrazier
) .(Объединено Junio C Hamano -
gitster
- в коммите 35898ea , 5 июня 2017 г.)Обновление: Мариуш Павельски задает в комментариях интересный вопрос:
Ответ:
Исходный поток обсуждать эту autostash функцию, она была реализована изначально как для
git pull
(слияния) иgit pull --rebase
.Но ... Junio C Hamano (сопровождающий Git) заметил, что:
Итак, что касается классического пул-слияния, лучше:
При этом с Git 2.27 (второй квартал 2020 г.) "
git pull
" научился предупреждать, когдаpull.rebase
конфигурация не существует, и ни одна из них--[no-]rebase
не--ff-only
задана (что приведет к слиянию).См. Commit d18c950 (10 марта 2020 г.) от Alex Henrie (
alexhenrie
) .(Объединено Junio C Hamano -
gitster
- в коммите 1c56d6f , 27 марта 2020 г.)В Git 2.27 (второй квартал 2020 г.) "
git merge
" изучает параметр "--autostash
" и новыйmerge.autostash
параметр.См совершать d9f15d3 , совершать f8a1785 , совершают a03b555 , совершают 804fe31 , совершают 12b6e13 , совершают 0dd562e , совершают 0816f1d , совершают 9bb3dea , совершают 4d4bc15 , совершают b309a97 , совершают f213f06 , совершают 86ed00a , совершают facca7f , совершают be1bb60 , совершают efcf6cf , совершают c20de8b , совершить bfa50c2 , фиксация 3442c3d , фиксация 5b2f6d9 (7 апреля 2020 г.), фиксация 65c425a(4 апреля 2020 г.) и фиксация fd6852c , фиксация 805d9ea (21 марта 2020 г.) Дентоном Лю (
Denton-L
) .(Объединено Junio C Hamano -
gitster
- в фиксации bf10200 , 29 апреля 2020 г.)И:
источник
rebase.autoStash
применяется только при использовании rebase.pull.rebase
применяется только при использовании pull.die_on_unclean_work_tree
.2.5.5
.rebase
(илиpull --rebase
). Но никто не думает об автостэшировании, когда вы делаетеpull
слияния нормально . Значит, для этого нет автоматического переключателя? Или я чего-то упускаю? Я предпочитаю делать это,git pull --rebase
но OP спросил о «стандарте»git pull
Чтобы сэкономить несколько секунд для приближающихся исследователей, вот резюме (благодаря @VonC):
источник
git config pull.rebase true
иgit config rebase.autoStash true
все, что вам когда-либо понадобится, этоgit pull
. Простоgit pull
. Других опций не требуется.--autostash
опции.-c rebase.autoStash=true
Работает в Git 2.6 и далее.Как указано в комментарии выше, установка двух значений конфигурации в настоящее время не работает
git pull
, поскольку конфигурация autostash применяется только к фактическим перемещениям. Эти команды git делают то, что вы хотите:Или установите его как псевдоним:
Затем сделайте:
Конечно, этот псевдоним можно переименовать по желанию.
источник
В Git 2.6+ вы можете использовать следующее:
Это
--rebase
делает ГИТ-тянущего использоватьrebase
вместоmerge
, поэтому настройки / опции , как--ff-only
не будет применяться.Я использую псевдоним для извлечения
--ff-only
по умолчанию (git pull --ff-only
), а затем могу использоватьgup
(сверху) в случае, если быстрое слияние невозможно или есть спрятанные изменения.источник
git pull --ff-only
иgit pull pull --rebase --autostash
Как вы уже упоминали, это способ сделать это. Вы можете использовать его в псевдониме, чтобы сохранить ввод и использовать ярлык, или вы можете использовать его в одной строке (также может быть псевдонимом)
git stash && git pull --rebase && git stash pop
Он будет делать то же самое, что и вы, но в одной строке (&&), и если вы установите псевдоним, он будет даже короче.
Следующие строки будут отображать входящие / исходящие изменения до того, как вы потянете / нажмете
источник
stash pop
распакует некоторые случайные вещи из прошлого.git stash
ничего не хранит, он все равно не «возвращает» код ошибки, поэтому && будет продолжать сgit pull
иgit stash pop
и вытолкнуть предыдущий тайник. Так что лучше не используйте это, если вы не очень уверены, что он что-то припрятал!