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


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

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

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

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

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

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


5076


источник


Ответы:


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

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


Я думаю, что это правильный путь:

git fetch --all

Затем у вас есть два варианта:

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, Однако незавершенные изменения (даже поставленные) будут потеряны. Удостоверьтесь в том, чтобы прикрыть и совершить все, что вам нужно.


7101



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

git reset --hard HEAD
git pull

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


751



ПРЕДУПРЕЖДЕНИЕ: git cleanудаляет все ваши необработанные файлы / каталоги и не может быть отменен.


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

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

ПРЕДУПРЕЖДЕНИЕ: git cleanудаляет все ваши необработанные файлы / каталоги и не может быть отменен.


379



Как Ежик, я думаю, что ответы ужасны. Но хотя ответ Hedgehog может быть лучше, я не думаю, что он такой же изящный, как это могло бы быть. Способ, которым я нашел это, - использовать «выборку» и «слияние» с определенной стратегией. Это должно сделать так, чтобы ваши локальные изменения сохранялись до тех пор, пока они не являются одним из файлов, которые вы пытаетесь принудительно перезаписать.

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

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

Затем выберите изменения и перезапишите, если есть конфликт

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

«-X» - это имя опции, а «их» - значение для этой опции. Вы решили использовать «свои» изменения вместо «ваших» изменений, если есть конфликт.


331



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

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

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

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

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


236



Похоже, что лучший способ - сначала сделать:

git clean

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


120



Warning, doing this will permanently delete your files if you have any directory/* entries in your gitignore file.

Some answers seem to be terrible. Terrible in the sense of what happened to @Lauri by following David Avsajanishvili suggestion.

Rather (git > v1.7.6):

git stash --include-untracked
git pull

Later you can clean the stash history.

Manually, one-by-one:

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

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

Brutally, all-at-once:

$ git stash clear

Of course if you want to go back to what you stashed:

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

96



You might find this command helpful to throw away local changes:

git checkout <your-branch> -f

And then do a cleanup (removes untracked files from the working tree):

git clean -f

If you want to remove untracked directories in addition to untracked files:

git clean -fd

86



Instead of merging with git pull, try this:

git fetch --all

followed by:

git reset --hard origin/master.


71