Как указано в выбранном объяснении, сброс git хорош. Но в настоящее время мы часто используем подмодули: репозитории внутри репозиториев. Например, если вы используете ZF3 и jQuery в своем проекте, вы, скорее всего, захотите, чтобы они были клонированы из своих исходных репозиториев. В таком случае сброса мерзавца недостаточно. Нам нужно обновить подмодули до той точной версии, которая определена в нашем репозитории:
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule foreach git submodule update
git status
это то же самое, что вы (cd) рекурсивно попадете в рабочий каталог каждого подмодуля и запустите:
git submodule update
И это очень отличается от
git checkout master
git pull
потому что подмодули указывают не на ветвление, а на фиксацию.
В тех случаях, когда вы вручную извлекаете какую-то ветку для одного или нескольких подмодулей, вы можете запустить
git submodule foreach git pull