Як я ігнорую помилку на "git pull" про мої локальні зміни, які будуть перезаписані об'єднанням?


568

Як я ігнорую таке повідомлення про помилку на Git pull?

Ваші локальні зміни до наступних файлів будуть замінені об'єднанням

Що робити, якщо я хочу їх перезаписати?

Я пробував такі речі, як git pull -f, але нічого не виходить.

Щоб було зрозуміло, я хочу лише переписати конкретні зміни, не все.


Чи не пов'язані , але не дублікат: stackoverflow.com/questions/52704 / ...
Daniel Hilgarth

7
@BrianKnoblauch повністю згоден! Плюс, це не багато "злиття", якщо це "перезапис"? Я сумую за SVN щодня ...
користувач1944491

2
git config core.fileMode falseврятуй мої часи
Nolwennig


Що робити, якщо я не хочу їх перезаписати?
Філіп Рего

Відповіді:


439

Якщо ви хочете видалити всі локальні зміни, включаючи файли, які не відслідковуються git - зі своєї робочої копії, просто приберіть їх:

git stash push --include-untracked

Якщо вони вам більше не потрібні, тепер ви можете скинути цю скриньку:

git stash drop

Якщо ви не хочете зберігати зміни, які ви вже здійснили, наприклад, із git add-, додайте параметр --keep-index. Однак зауважте, що це все одно не дозволить об'єднатись, якщо ці поетапні зміни стикаються з тими, що надходять із потоку.


Якщо ви хочете замінити лише певні частини локальних змін, є дві можливості:

  1. Зробіть все, що ви не хочете перезаписувати, і використовуйте описаний вище метод для решти.

  2. Використовуйте git checkout path/to/file/to/revertдля змін, які потрібно замінити. Переконайтеся, що файл не ставиться через git reset HEAD path/to/file/to/revert.


Можливість №2 не працює. Після виконання команди нічого не відбувається. При витягуванні я все одно отримую ту ж помилку.
mae

1
@ user1132363: Це працює для мене. Спершу протестуйте його за допомогою одного файлу. Крім того, ви переконайтеся, що файл, який ви хочете перезаписати, не буде інсценованим.
Даніель Гільгарт

3
Хитрість полягала у використанні git checkout HEAD^ path/to/file/to/revert. Використання HEAD ^ все змінило.
май

2
@ user1132363: Це перевіряє попередню версію, а не ту, яку зараз зареєстрували. Я не вірю, що це правильний підхід.
Даніель Гільгарт

1
Мені довелося залишити " save --keep-index".
Пітер Мортенсен

318

Добре за допомогою двох інших відповідей я придумав пряме рішення:

git checkout HEAD^ file/to/overwrite
git pull

7
Це працювало для мене. Чи можете ви розширити цю відповідь, тобто. що це насправді робить?
AC Patrice

3
Це скасовує локальні зміни, повертаючись до посилання HEAD, що, мабуть, є останньою
командою у головній

32
чому HEAD ^ замість HEAD?
Юра

19
HEAD ^ - це короткий термін HEAD ^ 1, що по суті означає один запуск перед HEAD. Ви також можете зробити HEAD ^ 2 для фіксації перед цим. Для отримання додаткової інформації див git-scm.com/book/en/v2 / ... і stackoverflow.com/questions/1955985 / ... .
Давиднейдам

4
поясніть, будь ласка, що це робить у відповіді
ендоліт

242

Це допомагає мені змінити всі локальні зміни і не потребує посвідчення особи:

git reset --hard
git pull

4
Тож потрібно попрацювати над їх рейтинговим альго, громіздким, щоб знайти працюючу, високо оцінену відповідь поки що внизу.
Бенедикт К.

3
@BenedictK. Я вважаю, що система рейтингу належним чином відображає "те, що більшість людей вважає найбільш корисним". Вони займають рейтинг за голосами. Більше людей віддають перевагу іншим рішенням. Це хороше рішення, але все більше людей знаходять інші відповіді більш корисні.
Кітціл

Для мене працює чудово
Ендер

super easy =) thx ^^
lestat_kim

танки, добре працює для мене
Ігор

76

