Ошибка: не удается вытащить с ребазом: у вас есть не внесенные изменения

139

Я начал сотрудничать с несколькими друзьями по проекту, и они используют хранилище heroku git.

Я клонировал репозиторий несколько дней назад, и с тех пор они внесли некоторые изменения, поэтому я пытаюсь получить последние обновления

Я выполнил git pull --rebaseкоманду, как указано здесь (это правильный способ сделать это?): Https://devcenter.heroku.com/articles/sharing#merging-code-changes

Я получаю следующую ошибку:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

Я предполагаю, что я возился с кодом, и теперь он хочет, чтобы я либо зафиксировал, либо отклонил (это означает, что значит stash?) Изменения. Это то, что происходит? Если это так, я бы хотел отменить все внесенные мной изменения и просто получить обновленный код из репозитория git.

Есть идеи, что я могу сделать?

user3597950
источник

Ответы:

174

Сделайте git status, это покажет вам, какие файлы изменились. Поскольку вы заявили, что не хотите сохранять изменения, которые вы можете сделать, git checkout -- <file name>или git reset --hardизбавиться от них.

По большей части, Git скажет вам, что делать с изменениями. Например, в вашем сообщении об ошибке говорится о git stashваших изменениях. Это было бы, если бы вы хотели сохранить их. После того, как вы потянете, вы будете делать, git stash popи ваши изменения будут применены.

git status также есть, как избавиться от изменений в зависимости от того, находится ли файл для фиксации или нет.

Schleis
источник
1
Это, похоже, сработало, но теперь я сталкиваюсь с другой ошибкой (начались новые вопросы, чтобы не перепутать будущие посетители): stackoverflow.com/questions/23518247/…
user3597950
Я буквально получаю это каждый раз, совсем недавно. Раньше вытащить файлы, которые не влияют на ваши текущие изменения, это нормально, но теперь требуется все, что вы изменили, чтобы сохранить. Я даже не могу толкнуть, я вынужден использоватьgit push -f
Карма Блэкшоу
@KarmaBlackshaw Вам не нужно заставлять толкать. Если вам нужно сделать принудительный толчок, это означает, что ваша локальная история и удаленная история отличаются, и этот вопрос отличается от того, что охватывает этот ответ.
Шлейс
Это действительно отличается от того, что обеспечивает объем этого вопроса. Но я нашел способ, удалив текущую ветку и сделав новую ветку из разработки. Я предполагаю, что это была моя ветвь, которая настроила некоторые вещи неправильно.
Карма Блэкшоу
91

Если вы хотите сохранить ваши рабочие изменения при выполнении ребазинга, вы можете использовать --autostash. Из документации :

Перед началом ребазирования, при необходимости, спрячьте локальные модификации (см. Git-stash [1] ) и примените тайник, когда закончите.

Например:

git pull --rebase --autostash
mkobit
источник
7
Это современный ответ.
адль
13
Если вы хотите, чтобы autostash был поведением по умолчанию, вы можете установить его. git config --global rebase.autoStash true Тогда вам не нужно пропускать переключатель.
Зоредаче
1
ЭТО, что я искал! (обратите внимание, что ключ командной строки доступен в git 2.9, но опция rebase.autostashдоступна в 2.6).
jjmontes
Это git rebase --interactiveтоже отлично работает !
Дан Даскалеску
6
Почему это не по умолчанию?
Ник
49

Тяга с ребазом - это хорошая практика в целом.

Однако вы не можете сделать это, если ваш индекс не чистый, то есть вы внесли изменения, которые не были зафиксированы.

Вы можете сделать это, чтобы обойти, если вы хотите сохранить свои изменения:

  1. сохранить ваши изменения с: git stash
  2. вытащить из мастера с ребаз
  3. повторно применить изменения, которые вы спрятали в (1) с: git stash apply stash@{0}или более простымgit stash pop
Костас Русис
источник
1
Это, похоже, сработало, но теперь я сталкиваюсь с другой ошибкой (начал новые вопросы, чтобы не запутать будущие посетители): stackoverflow.com/questions/23518247/…
user3597950
6
@nehemiahjacob Вы также git stash popможете применить последние сохраненные изменения и избежать запоминания дольше apply stash@{0}.
Костас Русис
Я должен делать это все время. Любой более простой способ?
Alper
@alper обычно вы работаете в другой (особенной) ветке. Исходя из моего опыта, я получаю и перебазирую против мастера только после того, как совершу свою работу, поэтому нет необходимости прятать / высовывать. Если вы обнаружите, что делаете это много во время рабочего процесса разработки, вы всегда можете создать псевдоним в своем .bashrc(или любом alias stashpull='git stash; git pull; git stash pop'
другом
@ KostasRousis У меня есть точный псевдоним, смеется. Я называю это «sppgit»
luizfls
30

Сначала начните с git status

Посмотрите, есть ли у вас ожидающие изменения. Чтобы отбросить их, беги

git reset --hard
Игал С.
источник
Это, похоже, сработало, но теперь я сталкиваюсь с другой ошибкой (начались новые вопросы, чтобы не перепутать будущие посетители): stackoverflow.com/questions/23518247/…
user3597950
16

Это работает для меня:

git fetch
git rebase --autostash FETCH_HEAD
CppChase
источник
1
Ах, autostash, это спасает меня от лишних двух команд. Это должен быть правильный ответ ИМО.
Эрик Беркун-Древниг
10

Вы всегда можете сделать

git fetch && git merge --ff-only origin/master

и вы либо не получите (а) никаких изменений, если у вас есть незафиксированные изменения, которые конфликтуют с вышестоящими изменениями, либо (б) тот же эффект, что и у stash / pull / apply: ребаз, чтобы поставить вас на последние изменения из HEAD, и ваши незафиксированные изменения остались как есть.

Джаред Апдайк
источник
6

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

Однако, если цель является действительно перебазироваться и игнорировать unstaged изменилось, то , что я делаю , это удалить ветвь локально затем проверить его снова.

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

Вуаля! Это еще не подвело меня.

tggagne
источник
2

Если вы хотите автоматически сохранить ваши изменения и распаковать их при каждой перезагрузке, вы можете сделать это:

git config --global rebase.autoStash true
agirault
источник
1
Это единственный ответ, который заставляет работать новейшую версию Git так же, как Git всегда работал в прошлом. Зачем заставлять людей добавлять, --autostashкогда это может быть просто ... автоматически?
Андрей Костер