Как откатиться до определенного коммита? (много гуглил не могу найти ответа)
Я уже два дня гуглю и нахожу кучу запутанных и непонятных ответов, хотя вопрос простой, гит это система сейв лоад как в играх, я делал много сейвов, коммитов, хочу сделать лоад определенного, это как в игре загрузить определенный сейв. Как это сделать? Если мой вопрос знатоки гита могут понять по разному, то дайте пожалуйста любой вариант на ваш вкус. Я делал штуки, штуки плохие, помню что сейвился где штуки были хорошие, хочу загрузиться до того состояния и играть дальше. Это же базовый функционал для которого создан гит. Я и правда не могу найти ни одного нормального обьяснения.
должна же быть команда типа такой:
git reset #fgfgfg
неужели такого не сделали?
а так же нужно это всё выгрузить на github, хотя при git push система пишет что новых коммитов нет и выгружать нечего, а при попытке создат новый коммит система пишет что новых файлов не обнаружено(
Ответы (3 шт):
У вас по сути 2 задачи:
- откатить ветку в прошлое
- отправить это изменение на удаленный репозиторий
Для отката ветки в прошлое есть команда git reset. У нее есть разные опции, ваша скорее всего --hard
Важно понимать, что при такой операции последние коммиты могут быть потеряны. То есть вы откатываетесь в прошлое и это может быть билетом в один конец.
Для отправки подобного ижменения в удаленный репозиторий, используется команда git push. По умолчанию она не позволяет обновлять ветки, откатанные в прошлое. Чтобы это заработало вы можете форсировать отправку параметром --force.
Подобная практика приемлема, если вы один работаете над репозиторием. В командной работе ручная откатка коммита не только может привести к потере истории, но и может стать головной болью ваших коллег по команде.
Чтобы в будущем иметь меньше проблем с git, рекомедую использовать какую либо стратегию версионирования, тот же git feature branching или gitflow позволяют вам работать в своей ветке и делать в ней всё, что необходимо, без влияния на коллег.
Вот способ без потери истории.
git checkout <commit-id-к-которому-хотите-вернуться> -- .
Эта команда вернет все локальные файлы в состояние, какое у них было в комите (в том числе восстановит удаленные файлы и т.д.), но при этом не трогает историю. Т.е. эти изменения нужно теперь закомитить. И дальше делать обычный push.
Если скажем есть история:
5eec1a5 (HEAD -> master) deletes g
9bd439a deletes f
fdd34b3 adds g. I want to revert here. I have f and g at this time
92819dd initial. adds f
Тогда команды:
git checkout fdd34b3 -- .
git commit -m "revert deletes"
создадут такую историю:
fcf9a36 (HEAD -> master) revert deletes
5eec1a5 deletes g
9bd439a deletes f
fdd34b3 adds g. I want to revert here. I have f and g at this time
92819dd initial. adds f
И состояние файлов в fcf9a36 и fdd34b3 будет идентичным.
Это откат состояния, путем создания нового изменения, которое приводит состояние файлов в такое, какое было в том старом комите. Все существующие до этого комиты сохраняются. Т.е. все комиты останутся в истории, и создастся новый, в котором удаленные файлы будут заново добавлены.
Если ситуация такая:
Commit#1 -> Commit#2 -> !!BadCommit!! -> Commit#3 -> Commit#4
И все это уже отправлено в удаленный репозиторий, то используйте команду git revert.
git revert !!BadCommit!!
git push