Вернуться к коммиту с помощью хэша SHA в Git?
Мне не понятно как git revert
работает. Например, я хочу вернуться к фиксации шести коммитов за головой, вернув все изменения в промежуточных коммитах между ними.
Скажи, что его SHA хэш 56e05fced214c44a37759efa2dfc25a65d8ae98d
, Тогда почему я не могу просто сделать что-то вроде:
git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d
9 ответов
Если вы хотите зафиксировать поверх текущего HEAD с точным состоянием при другом фиксации, отменяя все промежуточные фиксации, то вы можете использовать reset
создать правильное состояние индекса, чтобы сделать коммит.
# Reset the index and working tree to the desired tree
# Ensure you have no uncommitted changes that you want to keep
git reset --hard 56e05fced
# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}
git commit -m "Revert to 56e05fced"
Что делает git-revert, так это создает коммит, который отменяет изменения, внесенные в данный коммит, создавая коммит, который является обратным (ну, взаимно) заданным коммитом. Следовательно
git revert <SHA-1>
должен и действительно работает.
Если вы хотите вернуться назад к указанному коммиту, и вы можете сделать это, потому что эта часть истории еще не была опубликована, вам нужно использовать git-reset, а не git-revert:
git reset --hard <SHA-1>
(Обратите внимание, что --hard
приведет к потере любых не зафиксированных изменений в рабочем каталоге).
Дополнительные примечания
Кстати, возможно, это не очевидно, но везде, где говорится в документации <commit>
или же <commit-ish>
(или же <object>
), вы можете поместить идентификатор SHA-1 (полный или сокращенный) коммита.
Лучший способ откатиться до определенного коммита:
git reset --hard <commit-id>
Затем:
git push <reponame> -f
Он отменяет указанный коммит, то есть добавляет коммит, противоположный ему. Если вы хотите оформить более раннюю версию, вы делаете:
git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d
Обновлено:
Этот ответ проще, чем мой ответ: Как вернуть Git-репозиторий к предыдущему коммиту?
Оригинальный ответ
# Create a backup of master branch
git branch backup_master
# Point master to '56e05fce' and
# make working directory the same with '56e05fce'
git reset --hard 56e05fce
# Point master back to 'backup_master' and
# leave working directory the same with '56e05fce'.
git reset --soft backup_master
# Now working directory is the same '56e05fce' and
# master points to the original revision. Then we create a commit.
git commit -a -m "Revert to 56e05fce"
# Delete unused branch
git branch -d backup_master
Две команды git reset --hard
а также git reset --soft
здесь магия Первый изменяет рабочий каталог, но также меняет и заголовок. Зафиксируем голову вторым.
Если ваши изменения уже переданы в общедоступный, общий удаленный доступ, и вы хотите отменить все коммиты между HEAD
а также <sha-id>
затем вы можете передать диапазон фиксации git revert
,
git revert 56e05f..HEAD
и он вернет все коммиты между 56e05f
а также HEAD
(исключая начальную точку диапазона, 56e05f
).
Это более понятно:
git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'
И доказать, что это сработало:
git diff 56e05fced
Должно быть так просто, как:
git reset --hard 56e05f
Это вернет вас к этому конкретному моменту времени.
Это может сработать:
git checkout 56e05f
echo ref: refs/heads/master > .git/HEAD
git commit