Как заставить "git pull" перезаписать локальные файлы? - PullRequest
6228 голосов
/ 14 июля 2009

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

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

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

Это ошибка, которую я получаю:

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

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

Ответы [ 39 ]

19 голосов
/ 03 августа 2011

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

18 голосов
/ 03 декабря 2010

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

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», хотя stash может вызвать проблемы на первых нескольких попытках, поэтому проведите первый эксперимент на некритическом проекте. .

17 голосов
/ 05 сентября 2015

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

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

Вот и все!

17 голосов
/ 19 сентября 2011

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

git rm [file]

Тогда я могу тянуть очень хорошо.

13 голосов
/ 20 марта 2014

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

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

Для проверки / извлечения после выполнения этих команд

git pull origin master

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

13 голосов
/ 22 октября 2014

Несмотря на исходный вопрос, ответы на часто задаваемые вопросы могут вызывать проблемы у людей, которые сталкиваются с подобной проблемой, но не хотят терять свои локальные файлы. Например, см. Комментарии Аль-Панка и 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.

12 голосов
/ 19 октября 2015

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

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

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

11 голосов
/ 15 февраля 2013

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

git reset origin/master
9 голосов
/ 08 июля 2016

Я прочитал все ответы, но искал единственную команду для этого. Вот что я сделал. Добавлен псевдоним 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
9 голосов
/ 02 сентября 2015

Требования:

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

Решение:

  1. Сундук Местные изменения.
  2. Извлечение с чистыми из файлов и каталогов без учета .gitignore и hard reset to origin .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    
...