Подтвердить что ты не робот

Может ли "git вытащить" автоматически сбрасывать и всплывать в ожидании изменений?

Я знаю, как это решить:

[email protected]$ 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 - это решение, но я ищу лучшее решение.

4b9b3361

Ответ 1

Для Git 2.6+ (выпущено 28 сентября 2015 г.)

Единственная git config, которая будет представлять интерес:

rebase.autoStash

Когда установлено значение true, автоматически создайте временный тайник до начала операции и примените его после завершения операции.
Это означает, что вы можете запустить rebase на грязной worktree.

Тем не менее, используйте с осторожностью: окончательное приложение с приложением после успешной перезагрузки может привести к нетривиальным конфликтам. По умолчанию false.

объединить это:

pull.rebase

Когда значение true, ветки переадресации на вершину извлеченной ветки вместо объединения ветки по умолчанию от удаленного по умолчанию, когда запускается "git pull".

git config pull.rebase true
git config rebase.autoStash true

Этого было бы достаточно, чтобы простой git pull работал даже в грязном дереве.
В этом случае нет псевдонима.


См. commit 53c76dc (04 июля 2015 г.) Кевин Даудт (Ikke).
(слияние Junio ​​C Hamano - gitster - в commit e69b408, 17 августа 2015 г.)

pull: разрешить грязное дерево, если rebase.autostash включено

rebase научился сбрасывать изменения, когда сталкивается с грязным деревом работы, но git pull --rebase не работает.

Проверяйте только, если рабочее дерево загрязнено, если rebase.autostash не является включен.


Примечание: если вы хотите потянуть без автосохранения (даже если rebase.autoStash true установлен), у вас есть с Git 2.9 (июнь 2016 года):

 pull --rebase --no-autostash

См. commit 450dd1d, commit 1662297, commit 44a59ff, commit 5c82bcd, commit 6ddc97c, commit eff960b, commit efa195d (02 апреля 2016 г.) и commit f66398e, commit c48d73b (21 марта 2016 г.) Mehul Jain (mehul2029).
(слияние Junio ​​C Hamano - gitster - в commit 7c137bb, 13 апреля 2016 г.)

commit f66398e в частности включает в себя:

pull --rebase: добавить --[no-]autostash флаг

Если задана переменная конфигурации rebase.autostash, нет способа переопределите его для "git pull --rebase" из командной строки.

Учить "git pull --rebase" флаг командной строки --[no-]autostash, который переопределяет текущее значение rebase.autostash, если установлено. Как "git rebase" понимает опцию --[no-]autostash, это просто вопрос передачи опция "git rebase", когда вызывается "git pull --rebase" .


Предупреждение: перед Git 2.14 (Q3 2017), "git pull --rebase --autostash" не автоматически задерживается, когда локальная история выполняется быстро вперед до верхнего уровня.

См. commit f15e7cf (01 июня 2017 г.) Tyler Brazier (tylerbrazier).
(слияние Junio ​​C Hamano - gitster - в commit 35898ea, 05 июня 2017 г.

pull: ff --rebase --autostash работает в режиме грязного репо

Когда git pull --rebase --autostash в грязном репозитории ускоренная перемотка вперед, ничто не было автозапуском, и тяга не удалась.
Это произошло из-за ярлыка, чтобы избежать перебоев, когда мы можем перемотки вперед, но autostash игнорируется на этом кодексе.

Ответ 2

Как указано выше, установка двух значений конфигурации в настоящее время не работает с git pull, так как конфигурация autostash применяется только к фактическим скидкам. Эти команды git выполняют то, что вы хотите:

git fetch
git rebase --autostash FETCH_HEAD

Или установите его как псевдоним:

git config alias.pullr '!git fetch; git rebase --autostash FETCH_HEAD'

Тогда do:

git pullr

Конечно, этот псевдоним можно переименовать по желанию.

Ответ 3

Чтобы сэкономить несколько секунд для встречных исследователей, вот резюме (спасибо @VonC):

git pull --rebase --autostash

Ответ 4

С помощью Git 2.6+ вы можете использовать следующее:

alias gup='git -c rebase.autoStash=true pull --rebase'

Этот --rebase делает git -pull использовать rebase вместо merge, поэтому настройки/параметры, такие как --ff-only, не будут применяться.

Я использую псевдоним, чтобы потянуть с помощью --ff-only по умолчанию (git pull --ff-only) и затем использовать gup (сверху) в случае невозможности быстрого слияния или спрятанных изменений.

Ответ 5

Как вы уже упоминали, это способ сделать это. Вы можете использовать его в псевдониме, чтобы сохранить ввод и использовать ярлык, или вы можете использовать его в одной строке (также может быть псевдоним)

git stash && git pull --rebase && git stash pop

Он будет делать то же самое, что и вы, но в одной строке (& &), и вы заданы как псевдоним, который будет даже короче.

В следующих строках будут отображаться входящие/исходящие изменения, прежде чем вы будете тянуть/нажимать

git log ^master origin/master
git log master ^origin/master