Питання Як змусити "git pull" перезаписувати локальні файли?


Як примусити перезаписати локальні файли на a git pull?

Сценарій є наступним:

  • Члени команди змінюють шаблони для веб-сайту, на якому ми працюємо
  • Вони додають деякі зображення до каталогу зображень (але забули додати їх під контроль джерела)
  • Вони надсилають зображення поштою, пізніше, до мене
  • Я додаю зображення під контроль джерела та натискаю їх на GitHub разом з іншими змінами
  • Вони не можуть витягувати оновлення з GitHub, оскільки Gіt не хоче перезаписувати їхні файли.

Це помилка, яку я отримую:

error: Untracked working tree file 'public/images/icon.gif' would be overwritten by merge

Як змусити Git переписати їх? Людина є дизайнером - зазвичай я вирішу всі конфлікти вручну, тому сервер має останню версію, яку їм потрібно лише оновити на своєму комп'ютері.


5217
2017-07-14 14:58


походження


хто читає той, хто вважає, що може втратити файли, я був у такому положенні і знайшов, що буфер Sublime Text мене врятував - якщо я працюю над чим-то, то випадково видаляю все, намагаючись вирішити подібну проблему до цього або за допомогою відповідь на це питання і відкриття файлів у Sublime (у них є хороші шанси), то файли все ще будуть там, Sublime, або саме там, або в історії скасування - Toni Leigh
git reset --hard origin/branch_to_overwrite - Andrew Atkinson


Відповіді:


Важливо: якщо у вас є місцеві зміни, вони будуть втрачені. З або без --hard варіант, будь-які місцеві зобов'язання, які не були висунуті, будуть втрачені.[*]

Якщо у вас є будь-які файли, які є ні Відстежується Git (наприклад, завантажений користувацький вміст), ці файли не будуть зачіпатися.


Я думаю, що це правильний шлях:

git fetch --all

Тоді у вас є два варіанти:

git reset --hard origin/master

АБО Якщо ви перебуваєте на іншій гілці:

git reset --hard origin/<branch_name>

Пояснення:

git fetch Завантажує останню версію з віддаленого, не намагаючись об'єднати чи перезавантажити що-небудь.

Тоді git reset скидає основну гілку на те, що ви тільки що отримали. The --hard параметр змінює всі файли у вашому робочому дереві, щоб вони співпали з файлами origin/master


Підтримувати поточні місцеві зобов'язання

[*]: Варто зазначити, що можна зберегти поточні місцеві повноваження, створивши відділення master перед скиданням:

git checkout master
git branch new-branch-to-save-current-commits
git fetch --all
git reset --hard origin/master

Після цього всі старі зобов'язання зберігатимуться new-branch-to-save-current-commits.

Невстановлені зміни

Однак нездійснені зміни (навіть поетапні) будуть втрачені. Переконайтеся, що ви втамуєте і зробите все, що вам потрібно. Для цього можна запустити наступне:

git stash

І потім повторно застосувати ці незв'язані зміни:

git stash pop

7301
2018-01-17 00:02



Стережись! Якщо у вас є місцеві невимушені корективи, це призведе до їх видалення з вашого відділення! Це рішення зберігає невідслідувані файли, які не зберігаються в сховищі, але перезаписують все інше. - Matthijs P
Це популярне запитання, тому я хотів би проілюструвати головний коментар тут. Я просто виконував команди, як описано в даній відповіді, і не видалив ВСІ локальні файли. Файли віддалено відстежувалися були перезаписані, і кожен локальний файл, який був тут, залишився недоторканим. - Red
Це працювало для мене, і мої локальні файли НЕ видалялись. - Tastybrownies
у випадку, якщо ви потягнете від репо, що має назву віддаленої гілки, відмінної від "master", скористайтеся git reset --hard origin/branch-name - Nerrve
Враховуючи кількість звернень до цього питання та відповіді, я думаю, що git має включати таку команду, як git pull -f - Sophivorus


Спробуйте це:

git reset --hard HEAD
git pull

Це має робити те, що ви хочете.


761
2018-05-09 19:45



