Как заставить git pull перезаписывать локальные файлы?

Как принудительно перезаписать локальные файлы на git pull?

Сценарий следующий:

  • Член команды изменяет шаблоны для веб-сайта, над которым мы работаем.
  • Они добавляют некоторые изображения в каталог изображений (но забывают добавить их в систему управления версиями)
  • Они присылают изображения по почте, позже мне
  • Я добавляю изображения в систему управления версиями и отправляю их в GitHub вместе с другими изменениями.
  • Они не могут получать обновления с GitHub, потому что Git не хочет перезаписывать их файлы.

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

ошибка: неотслеживаемый файл рабочего дерева 'public / images / icon.gif' будет перезаписан слиянием

Как заставить Git перезаписать их? Этот человек является дизайнером - обычно я разрешаю все конфликты вручную, поэтому на сервере установлена ​​самая последняя версия, которую ему просто нужно обновить на своем компьютере.


person Jakub Troszok    schedule 14.07.2009    source источник
comment
любой, кто читает это и думает, что может потерять файлы, я был в этом положении и обнаружил, что буфер Sublime Text спас меня - если я над чем-то работаю, то случайно удалите все, пытаясь решить аналогичную проблему или используя ответ на этот вопрос и если файлы были открыты в Sublime (что есть хороший шанс), тогда файлы все еще будут там Sublime, либо просто там, либо в истории отмены   -  person Toni Leigh    schedule 20.01.2016
comment
в основном, извлекайте из develop только после первоначальной проверки -b. сделай свою работу, а затем вернись.   -  person ldgorman    schedule 22.08.2018
comment
Краткий ответ: удалить и заново создать ветку. 1. Удалить ветку: git branch <branch> -D 2. Сбросить до фиксации до конфликта: git reset <commit> --hard 3. Повторно создать ветку: git branch <branch> 4. Установить отслеживание на сервере: git --set-upstream-to=origin/<branch> <branch> 5. Pull: git pull`   -  person Nino Filiu    schedule 24.09.2018
comment
Чтобы изменить все окончания CRLF на LF, (начать с чистого листа) git config core.autocrlf false; git ls-files -z | xargs -0 rm; git checkout .   -  person Chloe    schedule 17.01.2019
comment
Вместо этого вы можете искать этот вопрос: вместо этого stackoverflow.com/q/1628088/1148030 Сбросьте ветку локального репозитория, чтобы она была просто например, HEAD удаленного репозитория. Например, если пульт был принудительно нажат, и вы хотите вытащить его и отбросить предыдущее воплощение ветки, которая у вас есть. (Некоторые другие вопросы указывают на этот вопрос как на их дубликат, но я думаю, что им следует указать на этот другой вопрос.)   -  person Peter Lamberg    schedule 31.03.2020
comment
Вручную удалите все файлы и папки из локального репозитория. Затем запустите git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull. См. stackoverflow.com/a/65239330.   -  person Henke    schedule 08.01.2021
comment
На это определенно есть ответ, потому что я сделал это случайно. Сейчас много недель работы ушло :(   -  person Ben Alan    schedule 10.01.2021


Ответы (49)


⚠ Важно: если у вас есть какие-либо локальные изменения, они будут потеряны. С параметром --hard или без него любые локальные коммиты, которые не были отправлены, будут потеряны. [*]

Если у вас есть какие-либо файлы, которые не отслеживаются Git (например, загруженный пользовательский контент), эти файлы не будут затронуты.


Сначала запустите выборку, чтобы обновить все origin/<branch> ссылки до последних:

git fetch --all

Сделайте резервную копию вашей текущей ветки:

git branch backup-master

Тогда у вас есть два варианта:

git reset --hard origin/master

ИЛИ Если вы находитесь в другой ветке:

git reset --hard origin/<branch_name>

Объяснение:

git fetch загружает последнюю версию с удаленного компьютера, не пытаясь ничего объединить или переустановить.

Затем git reset сбрасывает главную ветвь на то, что вы только что выбрали. Параметр --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
person RNA    schedule 17.01.2012
comment
Осторожно! Если у вас есть локальные неопубликованные коммиты, они будут удалены из вашей ветки! Это решение сохраняет неотслеживаемые файлы не в репозитории, а перезаписывает все остальное. - person Matthijs P; 17.05.2012
comment
Это популярный вопрос, поэтому я хотел бы уточнить верхний комментарий здесь. Я просто выполнил команды, описанные в этом ответе, и не удалил ВСЕ локальные файлы. Были перезаписаны только удаленно отслеживаемые файлы, и каждый локальный файл, который был здесь, остался нетронутым. - person Red; 22.11.2012
comment
Я потерял все локальные коммиты, которых не было в origin/master дереве после перебазирования. Здесь очень возможно прострелить себе ногу. - person Cuadue; 23.11.2013
comment
Вы также можете сделать это для ветки отслеживания, если у вас одна и та же ветка в источнике и локально, просто измените git reset --hard origin / master на git reset --hard origin / (ветка) - person Joshua Kolden; 14.12.2013
comment
если вы используете репо, имя удаленной ветки которого отличается от имени master, используйте git reset --hard origin/branch-name - person Abbas Gadhia; 17.12.2013
comment
Это должен быть принятый ответ. У меня отлично работает. Я предполагаю, что здесь предполагается, что у вас нет локальных коммитов, что в моем случае хорошо, поскольку у локального есть только ключ развертывания. - person Ardee Aram; 07.04.2014
comment
Разве это не отбросит мои локальные коммиты? Я хочу сохранить свои коммиты и перезаписать только неотслеживаемые / незафиксированные изменения. - person mcv; 02.05.2014
comment
Я просто использую git fetch, чтобы получить ветку восходящего потока, а затем сбрасываю, когда мне нужно исправить кучу файлов. Вы можете получить восходящую ветку с помощью git branch -vv - person Natus Drew; 18.08.2014
comment
@mcv Чтобы сохранить ваши локальные коммиты, вам нужно git reset --hard HEAD, за которым вы могли бы следовать git merge origin/master. - person joeytwiddle; 19.08.2014
comment
Учитывая количество положительных отзывов на этот вопрос и ответ, я думаю, что git должен включать такую ​​команду, как git pull -f - person Sophivorus; 26.08.2014
comment
Коммиты, которые не были нажаты до аппаратного сброса, могут быть восстановлены с помощью git reflog, в котором перечислены все коммиты, в том числе без базы. Пока вы не очистите локальную копию с помощью git gc, все потеряно - person Koen.; 11.02.2015
comment
Удалит ли это файлы, которые у меня есть .gitignore'd? - person user3817250; 01.04.2015
comment
@FelipeSchenone На самом деле есть git pull -f, но он не делает того, что мы все хотим от него. - person sudo; 01.05.2015
comment
Чтобы быть правильным, незавершенные изменения теряются, но старые коммиты болтаются, ожидая сборки мусора. Вы все еще можете увидеть их в git reflog и переместить свой HEAD обратно с помощью git reset --hard HEAD@{1}. - person Florian Fida; 29.05.2015
comment
Хочу указать здесь, что он также удалит любые изменения, сделанные в любой другой ветке, которая не отслеживается удаленно. Я потерял свою, надеюсь, другие будут осторожны. - person Devesh Khandelwal; 27.06.2015
comment
Сделайте резервную копию папки с вашими локальными файлами, включая папку .git. Теперь вы не можете ничего «потерять», если это исправление не сработает для вас; вы можете сделать еще одну копию и попробовать что-нибудь еще. Не работайте из одной папки и доверяйте git, как если бы это был 100% надежный инструмент резервного копирования. Одна опечатка, особенно в стране веток, может обернуться кошмаром. Я предлагаю сделать резервную копию старой школы для папок tar.gz, а затем запустить git из последней копии. - person JosephK; 13.08.2015
comment
@Red Да, если вы хотите удалить все неотслеживаемое, даже игнорируемое, используйте git clean -dxf после жесткого сброса. - person IceGlow; 31.12.2015
comment
Я сделал это, и мои локальные изменения НЕ были отброшены - что прискорбно, потому что я надеялся, что они будут! Кто-нибудь знает, как это сделать, но также заставит git отменить любые изменения локали, которых нет в удаленной ветке? По сути, мне нужно ТОЧНОЕ, однозначное соответствие с удаленной веткой. - person Gershy; 04.01.2016
comment
Малоизвестный факт - вы можете создать резервную копию всего репозитория git с помощью старого доброго tar -czf myrepodir.tar.gz myrepodir/.. Если ваше репо испортилось из-за странностей git, удалите его и восстановите из файла tar.gz, чтобы ДЕЙСТВИТЕЛЬНО вернуться туда, где вы были до того, как попробовали этот злополучный эксперимент. Просто убедитесь, что у вас есть . после myrepodir/, иначе ваши .git и другие скрытые файлы не будут сохранены! - person Buttle Butkus; 06.02.2016
comment
может ли этот метод работать с отдельными файлами? например -- index.php helpers.js ect. вместо --all? - person Steve C; 09.09.2016
comment
у меня не сработало. пробовал это решение, пробовал git clean -dfx. пробовал git pull -f. все еще есть то же сообщение об ошибке. - person InsOp; 04.10.2016
comment
Обратите внимание, что вы можете сократить имя ветки до @{u}, что намного короче. - person Antimony; 06.06.2017
comment
@GershomMaes git clean -dfx после аппаратного сброса, как упоминалось выше IceGlow? - person Franklin Yu; 23.03.2018
comment
не проще ли просто rm -rf / folder и снова выполнить git clone, если вы хотите отменить все свои локальные изменения? - person JonB; 04.10.2018
comment
При использовании git clean -dffx обязательно запускайте его из каталога верхнего уровня проекта git. Рекомендуется сначала запустить git clean -ndffx, чтобы перечислить файлы перед их удалением, поскольку -x удаляет файлы, которые имеют .gitignored и не отображаются git status - person Josiah Yoder; 22.04.2019
comment
@JonB: не проще ли просто создать папку rm -rf / и снова выполнить git clone ...? Сюда меня привело (даже не слишком) большое репо + низкая пропускная способность. Я бы хотел просто клонировать снова, но в первый раз это было достаточно болезненно, поэтому я один из тех, кто ищет более быстрое решение. - person Sz.; 11.07.2019
comment
работал у меня, когда исходная ветка содержала обновления, такие как переименование файлов с общего на общий. В Windows это не имеет значения, поэтому такой подход меня разблокировал. - person Someone Somewhere; 08.08.2019
comment
У Mecurial есть hg update, но в git нет эквивалента ... - person Jack; 11.03.2020
comment
Было бы более последовательным, если бы вы могли сделать git pull --force, и он просто перезаписал бы вашу локальную ветку. Увидев, что вы можете сделать обратное, перезаписав пульт на git push --force - person Jonny; 12.03.2020
comment
Потерял все мои локальные коммиты с вашими предложенными командами. - person Sylvain Rodrigue; 17.08.2020
comment
Обратите внимание, что основная ветвь теперь по умолчанию называется основной веткой, поэтому обратите внимание на копипастеры, так как эта команда может больше не работать. - person Matt; 27.10.2020
comment
извиняюсь. Слишком сложно. Вместо этого просто удалите и снова клонируйте ... - person Niclas; 05.12.2020
comment
Если вы запустите git checkout -b backup-master, вы должны вернуться в свою ветку (master в примере) перед запуском git reset. В противном случае вы можете использовать git branch backup-master вместо этого, чтобы создать резервную ветку, но остаться в master. - person Karim Sonbol; 11.12.2020
comment
После этого у меня фатальная ошибка: не удалось найти удаленного мастера ссылок, когда я делаю git pull origin master - person G M; 14.04.2021

Попробуй это:

git reset --hard HEAD
git pull

Он должен делать то, что вы хотите.

person Travis Reeder    schedule 09.05.2010
comment
Я сделал это, и некоторые локальные файлы, которых больше не было в репо, остались на диске. - person Piotr Owsiak; 08.04.2011
comment
Не думаю, что это правильно. приведенное выше будет выполнять слияние, а не перезапись, как это было запрошено в вопросе: как заставить git перезаписать их? У меня нет ответа, я сейчас его ищу ... сейчас я переключаюсь на ветку с кодом, который хочу сохранить git checkout BranchWithCodeToKeep, затем делаю git branch -D BranchToOverwrite и, наконец, git checkout -b BranchToOverwrite. теперь у вас будет точный код из BranchWithCodeToKeep в ветке BranchToOverwrite без необходимости выполнять слияние. - person felbus; 13.07.2011
comment
вместо объединения с помощью git pull попробуйте git fetch --all, а затем git reset --hard origin / master - person Lloyd Moore; 21.02.2012
comment
Предложение Ллойда Мура правильное, но имейте в виду, что оно может удалить локальные неопубликованные коммиты из вашей ветки. - person Matthijs P; 17.05.2012
comment
да, решение @lloydmoore сработало для меня. Может быть, это ответ, а не просто комментарий. - person Max Williams; 19.11.2012
comment
Это приведет к сбросу текущих изменений обратно к последней извлеченной фиксации ветки. Затем git pull объединяет изменения из последней ветки. Это сделало именно то, что я хотел ... Спасибо! - person Codeversed; 05.12.2014
comment
Это испортит пульт? - person user1767754; 30.09.2015
comment
Хороший ответ, но, пожалуйста, добавьте подробностей, я имею в виду, что некоторые люди могут ничего не знать о сбросе и потерять свои файлы ... - person Mohammad Kermani; 17.01.2017
comment
@Travis R, не могли бы вы объяснить цель git rest --hard HEAD? - person Imanez; 06.03.2017
comment
git reset --hard HEAD в некоторых случаях не сбрасывает все - person Finesse; 06.03.2018
comment
Это в основном то, о чем я думаю, когда думаю о форсировании тяги. В основном после того, как я попробовал некоторые настройки - person Mianala Loharano; 04.07.2018
comment
не могли бы вы объяснить, что делает ваш код? (это всего 2 строки) - person Charlie Parker; 31.03.2021

ВНИМАНИЕ: git clean удаляет все неотслеживаемые файлы / каталоги и не может быть отменено.


Иногда просто clean -f не помогает. Если у вас нет отслеживаемых КАТАЛОГОВ, также необходима опция -d:

# WARNING: this can't be undone!

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

ВНИМАНИЕ: git clean удаляет все неотслеживаемые файлы / каталоги и не может быть отменено.

Сначала рассмотрите возможность использования флага -n (--dry-run). Это покажет вам, что будет удалено без фактического удаления ничего:

git clean -n -f -d

Пример вывода:

Would remove untracked-file-1.txt
Would remove untracked-file-2.txt
Would remove untracked/folder
...
person David Avsajanishvili    schedule 19.03.2011
comment
Вы можете указать git clean аргумент пути, чтобы быть более конкретным и избежать удаления неотслеживаемых файлов, которые не конфликтуют. - person joachim; 18.10.2011
comment
Я думаю, что описание сценария дает понять, что он на самом деле не хочет выбрасывать контент. Скорее он хочет, чтобы git отказывался от перезаписи файлов. @ Лаури, этого не должно было случиться с тобой. К сожалению, люди, кажется, неправильно поняли суть описания сценария - см. Мое предложение. - person Hedgehog; 12.02.2012
comment
НАКОНЕЦ. git clean -f -d удобен, когда make clean не может очистить все. - person earthmeLon; 23.06.2012
comment
Если вы хотите синхронизировать весь каталог с удаленным репо, это правильный вариант. - person Johannes Ewald; 11.02.2013
comment
@crizCraig, если они не добавлены в .gitignore - person Bleeding Fingers; 13.06.2013
comment
@BleedingFingers Затем добавьте -x. Но существующие файлы, которые охвачены .gitignore, не должны быть проблемой: предполагая, что другие участники этого репо используют тот же файл .gitignore, запрос не получит никаких коммитов, которые добавляют конфликтующие файлы. - person ; 07.06.2015
comment
@earthmeLon, для этого вам может понадобиться git clean -dfx. -x игнорирует .gitignore. Обычно ваши продукты сборки будут в .gitignore. - person Paul Draper; 12.08.2015
comment
Может быть хорошо сначала запустить git clean -nfd, который только показывает то, что будет удалено до того, как это будет сделано, то есть до того, как вы столкнетесь с проблемами. :-) - person Velda; 16.08.2018

Как и Ежик, я думаю, что ответы ужасны. Но хотя ответ Ежика мог бы быть лучше, я не думаю, что он настолько элегантен, насколько мог бы быть. Я нашел способ сделать это, используя fetch и merge с определенной стратегией. Это должно сделать так, чтобы ваши локальные изменения сохранялись до тех пор, пока они не являются одним из файлов, которые вы пытаетесь принудительно перезаписать.

Сначала сделайте фиксацию ваших изменений

 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 - значение этой опции. Вы решили использовать their изменений (другой вариант - ours изменений) в случае конфликта.

person Richard Kersey    schedule 11.04.2012
comment
Это лучший ответ, который я когда-либо видел. Я не пробовал, но, в отличие от других ответов, он не пытается уничтожить все ваши неотслеживаемые файлы, что очень опасно по очевидным причинам. - person huyz; 07.05.2012
comment
То же самое - это сработало для меня при выполнении очень большого слияния (запрос на вытягивание GitHub), когда я просто хотел принять все это поверх того, что у меня было. Хороший ответ! В моем случае последние две команды были: 1) get fetch other-repo; 2) git merge -s recursive -X theirs other-repo/master - person quux00; 27.07.2012
comment
Это перезапишет любые конфликты с файлами репозиториев, а не с вашими локальными, правильно? - person Nathan F.; 05.12.2014
comment
Лучший ответ. Самый высокий принятый ответ оставил меня в моем случае оторванной головой. Я снова переключился на локальную главную ветку и запустил git merge -X theirs origin/master - person petergus; 11.03.2016
comment
Пробовал это - затем добавлял / фиксировал мои новые измененные файлы, но все же сказал, что моя ветка находилась за удаленным, когда я пытался нажать. Потрачено огромное количество времени, потому что git pull не запрашивает перезапись локального? д / н / все. - person JosephK; 26.07.2016
comment
Подождите ... не имеет git add * и git commit -a <more-options-here> одинакового эффекта? Зачем вам и то, и другое? - person Marcel Stör; 25.04.2017
comment
@ MarcelStör, вам не нужны оба, но они тоже не делают то же самое. git commit -a влияет только на файлы, которые уже отслеживаются; git add * добавит файлы, которые не отслеживаются. Итак, если вы сделаете git commit -a, новые файлы не будут обнаружены, тогда вам, возможно, придется сделать git add позже, но если вы сделаете git add *, вам не понадобится -a в фиксации. - person briantist; 04.04.2018
comment
Проблема с этим (отличным) ответом заключается в том, что он добавляет все локальные файлы, которые иногда могут быть не такими, как вы хотите. Вы можете просто добавить определенные файлы, которые были пропущены. Но самое лучшее в этом то, что он заставляет его делать то, что он должен был сделать, - добавлять их локально. Скорее всего, вам не понадобится их стратегия -X, поскольку это один и тот же образ. Фактически, я бы посоветовал сначала оставить его, просто чтобы узнать, есть ли какие-либо аномалии, и добавить его, если они есть, после проверки того, что «их» всегда правильный выбор. Но тогда я параноик. - person Bob Kerns; 28.06.2018
comment
я просто хотел долбанный мерзавец, чтобы перезаписать все и заткнуться. в конце концов, я просто использую его между моим рабочим компьютером и некоторыми системами Raspberry Pi. Желая иметь возможность принудительной перезаписи, по крайней мере, для руководителя проекта - person clockw0rk; 05.06.2019
comment
после попытки этой команды я по-прежнему получаю ту же ошибку. Не отслеживаемые файлы рабочего дерева будут перезаписаны слиянием, и длинный, но неполный список файлов, которые я не могу просто принудительно перезаписать. - person Patrick Parker; 02.10.2020
comment
хммм ... может быть, сначала попробуй git add . - person Richard Kersey; 05.10.2020

Вместо того, чтобы делать:

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

Я бы посоветовал сделать следующее:

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

Не нужно извлекать все пульты и ветки, если вы собираетесь выполнить сброс на исходную / главную ветку, верно?

person Johanneke    schedule 26.04.2013
comment
Ваш ответ - именно то, что вам нужно для вашей репутации. Я должен спросить, удаляются ли также все неотслеживаемые файлы? - person Nicolas De Jay; 07.01.2014
comment
Да, большая часть моего представителя приходит отсюда :) Это также удалит все неотслеживаемые файлы. То, что я забыл и о чем болезненно вспомнил всего 2 дня назад ... - person Johanneke; 09.01.2014
comment
См. Комментарии к этому другому ответу: stackoverflow.com/a/8888015/2151700 - person Johanneke; 09.01.2014
comment
Это не удалило мои неотслеживаемые файлы; что на самом деле то, что я ожидал. Есть ли причина, по которой это может быть для одних людей, а для других - нет? - person arichards; 19.04.2016
comment
На неотслеживаемые файлы git reset не влияет. Если вы хотите, чтобы они также были удалены, сделайте сначала git add ., а затем git reset --hard - person Johanneke; 15.08.2017
comment
Это именно то, что мне было нужно: что-то, что перезаписывает неотслеживаемые файлы, существующие на пульте дистанционного управления, и оставляет все остальное нетронутым. - person Ledazinha; 21.12.2017
comment
это сработало очень хорошо - person Wilson; 18.06.2021
comment
master больше не является политически корректным, git теперь предпочитает main. - person Rick Graves; 26.06.2021

Похоже, что лучше всего сначала сделать:

git clean

Чтобы удалить все неотслеживаемые файлы, а затем продолжить обычным _2 _...

person Jakub Troszok    schedule 14.07.2009
comment
Я попытался использовать git clean для решения той же проблемы, но это не помогло. git status говорит, что ваша ветка и origin / master разошлись, # и имеют 2 и 9 разных фиксаций соответственно. и git pull говорит что-то похожее на то, что у вас выше. - person slacy; 24.09.2009
comment
не нужно ли ему переходить на основную ветку, а затем делать git clean, чтобы она работала? Затем он может вернуться к той ветке разработки, в которой он работал. - person suitedupgeek; 26.01.2010
comment
@slacy: Затем вам нужно объединить две ветки. - person Xiong Chiamiov; 05.02.2010
comment
git clean - довольно грубый инструмент, и он может выбросить много вещей, которые вы, возможно, захотите оставить. Лучше удалить или переименовать файлы, на которые git жалуется, пока извлечение не завершится успешно. - person Neil Mayhew; 02.07.2010
comment
Я не думаю, что это вообще работает. Разве нет способа сделать в основном удаленное клонирование git с помощью принудительного git pull? - person mathtick; 29.11.2010
comment
@mathick: git fetch origin && git reset --hard origin/master - person Arrowmaster; 23.02.2011
comment
Мне нужно было добавить -x к этому git clean, чтобы заставить его работать для меня, по какой-то причине (-d по какой-то причине не удалял каталог .ideas), но это определенно устранило мою проблему. - person Owen Blacker; 19.12.2011
comment
Избегайте внезапной остановки сердца: сначала используйте git clean -n - person doub1ejack; 30.07.2013
comment
git clean лучший ответ здесь? Похоже, удаление файлов - это не обязательно то, что хочет OP. Они просили «перезапись локальных файлов», а не удаление. - person JohnAllen; 04.03.2014
comment
git clean сам по себе, похоже, не помогает, решение @Arrowmaster ближе, но лучшее решение Ллойда Мура в следующем ответе. - person Neil Monroe; 11.06.2015
comment
Никогда не делайте ничего "git" (или даже не создавайте папку .git), кроме как в копии вашей реальной рабочей папки, и избегайте любого сердечного стресса. Не давайте git и его тупому синтаксису / методам возможность разрушить вас в первую очередь. - person JosephK; 26.07.2016

Внимание! Это приведет к безвозвратно удалите файлы, если в вашем файле gitignore есть записи directory / *.

Некоторые ответы кажутся ужасными. Ужасно в том смысле, что случилось с @Lauri после предложения Давида Авсаджанишвили.

Скорее (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}
person Hedgehog    schedule 11.02.2012
comment
Разве вы не предполагаете, что фиксация никогда не выполнялась? В моем случае я сделал несколько коммитов в свою локальную ветку, но хотел сбросить все обратно в удаленную ветку - person Lee Francis; 20.03.2012
comment
Нет, я так не думаю. Stash просто убирает незафиксированные файлы. Вышеупомянутое также перемещает (сохраняет) файлы, которые git не отслеживает. Это предотвращает удаление файлов, которые были добавлены на пульт, но которые еще не были загружены на ваш компьютер, но которые вы создали (!). И все это без разрушения незавершенной работы. Надеюсь, это имеет смысл? - person Hedgehog; 21.03.2012
comment
Если у вас нет 1.7.6, вы можете имитировать --include-untracked, просто временно git add вставив все свое репо, а затем немедленно спрятав его. - person nategood; 02.05.2012
comment
Я согласен с Ежиком. Если вы ответите на популярные здесь ответы, вы, скорее всего, обнаружите, что случайно убили много вещей, которые на самом деле не хотели терять. - person Guardius; 01.02.2013
comment
У меня были и другие неотслеживаемые файлы - помимо того, который нужно было перезаписать при слиянии / извлечении, поэтому это решение сработало лучше всего. git stash apply вернул все мои неотслеживаемые файлы, за исключением (справедливо) тех, которые уже были созданы слиянием: уже существует, без проверки. Сработало отлично. - person BigBlueHat; 25.04.2013
comment
Это может быть самый простой способ непреднамеренно заблокировать репо, как и в случае с @Lauri, но хуже, потому что вы думаете, что защищаете файлы от удаления. Если у вас есть одно .gitignore правило, в котором есть подстановочный знак, поцелуйте их на прощание. Объяснение. - person Walf; 30.11.2016
comment
Это самый чистый ответ, и он должен быть принятым. Чтобы сэкономить время на вводе текста, вы можете использовать короткую форму: git stash -u. - person ccpizza; 23.03.2017
comment
Ссылка на git stash --include-untracked уничтожающие папки, которые gitignored, мертва - давайте найдем замену. Между тем, за комментарий @Waif о том, как этот ответ может уничтожить папки gitignore'd, следует проголосовать и, желательно, преобразовать его в новый ответ. GitLab у вас есть подробности. Я много использую git stash и был очень удивлен, узнав, что он может уничтожать файлы. - person RichVel; 15.04.2019

Эта команда может оказаться полезной для отбрасывания локальных изменений:

git checkout <your-branch> -f

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

git clean -f

Если вы хотите удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам:

git clean -fd
person Vishal    schedule 05.08.2010
comment
Я думаю, что описание сценария дает понять, что на самом деле он не хочет выбрасывать контент. Скорее он хочет, чтобы git отказывался от перезаписи файлов. Смотрите мое предложение. - person Hedgehog; 12.02.2012
comment
Хотя этот ответ может не соответствовать точно описанию, он все же спас меня от разочарования, связанного с git, который возился с возвратами каретки (событие с autocrlf false). Когда git reset --hard HEAD не оставляет вас без измененных файлов, эти флаги -f очень полезны. Огромное спасибо. - person Kellindil; 16.01.2013

Вместо слияния с git pull попробуйте следующее:

git fetch --all

с последующим:

git reset --hard origin/master.

person Lloyd Moore    schedule 22.11.2012

Единственное, что у меня сработало, это:

git reset --hard HEAD~5

Это вернет вас на пять коммитов, а затем с

git pull

Я обнаружил это, просмотрев как отменить слияние Git.

person Chris BIllante    schedule 05.05.2011
comment
Это было то, что в конечном итоге сработало для меня, поскольку я принудительно подтолкнул свою ветку к исходному репо и продолжал получать конфликты слияния при попытке вытащить его на мое удаленное репо .. - person jwfrench; 07.05.2014
comment
Привет, на самом деле это трюк для work around, но действительно эффективный. Поскольку некоторые конфликты могут возникнуть всего за несколько коммитов, возврат 5 коммитов гарантирует отсутствие конфликтов с удаленным кодом. - person Hoang Le; 21.11.2014

Проблема со всеми этими решениями заключается в том, что все они либо слишком сложны, либо, что еще более серьезная проблема, заключается в том, что они удаляют все неотслеживаемые файлы с веб-сервера, что нам не нужно, поскольку всегда есть необходимые файлы конфигурации, которые находятся на сервер, а не в репозитории Git.

Вот самое чистое решение, которое мы используем:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Первая команда извлекает самые свежие данные.

  • Вторая команда проверяет, есть ли какие-либо файлы, добавляемые в репозиторий, и удаляет эти неотслеживаемые файлы из локального репозитория, которые могут вызвать конфликты.

  • Третья команда проверяет все файлы, которые были локально изменены.

  • Наконец, мы делаем попытку обновления до последней версии, но на этот раз без каких-либо конфликтов, поскольку неотслеживаемые файлы, которые находятся в репозитории, больше не существуют, а все локально измененные файлы уже такие же, как в репозитории.

person Strahinja Kustudic    schedule 05.11.2012
comment
Использование git merge origin / master в качестве последней строки (как вы говорите в своей заметке) вместо git pull будет быстрее, поскольку вы уже удалили любые изменения из репозитория git. - person Josh; 06.05.2013
comment
Да, конечно, git merge origin/master будет быстрее и, возможно, даже безопаснее. Поскольку, если кто-то внес новые изменения во время удаления файлов этого сценария (что маловероятно, но возможно), все извлечение может завершиться неудачей. Единственная причина, по которой я поместил туда pull, заключается в том, что кто-то может работать не с основной веткой, а с какой-то другой веткой, и я хотел, чтобы сценарий был универсальным. - person Strahinja Kustudic; 02.09.2013
comment
Если у вас есть локально созданные файлы, такие как файлы опций, поместите их в .gitignore. - person Sebi; 21.11.2017

В первую очередь попробуйте стандартный способ:

git reset HEAD --hard # To remove all not committed changes!
git clean -fd         # To remove all untracked (non-git) files and folders!

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

Затем снова потяните.

Если описанное выше не поможет и вас не волнуют неотслеживаемые файлы / каталоги (на всякий случай сделайте резервную копию), попробуйте выполнить следующие простые шаги:

cd your_git_repo  # where 'your_git_repo' is your git repository folder
rm -rfv *         # WARNING: only run inside your git repository!
git pull          # pull the sources again

Это УДАЛЯЕТ все файлы git (исключение .git/ dir, где у вас есть все коммиты) и вытаскивает его снова.


Почему git reset HEAD --hard в некоторых случаях может выйти из строя?

  1. Собственные правила в .gitattributes file

    Наличие правила eol=lf в .gitattributes может привести к тому, что git изменит некоторые изменения файла, преобразовав концы строк CRLF в LF в некоторых текстовых файлах.

    В этом случае вы должны зафиксировать эти изменения CRLF / LF (просмотрев их в git status) или попробуйте: git config core.autcrlf false временно игнорировать их.

  2. Несовместимость файловой системы

    Когда вы используете файловую систему, которая не поддерживает атрибуты разрешений. Например, у вас есть два репозитория, один в Linux / Mac (_9 _ / _ 10_), а другой в файловой системе на основе FAT32 / NTFS.

    Как вы заметили, существует два разных типа файловых систем, поэтому та, которая не поддерживает разрешения Unix, в основном не может сбросить права доступа к файлам в системе, которая не поддерживает такого рода разрешения, поэтому независимо от того, как --hard вы пытаетесь, git всегда обнаруживает какие-то «изменения».

person kenorb    schedule 26.10.2012

У меня такая же проблема. Никто не дал мне этого решения, но у меня оно сработало.

Я решил это:

  1. Удалите все файлы. Оставьте только каталог .git.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Теперь это работает.

person John John Pichler    schedule 12.01.2011
comment
То же самое. Иногда работает только очень сложное решение, часто бывает, что одного сброса и очистки как-то не хватает ... - person jdehaan; 15.12.2011

Бонус:

Говоря о pull / fetch / merge в предыдущих ответах, я хотел бы поделиться интересным и продуктивным трюком,

git pull --rebase

Эта команда выше - самая полезная команда в моей жизни с Git, которая сэкономила много времени.

Прежде чем отправлять новый коммит на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения сервера (с помощью fetch + merge) и поместит вашу фиксацию наверху в журнале Git. Не нужно беспокоиться о ручном извлечении / слиянии.

Подробности см. В Что делает git pull --rebase?.

person Sazzad Hissain Khan    schedule 23.12.2015
comment
Вкратце: git pull -r. - person kenorb; 15.10.2019
comment
В моем случае, прежде чем это сделать, я должен был 1) git add -A, 2) git commit -m 3) и, наконец, git pull rebase. Спасибо. - person Pathros; 03.02.2021

У меня была похожая проблема. Пришлось сделать вот что:

git reset --hard HEAD
git clean -f
git pull
person Ryan    schedule 14.01.2011
comment
используйте git clean с осторожностью - person nategood; 30.03.2012

Обобщил другие ответы. Вы можете выполнить git pull без ошибок:

git fetch --all
git reset --hard origin/master
git reset --hard HEAD
git clean -f -d
git pull

Предупреждение. Этот сценарий очень мощный, поэтому вы можете потерять свои изменения.

person Robert Moon    schedule 07.08.2015
comment
Это перезапишет измененные файлы (файлы, которые были ранее отмечены) и удалит неотслеживаемые файлы (файлы, которые никогда не были возвращены). Именно то, что я искал, спасибо! - person styfle; 03.03.2016
comment
Я подозреваю, что третья строка git reset --hard HEAD может быть избыточной; моя локальная страница руководства (2.6.3) говорит, что reset во второй строке git reset --hard origin/master по умолчанию имеет значение HEAD во всех формах. - person arichards; 19.04.2016
comment
@arichards Я думаю, что ваш подозреваемый прав, но если вторая строка не будет работать (по какой-либо причине), третья строка будет хорошо сброшена. Это решение не требует оптимизации. Я просто обобщил другие ответы. Это все. Спасибо за ваш комментарий. :) - person Robert Moon; 20.04.2016
comment
Спасибо за резюме. Эти шаги действительно мощные :) - person Glorian; 10.12.2020

Основываясь на моем собственном аналогичном опыте, решение, предложенное Страхиньей Кустудичем выше, безусловно, является лучшим. Как указывали другие, простой сброс настроек приведет к удалению всех неотслеживаемых файлов, которые могут включать в себя множество вещей, которые вы не хотите удалять, например файлы конфигурации. Что безопаснее, так это удалить только файлы, которые собираются добавить, и в этом отношении вы, вероятно, также захотите проверить любые локально измененные файлы, которые собираются обновить.

Имея это в виду, я обновил сценарий Кустудича, чтобы сделать именно это. Я также исправил опечатку (отсутствующую 'в оригинале).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull
person Rolf Kaiser    schedule 27.02.2013
comment
Использование git merge origin / master в качестве последней строки (как вы говорите в своей заметке) вместо git pull будет быстрее, поскольку вы уже удалили любые изменения из репозитория git. - person Josh; 06.05.2013
comment
Требуется проверка измененных файлов, поэтому это работает в 100% случаев. Я обновил свой скрипт этим давно, но забыл обновить и здесь. Я также использую его немного иначе, чем вы. Я проверяю файлы, которые имеют любые модификации, а не только M, поэтому он работает постоянно. - person Strahinja Kustudic; 02.09.2013

Я считаю, что есть две возможные причины конфликта, которые необходимо решать отдельно, и, насколько я могу судить, ни один из приведенных выше ответов не касается обоих:

  • Локальные файлы, которые не отслеживаются, необходимо удалить вручную (безопаснее) или, как предлагается в других ответах, git clean -f -d

  • Также необходимо удалить локальные коммиты, которых нет в удаленной ветке. ИМО, самый простой способ добиться этого: git reset --hard origin/master (замените 'master' на любую ветку, над которой вы работаете, и сначала запустите git fetch origin)

person tiho    schedule 12.12.2011

Похоже, что большинство ответов здесь сосредоточено на ветке master; однако бывают случаи, когда я работаю над одной и той же функциональной веткой в ​​двух разных местах и ​​хочу, чтобы перебазирование в одном из них отражалось в другом без особых перепрыгиваний.

На основе комбинации ответа РНК и ответ Торека на аналогичный вопрос, я придумал, что отлично работает:

git fetch
git reset --hard @{u}

Запустите это из ветки, и вы сбросите только локальную ветку до исходной версии.

Это также можно красиво поместить в псевдоним git (git forcepull):

git config alias.forcepull "!git fetch ; git reset --hard @{u}"

Или в вашем .gitconfig файле:

[alias]
  forcepull = "!git fetch ; git reset --hard @{u}"

Наслаждаться!

person JacobEvelyn    schedule 25.02.2014
comment
Этот ответ также хорош, потому что он работает независимо от того, в какой ветке вы находитесь! - person leafmeal; 11.09.2018

У меня была такая же проблема, и по какой-то причине даже git clean -f -d не справился. Вот почему: по какой-то причине, если ваш файл игнорируется Git (я полагаю, через запись .gitignore), он все еще беспокоится о перезаписи его более поздним pull, но чистым не удалит его, пока вы не добавите -x.

person Tierlieb    schedule 03.08.2011

Более простой способ:

git checkout --theirs /path/to/file.extension
git pull origin master

Это заменит ваш локальный файл файлом на git

person maximus 69    schedule 05.05.2015

Я знаю более простой и менее болезненный метод:

$ git branch -m [branch_to_force_pull] tmp
$ git fetch
$ git checkout [branch_to_force_pull]
$ git branch -D tmp

Вот и все!

person ddmytrenko    schedule 05.09.2015
comment
Я попытался сделать, как было предложено в этом ответе. НИКАКИХ ФАЙЛОВ из удаленного репозитория ВООБЩЕ НЕ было извлечено. На самом деле, это не очень удивительно, если подумать - в конце концов, там вообще нет ссылки на origin/<branch_to_force_pull>. - person Henke; 10.12.2020

Я просто решил это сам:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

где последняя команда дает список ваших локальных изменений. Продолжайте изменять ветку "tmp" до тех пор, пока она не станет приемлемой, а затем снова выполните слияние с мастером с помощью:

git checkout master && git merge tmp

В следующий раз вы, вероятно, сможете справиться с этим более чистым способом, просмотрев «git stash branch», хотя stash может вызвать у вас проблемы с первых нескольких попыток, поэтому сначала поэкспериментируйте с некритичным проектом ...

person Simon B.    schedule 03.12.2010

У меня странная ситуация, что ни git clean, ни git reset не работают. Мне нужно удалить конфликтующий файл из git index, используя следующий сценарий для каждого неотслеживаемого файла:

git rm [file]

Тогда я могу нормально тянуть.

person Chen Zhang    schedule 19.09.2011

Использовать:

git fetch --all

Затем, если вы находитесь в ветке master,

git reset --hard origin/master

еще

git reset --hard origin/master<branch_name>
person SUJITKUMAR SINGH    schedule 15.08.2019
comment
Последний фрагмент должен быть origin/<branch_name>, а не origin/master<branch_name>. - person Adrian; 13.11.2020

Просто делать

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

Таким образом, вы избегаете всех нежелательных побочных эффектов, таких как удаление файлов или каталогов, которые вы хотели сохранить, и т. Д.

person user2696128    schedule 19.10.2015
comment
Отлично. Первое использование checkout -f в ветке, из которой я хотел выполнить слияние, позволило избавиться от всех проблемных неотслеживаемых файлов. Затем я мог снова проверить свой пункт назначения и, наконец, без проблем слиться. - person Patrick Parker; 02.10.2020

Несмотря на исходный вопрос, основные ответы могут вызвать проблемы у людей, у которых есть аналогичная проблема, но которые не хотят терять свои локальные файлы. Например, см. Комментарии Al-Punk и crizCraig.

Следующая версия фиксирует ваши локальные изменения во временной ветке (tmp), проверяет исходную ветку (которая, как я предполагаю, master) и объединяет обновления. Вы можете сделать это с помощью stash, но я обнаружил, что обычно проще использовать подход ветвления / слияния.

git checkout -b tmp
git add *; git commit -am "my temporary files"
git checkout master

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

где мы предполагаем, что другой репозиторий - это origin master.

person Snowcrash    schedule 22.10.2014

Сбросьте индекс и заголовок на origin/master, но не сбрасывайте рабочее дерево:

git reset origin/master
person Community    schedule 15.02.2013
comment
Я лично считаю, что это очень полезно. Затем он сохраняет ваше рабочее дерево, чтобы вы могли снова его зарегистрировать. Что касается моей проблемы, у меня были удалены те же файлы, что и добавляемые, поэтому он застрял. Странно, я знаю. - person King Friday; 05.01.2014

Эти четыре команды работают у меня.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Чтобы проверить / вытащить после выполнения этих команд

git pull origin master

Я много пробовал, но, наконец, добился успеха с этими командами.

person Vishesh Chandra    schedule 20.03.2014
comment
git branch -D master удалить ветку. так что будьте осторожны с этим. Я предпочитаю использовать git checkout origin / master -b ‹новое имя ветки›, который создает новую ветку с новым именем, а вам нужно 3,4 строки. Также рекомендуется использовать git clean -f. - person Chand Priyankara; 05.04.2014

Требования:

  1. Отслеживайте локальные изменения, чтобы их никто не потерял.
  2. Сделайте локальный репозиторий совпадающим с удаленным исходным репозиторием.

Решение:

  1. Спрятать локальные изменения.
  2. Получить, очистив файлы и каталоги, игнорируя .gitignore и полный сброс на происхождение.

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
person vezenkov    schedule 01.09.2015

Я прочитал все ответы, но искал единственную команду для этого. Вот что я сделал. Добавлен псевдоним git в .gitconfig

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Запустите вашу команду как

git fp origin master

эквивалентно

git fetch origin master
git reset --hard origin/master
person Venkat Kotra    schedule 08.07.2016

Это сработало для меня очень хорошо!

git fetch --all
git reset --hard origin/master
person Shoaib Khalil    schedule 05.02.2021
comment
Чем это отличается от одного или нескольких из предыдущих 58 ответов (не риторический вопрос)? Например, 红 日 初升 's ответ (опубликованный непосредственно перед вашим) кажется очень похожим. - person Peter Mortensen; 24.06.2021
comment
@PeterMortensen Ну, мой ответ - просто дать подтверждение того конкретного решения, которое сработало для меня очень хорошо, как я уже упоминал выше, а не просто добавить еще один ответ - person Shoaib Khalil; 26.06.2021

Это лучший способ отменить изменения:

  • git commit Зафиксируйте поэтапные изменения, чтобы они были сохранены в reflog (см. ниже)
  • git fetch Получить последние изменения в восходящем направлении
  • git reset --hard origin/master Аппаратный сброс на исходную главную ветку

reflog записывает ветки и другие ссылки, обновляемые в локальном репозитории . Или, проще говоря, reflog - это история ваших изменений.

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

person Jordan Georgiev    schedule 12.08.2016

Не используйте git reset --hard. Это уничтожит их изменения, которые могут быть совершенно нежелательными. Вместо:

git pull
git reset origin/master
git checkout <file1> <file2> ...

Конечно, вы можете использовать git fetch вместо git pull, поскольку он явно не собирается сливаться, но если вы обычно тянете, имеет смысл продолжить тянуть здесь.

Итак, здесь происходит следующее: git pull обновляет вашу исходную / главную ссылку; git reset обновляет ссылку на вашу локальную ветвь, чтобы она была такой же, как origin / master, без обновления каких-либо файлов, поэтому ваше состояние извлечения не изменилось; затем git checkout возвращает файлы в состояние индекса вашего локального филиала по мере необходимости. В тех случаях, когда один и тот же файл был добавлен в реальном времени и на главном сервере восходящего потока, индекс уже соответствует файлу после сброса, поэтому в общем случае вам вообще не нужно делать git checkout.

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

git pull
git merge <commit before problem commit>
git reset <problem commit>
git checkout <file1> <file2> ...
git pull
person Jim Driscoll    schedule 28.11.2017

Ты можешь попробовать:

$ git fetch --all
$ git reset --hard origin/master 
$ git pull
person 红日初升    schedule 17.01.2021

Я использовал эту команду, чтобы избавиться от локальных файлов, которые мешают мне выполнить извлечение / слияние. Но будь осторожен! Сначала запустите git merge …, чтобы проверить, есть ли только те файлы, которые вы действительно хотите удалить.

git merge origin/master 2>&1 >/dev/null | grep ^[[:space:]] | sed s/^[[:space:]]//g | xargs -L1 rm
  • git merge среди прочего перечисляет все эти файлы. Им предшествует какое-то белое пространство.
  • 2>&1 >/dev/null перенаправляет вывод ошибок на стандартный, чтобы grep их подхватил.
  • grep ^[[:space:]] фильтрует только строки с именами файлов.
  • sed s/^[[:space:]]//g обрезает пустое пространство с самого начала.
  • xargs -L1 rm вызывает rm для каждого из этих файлов, удаляя их.

Обращайтесь с осторожностью: независимо от того, что выводит git merge, rm будет вызываться для каждой строки, начинающейся с пробела.

person Glutexo    schedule 07.10.2015

Я пытался использовать ветку Material2 на Angular2-Webpack-Starter и чертовски здорово провел время. Это был единственный способ загрузить и использовать эту ветку.

git clone --depth 1 https://github.com/angularclass/angular2-webpack-starter.git

cd angular2-webpack-starter/

git checkout -b material2

Откройте папку проекта и удалите все не скрытые файлы и папки. Оставьте все скрытые.

git add .

git commit -m "pokemon go"

git reset --hard

git pull origin material2

(Когда появится редактор, нажмите ': wq', а затем нажмите Enter)

Теперь все готово.

person Post Impatica    schedule 27.07.2016

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

git fetch
git reset --keep origin/$(git rev-parse --abbrev-ref HEAD)

Если вы также хотите сбросить локальные изменения:

git fetch
git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)
person warch    schedule 25.05.2018
comment
Если вы обнаружите, что часто используете это, добавьте ярлык bash alias gplf='git fetch && echo "HEAD was at $(git rev-parse --short HEAD)" && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD)' - person Paul Odeon; 13.11.2019
comment
Блестяще. Спасибо! При ответе люди не принимают во внимание автоматические скрипты. Это очень элегантно, если вы просто не можете передать имя ветки. - person Zeno Popovici; 24.09.2020

В Windows выполните эту единственную команду:

git fetch --all & git reset --hard origin/master
person Luca C.    schedule 10.04.2018
comment
Почему это должно быть иначе, чем, например, в Linux? Какую конкретную реализацию / пакет git вы используете? И / или в какой среде (например, MinGW)? - person Peter Mortensen; 27.04.2018
comment
Я не уверен, только уверен, что это работает в окнах. В linux какой разделитель объединяет две команды в одну строку? (не канал, просто объедините без передачи вывода) - person Luca C.; 29.04.2018

Вы можете игнорировать этот файл с файлом в базовой папке вашего проекта:

.gitignore

public/images/*

Затем внесите изменения и удалите эту строку из файла gitignore.

person DanielG    schedule 09.11.2010

1: возврат к предыдущей фиксации

git reset --hard HEAD

2: Удалить неотслеживаемые файлы

git clean -f

3: Подтяните коммиты

git pull

Источники:

person abhijithvijayan    schedule 10.11.2018

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

ошибка: неотслеживаемый файл рабочего дерева 'public / images / icon.gif' будет перезаписан слиянием

Поскольку двоичные файлы не могут быть объединены, простой ответ:

git checkout public/images/icon.gif

При этом файл восстановит предыдущее состояние, которое было в этой ветке.

Обычно я делаю git stash, если не хочу потерять свои изменения, или что-то вроде git checkout ., если меня не интересуют локально измененные файлы. IMO намного проще, чем reset --hard, _5 _... и все эти вещи, более подходящие для выхода из ветки, как в удаленном, включая фиксации, неотслеживаемые файлы, а не просто решение локально измененного файла.

person guillem    schedule 24.07.2020

Как только вы выполните git pull, вы получите список файлов, которые не совпадают. Если количество файлов не очень велико, вы можете проверить эти файлы, это действие перезапишет эти файлы.

git checkout - ‹filename›

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

person Ashutosh Nigam    schedule 12.07.2020

Я сделал это, чтобы заставить его работать:

На компьютере, на котором я создал новую ветку:

git push --all

На компьютере, на котором я хотел показать новую ветку:

git fetch --all
person dadde    schedule 30.08.2019

Шаг 1. (необязательно)
В корне локального репозитория сохраните резервную копию и очистите текущую папку:

mkdir -p ../<branch>-bkp && mv --backup=t * ../<branch>-bkp

Шаг 2. Загрузите все файлы и папки ветки из удаленного репозитория:

git checkout <branch> && git add -A . && git reset --hard origin/<branch> && git pull

где вы должны заменить <branch> именем ветки, которую вы хотите перезаписать.

Комментарии:

  • Вы можете предпочесть ручное резервное копирование и удаление текущих файлов и папок вместо шага 1.
    Фактически, я рекомендую делать это с помощью обработчика файлов в графическом интерфейсе вашей операционной системы.
  • Если вы пропустите шаг 1, будьте осторожны: вы потеряете всю работу в локальном репозитории!
  • Важно: если вы не укажете git pull на шаге 2,
    вы рискуете не получить последнюю версию из удаленный репозиторий!
    Согласно второй ссылке ниже, git reset --hard
    сбрасывает промежуточную область и рабочий каталог в соответствии с последней фиксацией .
    Мой опыт опровергает это утверждение!
  • Если вы запустите git reset --hard origin/<branch_to_overwrite> без предварительного удаления всех файлов и папок из локального репозитория, помните, что все еще лежащие ненужные файлы могут проникнуть в удаленный репозиторий позже git push, даже если это не было вашим намерением.
    Дополнительные git add -A . в шаг 2 предотвращает это, если вы решите пропустить шаг 1.

Ссылки:
https://gitforwindows.org/
https://www.atlassian.com/git/tutorials/undoing-changes/git-reset
https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog.

person Henke    schedule 10.12.2020

Поскольку мне часто нужен быстрый способ сбросить текущую ветку в Windows через командную строку, вот быстрый способ:

for /f "tokens=1* delims= " %a in ('git branch^|findstr /b "*"') do @git reset --hard origin/%b
person npocmaka    schedule 14.04.2020

Я перепробовал почти все, что смог найти здесь, в моем случае ничего не помогло.

Что сработало, так это git merge -X theirs

person Sxilderik    schedule 01.12.2020

Вы можете попробовать git pull --force или, может быть, спрятать свои коммиты, используя git stash, а затем запустив git pull.

person Ultan Kearns    schedule 22.08.2019
comment
Это не работает. fatal: refusing to merge unrelated histories - person Wyck; 23.08.2019
comment
Нет: error: The following untracked working tree files would be overwritten by merge: - мне плевать на эти файлы. Если бы их было всего два или три, я бы просто удалил их. Но их так много. - person Martin; 20.08.2020
comment
У меня это отлично сработало! В чем дело? - person EyesBear; 05.07.2021

Я думаю, вы также можете заставить git push -f / git push --force

person bombom    schedule 19.10.2020
comment
вопрос касается вытягивания, а не выталкивания. - person Daemon Painter; 19.10.2020