Вернуться к коммиту с помощью хэша 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
Другие вопросы по тегам