Git Pull, игнорируя локальные изменения? - PullRequest
405 голосов
/ 11 ноября 2010

Есть ли способ сделать git pull, который игнорирует любые локальные изменения файла, не удаляя каталог и не выполняя git clone?

Ответы [ 9 ]

688 голосов
/ 11 ноября 2010

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

git reset --hard
git pull

Если есть неотслеживаемые локальные файлы, вы можете использовать git clean для их удаления. Используйте git clean -f для удаления неотслеживаемых файлов, -df для удаления неотслеживаемых файлов и каталогов и -xdf для удаления неотслеживаемых или игнорируемых файлов или каталогов.

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

git stash
git pull
git stash pop

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

228 голосов
/ 23 марта 2015

У меня сработало следующее:

(1) Сначала получить все изменения:

$ git fetch --all

(2) Затем сбросьте мастер:

$ git reset --hard origin/master

(3) Извлечение / обновление:

$ git pull
22 голосов
/ 24 ноября 2014

Команда ниже не будет работать всегда .Если вы просто:

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard
HEAD is now at b05f611 Here the commit message bla, bla

$ git pull
Auto-merging thefile1.c
CONFLICT (content): Merge conflict in thefile1.c
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

и так далее ...

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


$ git checkout thebranch
$ git reset --hard origin/thebranch

Это будет прекрасно работать.

$ git checkout thebranch
Already on 'thebranch'
Your branch and 'origin/thebranch' have diverged,
and have 23 and 7 different commits each, respectively.

$ git reset --hard origin/thebranch
HEAD is now at 7639058 Here commit message again...

$ git status
# On branch thebranch
nothing to commit (working directory clean)

$ git checkout thebranch
Already on 'thebranch'
15 голосов
/ 12 марта 2018

Вы просто хотите команду, которая дает точно такой же результат, как rm -rf local_repo && git clone remote_url, верно? Я тоже хочу эту функцию. Интересно, почему git не предоставляет такую ​​команду (например, git reclone или git sync), а svn не предоставляет такую ​​команду (например, svn recheckout или svn sync).

Попробуйте следующую команду:

git reset --hard origin/master
git clean -fxd
git pull
8 голосов
/ 12 сентября 2017
git fetch --all && git reset --hard origin/master
7 голосов
/ 06 ноября 2012

Если вы работаете в Linux:

git fetch
for file in `git diff origin/master..HEAD --name-only`; do rm -f "$file"; done
git pull

Цикл for удалит все отслеживаемые файлы, которые были изменены в локальном репо, поэтому git pull будет работать без проблем.
Самое приятноеЭто означает, что только файлы, находящиеся в репо, будут перезаписаны, остальные файлы останутся без изменений.

7 голосов
/ 11 ноября 2010

Посмотрите на git stash , чтобы поместить все ваши локальные изменения в "stash-файл" и вернуться к последнему коммиту.В этот момент вы можете применить свои скрытые изменения или отменить их.

1 голос
/ 19 апреля 2019

у меня это сработало

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

с принятым ответом я получаю конфликт ошибок

0 голосов
/ 06 мая 2016

Это выберет текущую ветвь и попытается выполнить быструю перемотку к мастеру:

git fetch && git merge --ff-only origin/master
...