разница - отменить git pull




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

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

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

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

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

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

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


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

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

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

git fetch --all

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

git reset --hard origin/master

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

git reset --hard origin/<branch_name>

Объяснение:

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

Затем git reset ведущую ветвь на то, что вы только что выбрали. Опция --hard изменяет все файлы в рабочем дереве в соответствии с файлами в --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

Бонус:

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

git pull --rebase

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

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

Найти подробности в разделе Что такое «git pull --rebase»? ,


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

git fetch --all

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

git reset --hard origin/master .


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

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

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

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

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


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

git reset --hard HEAD~5

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

git pull

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


Как Ежик, я думаю, что ответы ужасны. Но хотя ответ 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» - это имя опции, а «их» - значение для этой опции. Вы решили использовать «свои» изменения вместо «ваших» изменений, если есть конфликт.


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

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

#/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

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

git reset --hard HEAD
git pull

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


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

git clean

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


Прежде всего, попробуйте стандартный способ:

git reset HEAD --hard # Remove all not committed changes

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

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-файлов (excempt .git/ dir, где вы все зафиксируете) и вытащите его снова.

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

  1. Пользовательские правила в .gitattributes file

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

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

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

    Когда вы используете файловую систему, которая не поддерживает атрибуты разрешений. В примере у вас есть два репозитория: один на Linux / Mac ( ext3 / hfs+ ) и еще один на файловой системе на основе FAT32 / NTFS.

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


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

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

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


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

git reset origin/master

У меня была похожая проблема. Я должен был сделать это:

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

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


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

Я решил это:

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

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


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

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

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

git pull origin master

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


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

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

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


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

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


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

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

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


Предупреждение. Выполнение этого будет навсегда удалять ваши файлы, если у вас есть записи каталога / * в файле gitignore.

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

Скорее (git> v1.7.6):

git stash --include-untracked
git pull

Позже вы можете очистить историю тайника.

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

$ git stash list
[email protected]{0}: WIP on <branch>: ...
[email protected]{1}: WIP on <branch>: ...

$ git stash drop [email protected]{0}
$ git stash drop [email protected]{1}

Жестоко, все-в-одном:

$ git stash clear

Конечно, если вы хотите вернуться к тому, что вы спрятали:

$ git stash list
...
$ git stash apply [email protected]{5}






git-fetch