Ось рішення, яке відкидає поетапні зміни:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Прикро, якщо сприймається відмінність походить від того, що у файлі змінилися нові рядки під час його перевірки, це не виправить проблему.
DanielSank

1
Вирішив мою проблему.
Loïc N.

це найкраща відповідь, imo, оскільки він не порушує жодних поетапних елементів, але вирішує проблему файлу, що перешкоджає витягуванню
TheRiley

65

Ви можете здійснити зміни, перш ніж здійснити злиття, або зберегти їх:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Справа в тому, що вам не потрібно було цього робити. Просто візьміть поточний матеріал HEAD і ..... об'єднайте його! Це дуже просто, Git, всі інші VCS роблять це ... але немає. Лінус повинен був зробити це дратівливим у використанні.
Джон

@Jon Це рішення для Ubuntu, я не знайшов нічого кращого, ніж це.
Suneel Kumar

На жаль, --autostashваріант доступний лише з --rebaseможливістю (
Євген Конков

ось збиратись так багато проблем, не варто. Для завантаження також потрібно 5 хвилин. Також вводиться помилки "Від’єднання файлу". downvote
Філіп Рего

51

Якщо ви хочете скасувати локальні зміни в одному файлі, ви можете зробити наступне:

git checkout -- <file>

Тоді ви можете перезаписати файл [и] з останньою версією:

git pull

@pabloasc Це знищує ваші локальні зміни у цьому файлі.
Suneel Kumar

6
Так, це так: "Що робити, якщо я хочу їх перезаписати?"
Девід

1
Оригінальне запитання не в змозі, ця відповідь може дати кому-небудь кошмар, хто може сліпо скопіювати вставку команди.
Suneel Kumar

Якщо ви вже здійснили git reset HEAD~git checkout
комісію

git checkout -- <file>не вдаєтьсяerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Якщо ваше сховище містить кілька файлів, які видалено з master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

Іноді жодне з цих не працює. Прикро, через те, що я думаю, що LF, що буде працювати - це видалення файлів, а потім витягування. Не те, що я рекомендую це рішення, але якщо файл не існує, git не буде марно повідомляти вас про те, що ваші зміни (які можуть бути навіть не зміни), будуть відмінені, і дозволить вам продовжувати.

Використовуйте на свій страх і ризик.


Коли ваш застряг через закінчення рядків, цей метод є
рятівником

Це не працює для мене. Файли не існують локально, і я все ще отримую помилку.
PRMan

11

git stash save --keep-index не працював для мене.

нижче команда працювала як очікувалося.

git reset --hard
git pull

Він замінює всі локальні зміни, якщо вони вам не потрібні.


9

Стільки відповідей тут, що я ненавиджу додати ще одну, але все вищесказане незграбніше, ніж потрібно. Я повинен робити це весь час, оскільки Git, схоже, заплутався і каже, що я змінив файли, які не змінилися (не можу повернутись, тому що вони не змінилися, але я не можу витягнути, тому що вони нібито змінилися) Найпростіший і Найшвидший, що я знайшов поки що:

git stash
git stash drop
git pull

працював як шарм
Блейз

Дивовижний! просте і робоче рішення.
naïveRSA

блискуче, дякую багато
Хамза

8

В останньому Git ви можете додати команду -r/ --rebaseon, pullщоб відновити поточну гілку на верхній частині гілки після вилучення. Попередження має зникнути, але існує ризик виникнення конфліктів, які вам потрібно буде вирішити.


Крім того, ви можете силою перевірити різні відділення, а потім повернутися до них master, наприклад:

git checkout origin/master -f
git checkout master -f

Потім витягніть його знову, як зазвичай:

git pull origin master

Використання цього методу дозволяє заощадити час на зберігання ( git stash) та можливі проблеми з дозволом, перезавантаження файлів ( git reset HEAD --hard), видалення файлів ( git clean -fd) тощо. Також вищезгадане легше запам’ятати.


8

Ця проблема полягає в тому, що ви внесли зміни до файлів / s, і той самий файл / файли існують із змінами в сховищі Git, тому перед тим, як потягнути / натиснути, вам знадобляться сховані локальні зміни:

Щоб перезаписати локальні зміни одного файлу:

git reset file/to/overwrite
git checkout file/to/overwrite

Щоб замінити всі локальні зміни (зміни у всіх файлах):

git stash
git pull
git stash pop

Також ця проблема може бути через те, що ви знаходитесь на гілці, яка не об'єднана з основною гілкою.


5

git reset --hard && git clean -df

Обережно : це скине і видалить усі незатребувані файли.


27
Один не використовує сокиру для виведення мухи з лоба друга.
ЗаслуженийМуль

3
НЕ використовуйте це без усвідомлення того, що деякі файли будуть ВИДАЛЕНО.
andromeda


4

Найкращий спосіб вирішити цю проблему:

git checkout -- <path/file_name>

Після цього ви можете перезаписати файл:

git pull origin master

У мене була зазначена проблема, оскільки я оновив індекс, щоб припустити, що файли не змінилися. Це все одно не дозволило б мені зробити тягу. Я використовував git checkout -- path/*лише один раз, і це дозволило мені виконати тягнення після.
Стівен О'Флін

4

Це допомогло мені відмовити зміни на віддаленому віддаленому сервері та витягнути з керування джерелом GitHub:

git reset --hard
git pull origin master

4

Ось моя стратегія вирішення проблеми.

Постановка проблеми

Нам потрібно внести зміни у понад 10 файлів. Ми намагалися PULL (git pull origin master), але Гіт кричав:

Помилка: Ваші локальні зміни в наступні файли будуть перезаписані злиттям: Будь ласка, введіть свої зміни або схойте їх, перш ніж ви зможете об'єднатись.

Ми намагалися стратити commitі тодіpull , але вони теж не спрацювали.

Рішення

Ми були в брудномуНасправді стадії, тому що файли знаходилися в "Постановочній зоні" ("Staging Area"), також "Index Area", а деякі - в "Head Area", також "локальному каталозі Git". І ми хотіли витягнути зміни з сервера.

Перевірте це посилання для інформації про різні етапи Git чітко: GIT Stages

Ми виконували наступні кроки

  • git stash (Це очистило наш робочий каталог. Ваші зміни зберігаються у стеку Git).
  • git pull origin master (Витягніть зміни з сервера)
  • git stash apply (Застосовано всі зміни зі стека)
  • git commit -m 'message' (Здійснено зміни)
  • git push origin master (Натиснув зміни на сервер)
  • git stash drop (Падіння стека)

Давайте розберемося, коли і навіщо потрібно приховування

Якщо ви перебуваєте в брудному стані, це означає, що ви вносите зміни у свої файли, і тоді з будь-якої причини ви змушені перетягуватись або переходити до іншої гілки для якоїсь дуже нагальної роботи, тому в цей момент ви не можете витягнути або перемикайтеся, поки ви не зробите свою зміну. stashКоманда тут , як протягнути руку допомоги.

З книги ProGIT , 2-е видання:

Часто, коли ви працюєте над частиною свого проекту, речі перебувають у безладному стані, і ви хочете трохи переключити гілки, щоб працювати над чимось іншим. Проблема полягає в тому, що ви не хочете робити зобов’язання за виконану наполовину роботу, щоб пізніше повернутися до цього питання. Відповідь на це питання - команда git stash. Stashing приймає брудний стан вашого робочого каталогу - тобто ваші змінені відслідковані файли та поетапні зміни - і зберігає їх у степі незавершених змін, які ви можете будь-коли повторно застосувати.


3

Якщо ви хочете перезаписати конкретні зміни, вам потрібен певний спосіб сказати, які саме ви хочете забути.

Ви можете спробувати вибірково приховувати зміни, які ви хочете відмовитись, git stash --patchа потім скинути цю скриньку git stash drop. Потім можна втягнути у віддалені зміни та об'єднати їх як звичайні.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Я не знаю, чому на це ще не відповіли, але рішення, як ви бачите, просте. Усі відповіді тут пропонують те саме: видалити / зберегти ваші локальні зміни та застосувати вище (потім, якщо виsave ) застосуйте локальні зміни зверху.

Що git pull --rebase --autostashозначає крок за кроком:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Мій випадок (напевно, і ваш):

У мене місцеві зміни (зміни в робочому каталозі):

введіть тут опис зображення

Коли я намагаюся витягнути віддалені зміни, я отримую помилку:

введіть тут опис зображення

Ці зміни не перетинаються з локальними змінами:

введіть тут опис зображення

Тож коли я pull --rebase --autostashлокальні зміни зберігаються та застосовуються без проблем автоматично

введіть тут опис зображення

Зараз мої локальні зміни трохи нижчі: введіть тут опис зображення


2

У мене був окремий випадок цього: у мене був файл із --assume-незмінним на ньому. Її було важко знайти, оскільки git statusкоманда не показувала жодних змін


У мене така ж проблема. Ви знайшли спосіб її обійти? Я припускаю, що я міг би видалити, а потім повторно додати припущення-незмінене ... те, що я зробив, це просто перевірити ці файли вручну, щоб отримати незмінені версії ... просто цікаво, чи є спосіб просто зробити замовлення / перезавантаження / об'єднання просто перезаписати їх.
Девід

1
Ні, мені довелося відмовитися від усієї речі «припустити незмінну».

2

Якщо ви хочете зберегти виробничі зміни на сервері, просто об'єднайтеся в новий елемент конфігурації. Спосіб обробки такий:

git stash
git pull
git stash pop

Можливо, ви не виконуєте всіх операцій. Ви можете знати, що робити далі.


Потім ви можете використовувати Git diff - w + ім'я файлу для автоматичного підтвердження злиття коду
YanQing

1

Я ігнорував файл у своїй репо-репортажі, і коли я це зробив, git pull upstream masterя отримав таку помилку:

Помилка: Ваші локальні зміни в наступні файли будуть замінені об'єднанням: myfile.js Будь ласка, введіть свої зміни або сховіть їх, перш ніж ви зможете об'єднатись. Аборти

Щоб вирішити це, я зробив наступне

git update-index --no-assume-unchanged myfile.js

Потім я це зробив git statusі отримав це повідомлення

На магістралі філії Ваша гілка відстає від "початкового / початкового" на 4 коміти, і її можна швидко переслати. (використовуйте "git pull", щоб оновити свою локальну філію)

Зміни, не встановлені для фіксації: (використовуйте "git add ..." для оновлення того, що буде здійснено) (використовуйте "git checkout - ...", щоб відмовити зміни в робочому каталозі)

змінено: myfile.js

не додано змін до фіксації (використовуйте "git add" та / або "git commit -a")

Потім я git checkout myfile.jsпішов за ним git pull upstream master. Цього разу операція витягування кишки пройшла успішно.


1

Я стикався з цим, коли тягнув від майстра.

Те, як я впорався з цим, використовуючи Visual Studio;

  1. По-перше, я здійснив скасувати посилання на своє рішення.
  2. Тоді я здійснив процес витягування Git.

Сподіваюся, це допомагає!



1

Я новачок в git і не впевнений, чи добре це моє рішення.

Я перевірив ВСІ відповіді, і жодна з них не працювала на мене!

Але я знайшов інше рішення:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Сподіваюсь, це допомагає.


1

Помилка "Ваші локальні зміни в наступні файли будуть перезаписані об'єднанням", оскільки у вас є деякі зміни в локальному репо-файлі, які ще не були здійснені, тому перед тим, як витягнути з віддаленого репо, просто виконайте зміни в локальній репо.

Скажімо, у вашому віддаленому РЕПО є деяка гілка xyz, і ви хочете, щоб ця віддалена гілка repo xyz була об'єднана в (скопійована в) локальну гілку repo xyz,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Якщо ця помилка через закінчення рядків,

git add
git checkout mybranch

буду працювати. Я не дуже впевнений, чому це працює.


0

Для Pycharm ви можете виконати Git -> Revert і потім потягнути.


0

Це повідомлення також може статися, якщо git-lfsвоно використовується і вказівник на файл був перезаписаний реальним файлом.

тоді ви використовуєте:

git stash
git lfs migrate import
git pull

повний вихід з мого випадку

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

дивіться https://github.com/git-lfs/git-lfs/isissue/2839


0

Я спробував, і це успішно, перш ніж витягнути, нехай фіксує весь файл, який ви не зробили, тоді ви не отримаєте повідомлення від AS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.