Как откатиться до определенного коммита? (много гуглил не могу найти ответа)

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

должна же быть команда типа такой:

git reset #fgfgfg

неужели такого не сделали?

а так же нужно это всё выгрузить на github, хотя при git push система пишет что новых коммитов нет и выгружать нечего, а при попытке создат новый коммит система пишет что новых файлов не обнаружено(


Ответы (3 шт):

Автор решения: tym32167

У вас по сути 2 задачи:

  • откатить ветку в прошлое
  • отправить это изменение на удаленный репозиторий

Для отката ветки в прошлое есть команда git reset. У нее есть разные опции, ваша скорее всего --hard

Важно понимать, что при такой операции последние коммиты могут быть потеряны. То есть вы откатываетесь в прошлое и это может быть билетом в один конец.

Для отправки подобного ижменения в удаленный репозиторий, используется команда git push. По умолчанию она не позволяет обновлять ветки, откатанные в прошлое. Чтобы это заработало вы можете форсировать отправку параметром --force.

Подобная практика приемлема, если вы один работаете над репозиторием. В командной работе ручная откатка коммита не только может привести к потере истории, но и может стать головной болью ваших коллег по команде.

Чтобы в будущем иметь меньше проблем с git, рекомедую использовать какую либо стратегию версионирования, тот же git feature branching или gitflow позволяют вам работать в своей ветке и делать в ней всё, что необходимо, без влияния на коллег.

→ Ссылка
Автор решения: Roman Konoval

Вот способ без потери истории.

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 будет идентичным.

Это откат состояния, путем создания нового изменения, которое приводит состояние файлов в такое, какое было в том старом комите. Все существующие до этого комиты сохраняются. Т.е. все комиты останутся в истории, и создастся новый, в котором удаленные файлы будут заново добавлены.

→ Ссылка
Автор решения: Uranus

Если ситуация такая:

Commit#1 -> Commit#2 -> !!BadCommit!! -> Commit#3 -> Commit#4

И все это уже отправлено в удаленный репозиторий, то используйте команду git revert.

git revert !!BadCommit!!
git push
→ Ссылка