Помилка: неможливо витягнути за допомогою ребазу: у вас є нестандартні зміни


138

Я почав співпрацювати з кількома друзями над проектом, і вони використовують сховище 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.

Я здогадуюсь, що я заплутався з кодом, і тепер він хоче, щоб я здійснив або скасував (це те, що означає приховування?) Змін. Це те, що відбувається? У такому випадку я хотів би відкинути будь-які зміни, які я міг би внести, і просто отримати оновлений код із сховища git.

Будь-яке уявлення про те, що я можу зробити?

Відповіді:


173

Зроби git status, це покаже, які файли змінилися. Оскільки ви заявили, що не хочете зберігати зміни, які ви можете зробити, git checkout -- <file name>або git reset --hardпозбутися змін.

Здебільшого git підкаже вам, що робити щодо змін. Наприклад, ваше повідомлення про помилку повідомило про git stashваші зміни. Це було б, якби ви хотіли зберегти їх. Після витягування ви зробите це, git stash popі ваші зміни будуть застосовані знову.

git status також є спосіб позбутися змін, залежно від того, чи файл встановлено для здійснення чи ні.


1
Це , здається, є робота , але тепер я зіткнувся інший помилка (затіяв нові питання не сплутати майбутні Vistors): stackoverflow.com/questions/23518247 / ...
user3597950

Я буквально маю це кожен раз, зовсім недавно. Раніше витягування файлів, які не впливають на ваші поточні зміни, добре, але зараз потрібно все, що ви змінили, щоб зберігати. Я навіть не можу натиснути, я змушений користуватисяgit push -f
Karma Blackshaw

@KarmaBlackshaw Вам не потрібно буде змушувати натискати. Якщо вам потрібно зробити сильний поштовх, це означає, що ваша краєзнавча історія та віддалена історія відрізняються, і це питання інше, ніж те, що стосується цієї відповіді.
Шлейс

Дійсно інше, що передбачає обсяг цього питання. Але я знайшов спосіб, видаливши поточну гілку та створивши нову гілку з розробки. Я здогадуюсь, що в моєму відділенні були деякі речі неправильно налаштовані.
Karma Blackshaw

91

Якщо ви хочете зберегти робочі зміни під час виконання ребайз, ви можете використовувати --autostash. З документації :

Перш ніж запустити ребазацію, при необхідності приховайте локальні модифікації (див. Git-stash [1] ) та застосуйте копію, коли буде зроблено.

Наприклад:

git pull --rebase --autostash

7
Це сучасна відповідь.
adl

13
Якщо ви хочете, щоб автозапуск був поведінкою за замовчуванням, яку ви можете встановити. 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
Це , здається, є робота , але тепер я зіткнувся інший помилка (затіяв нові питання не сплутати майбутні Vistors): stackoverflow.com/questions/23518247 / ...
user3597950

6
@nehemiahjacob Ви також git stash popможете застосувати останні затримані зміни та уникнути запам'ятовування довше apply stash@{0}.
Костас Русіс

Я маю це робити постійно. Будь-який простіший спосіб?
Альпер

@alper, як правило, ви працюєте в іншій (функціональній) галузі. З мого досвіду, я лише отримую та переглядаю майстра лише після того, як я доклав свою роботу, тому немає необхідності приховувати / викопувати. Якщо ви хочете зробити це дуже багато під час робочого процесу розвитку, ви завжди можете зробити псевдонім у своєму .bashrc(або будь-якому іншому випадку ):alias stashpull='git stash; git pull; git stash pop'
Костас Русіс

@KostasRousis У мене є точний псевдонім, lol. Я називаю це 'sppgit'
luizfls

30

Спочатку почніть з а git status

Перевірте, чи є у вас зміни, що очікують Щоб відкинути їх, запустіть

git reset --hard

Це , здається, є робота , але тепер я зіткнувся інший помилка (затіяв нові питання не сплутати майбутні Vistors): stackoverflow.com/questions/23518247 / ...
user3597950

16

Це працює для мене:

git fetch
git rebase --autostash FETCH_HEAD

1
Ну автозапуск, це економить мені додаткові дві команди. Це має бути правильна відповідь ІМО.
Ерік Беркун-Древніг

10

Ви завжди можете це зробити

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

і ви або отримаєте (a) жодних змін, якщо у вас залишилися зміни, що суперечать змінам у верхній частині потоку, або (b) такий же ефект, як приховування / потяг / застосувати: ребаза, щоб встановити останні зміни від HEAD та ваші незапущені зміни залишені як є.


6

Коли нестандартна зміна пов’язана з тим, що git намагається виправити конвенції eol у файлі (як це завжди в моєму випадку), жодна кількість прихованих запитів чи виїзду чи скидання не змусить його піти.

Однак, якщо наміром справді є повторне базування даних і ігнорування нестандартних змін, то я хочу видалити гілку локально, а потім перевірити її ще раз.

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

Вуаля! Це ще не підвело мене.


2

Якщо ви хочете автоматично приховувати зміни та видалити їх для кожної ребави, ви можете зробити це:

git config --global rebase.autoStash true

1
Це єдина відповідь, завдяки якій новітня версія Git працює так само, як Git завжди працювала в минулому. Навіщо змушувати людей додавати, --autostashколи це просто може бути ... автоматичним?
Андрій Костер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.