Я зробив це, і деякі локальні файли, які більше не були в репо, були залишені на диску. - Piotr Owsiak
Я не думаю, що це правильно. Вище виконане злиття, а не перезаписування, яке було запропоновано в питанні: "Як змусити гіт переписати їх?" У мене немає відповідей, я зараз її шукаю .. в той момент, коли я перемикаюсь на філію разом з кодом, яким я хочу зберегти "git checkout BranchWithCodeToKeep", потім виконайте "гітарний гілок -D BranchToOverwrite", а потім, нарешті, "git checkout -b BranchToOverwrite". тепер ви отримаєте точний код від BranchWithCodeToKeep на гілці BranchToOverwrite, не виконуючи злиття. - felbus
замість об'єднання використовуючи 'git pull', спробуйте git fetch - все, за яким слідує 'git resethard origin / master' - Lloyd Moore
Так, рішення @lloydmoore працювало для мене. Може бути з тим, щоб бути відповіддю, а не просто коментарем. - Max Williams
Це призведе до скидання поточних змін назад до останнього приєднання філії. Тоді git pull об'єднує зміни з останньої гілки. Це зробило саме те, що я хотів це зробити .. Спасибі! - Codeversed


УВАГА: git clean видаляє всі ваші невідслідувані файли / каталоги, і їх не можна скасувати.


Іноді просто clean -f не допомагає У випадку, якщо у вас є невідслідувані директорії, також потрібен параметр -d:

git reset --hard HEAD
git clean -f -d
git pull

УВАГА: git clean видаляє всі ваші невідслідувані файли / каталоги, і їх не можна скасувати.


381
2018-03-19 09:10



Приголомшливий ... Випробував це проти моїх реппотонів ... У моєму домашньому каталозі. Добре, що я насправді не мав нічого важливого там ... - Lauri
Я думаю, що опис сценарію дає зрозуміти, що він дійсно не хоче скинути вміст. Швидше за все, що він хоче, це зупинити перекручування файлів. @ Лаурі, це не повинно було статися з вами. На жаль, люди, здається, неправильно розповіли суть опису сценарію - див. Мою пропозицію. - Hedgehog
ЗАВЖДИ. git clean -f-d зручно, коли робити чистий не вдається все чистити. - earthmeLon
@ crizCraig, якщо вони не додані .gitignore - Bleeding Fingers
@ earthmeLon, для чого ви можете захотіти git clean -dfx. The -x ігнорує Зазвичай ваші продукти збирання будуть в гігієнічному режимі. - Paul Draper


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

Спочатку внесіть свої зміни

 git add *
 git commit -a -m "local file server commit message"

Потім витягніть зміни та перезаписайте, якщо є конфлікт

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" - це назва параметра, а "theirs" - це значення для цієї опції. Ви вирішили використовувати "свої" зміни, а не "ваші" зміни, якщо є конфлікт.


335
2018-04-11 20:13



Це найкраща відповідь, яку я бачив до цих пір. Я не пробував, але, на відміну від інших відповідей, це не намагається знешкодити всі ваші невідсліднені файли, що є дуже небезпечним з очевидних причин. - huyz
Так само - це працювало для мене при дуже великому злитті (запит на вилучення GitHub), де я просто хотів прийняти все це на вершині того, що маю. Гарна відповідь! У моєму випадку останні дві команди були: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - quux00
Питання: Що таке -X? Що таке "їх"? - AlxVallejo
Це дозволить перезаписати будь-які конфлікти з файлами сховищ, а не з вашими локальними, правильно? - Nathan Fiscaletti
"-X" - це назва параметра, а "theirs" - це значення для цієї опції. Ви вирішили використовувати "свої" зміни, а не "ваші" зміни, якщо є конфлікт. - Richard Kersey


Замість того, щоб робити:

git fetch --all
git reset --hard origin/master

Я радив би зробити наступне:

git fetch origin master
git reset --hard origin/master

Не потрібно завантажувати всі пульти та відгалуження, якщо ви збираєтеся скинути до джерела / майстер галузі належним чином?


237
2018-04-26 13:48



Ваша відповідь - це те, що вам потрібно для вашої репутації. Я повинен запитати, чи також видаляє всі нерозбиті файли? - Nicolas De Jay
Так, більша частина моєї репутації приходить звідси :) Це також видаляє всі нерозбиті файли. Щось я забув і болісно нагадав про це всього 2 дні тому ... - Johanneke
Див коментар на цю іншу відповідь: stackoverflow.com/a/8888015/2151700 - Johanneke
Це не призвело до видалення моїх не відстежуваних файлів; що насправді те, що я очікував би. Чи є причина для деяких людей, а не для інших? - arichards
Не відстежені файли не впливають на відновлення git. Якщо ви хочете, щоб їх також було видалено, виконайте git add . по-перше, раніше git reset --hard - Johanneke


Схоже, найкращий спосіб зробити це:

git clean

Видалити всі нерозбиті файли, а потім продовжити звичайний git pull...


122
2017-07-14 15:16



Я спробував використовувати "git clean", щоб вирішити одну й ту ж проблему, але це не дозволило. Git статус говорить: "Ваша філія та" origin / master "розходяться, # і мають 2 і 9 різних зобов'язань відповідно до кожного". і гіт тягне каже щось подібне до того, що ви маєте вище. - slacy
git clean - це досить тупий інструмент, і він може викинути багато речей, які ви хочете зберегти. Краще видалити чи перейменувати файли, про які гіт скаржиться, доки не досягне успіху. - Neil Mayhew
Я не думаю, що це працює взагалі. Чи не існує спосіб зробити це в основному віддаленим клоном git за допомогою примусового виводу? - mathtick
@mathick: git fetch origin && git reset --hard origin/master - Arrowmaster
Є git clean найкраща відповідь тут? Здається, видалення файлів не обов'язково те, що бажає ОП. Вони попросили "перезаписати локальні файли" не видалення. - JohnAllen


Попередження, якщо це зробити, буде назавжди видалити ваші файли, якщо у вашому файлі gitignore є записи каталогу / *.

Деякі відповіді, здається, страшні. Грозний в сенсі того, що сталося з @ Lauri, дотримуючись пропозиції David Avsajanishvili.

Швидше (git> v1.7.6):

git stash --include-untracked
git pull

Пізніше ви зможете очистити історію витівки.

Вручну, один за одним:

$ git stash list
stash@{0}: WIP on <branch>: ...
stash@{1}: WIP on <branch>: ...

$ git stash drop stash@{0}
$ git stash drop stash@{1}

Жорстоко, все-одно-час:

$ git stash clear

Звичайно, якщо ви хочете повернутись до того, що ви поставили:

$ git stash list
...
$ git stash apply stash@{5}

97
2018-02-11 23:00



Ні, я так не думаю. Stashing просто переміщує непотрібні файли поза способом. Вищевикладене також переміщує (стискає) файли, які git не відстежує. Це запобігає видаленню файлів, доданих на пульт дистанційного керування, які ще не потягнуті до вашої машини, але які ви створили (!). Все, не руйнуючи нездійсненну роботу. Надія, що має сенс? - Hedgehog
Якщо у вас немає 1.7.6, ви можете імітувати --include-untracked просто тимчасово git add- віддай всю репо, а потім негайно припини її. - nategood
Я згоден з Їжачем. Якщо ви користуєтеся популярними відповідями тут, ви, швидше за все, знайдете, що ви навмисно вбив багато речей, які ви дійсно не хотіли втрачати. - Guardius
У мене були інші не відстежувані файли - окрім того, який злиття / тягнення хотів переписати, таким чином це рішення працювало найкраще. git stash apply повернув всі мої не відстежувані файли, за винятком (правильно) тих, які злиття вже було створено: "вже існує, ніякої перевірки". Працював чудово. - BigBlueHat
Це найчистіший відповідь, і він повинен бути прийнятий. Щоб зберегти деякий тип набору, можна скористатися короткою формою: git stash -u. - ccpizza


Ви можете виявити, що ця команда допомагає викинути локальні зміни:

git checkout <your-branch> -f

А потім виконайте очищення (видаляє невідсліднені файли з робочого дерева):

git clean -f

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

git clean -fd

86
2017-08-05 18:06



Я думаю, що опис сценарію дає зрозуміти, що він дійсно не хоче скинути вміст. Швидше за все, що він хоче, це зупинити перекручування файлів. Дивіться мою пропозицію. - Hedgehog
Хоча ця відповідь може не відповідати саме опису, вона все-таки врятувала мене від фрустрації git twiddling з поверненням каретки (подія з autocrlf false). Коли git reset - hard HEAD не залишить вас "ні" модифікованими файлами, ці "-f" прапори цілком корисні. Спасибі купу. - Kellindil


Замість того, щоб злитися з git pull, спробуйте це:

git fetch --all

а потім:

git reset --hard origin/master.


72
2017-11-22 10:56





Єдине, що працювало для мене, було:

git reset --hard HEAD~5

Це приведе вас до п'яти зобов'язань, а потім - до

git pull

Я знайшов це, дивлячись вгору Як відмінити з'єднання Git.


51
2018-05-05 21:53



Це було те, що в кінцевому підсумку працювало для мене, оскільки я мав силу, підштовхнув мою гілку до джерела репо та продовжував стикатися з конфліктами, намагаючись витягнути його до моєї віддаленої репо .. - jwfrench
Привіт, насправді це трюк для work around але дійсно ефективний. Оскільки деякі конфлікти можуть відбутися лише за декількох завдань, то повернення 5 коміктів забезпечить конфлікти з віддаленим кодом. - Hoang Le