Возвратитесь к фиксации с помощью SHA-хеша в Git?

Я не понимаю, как работает git revert. Например, я хочу вернуться к совершению шести коммитов за головой, возвращая все изменения в промежуточном коммитете между ними.

Скажем, что SHA hash 56e05fced214c44a37759efa2dfc25a65d8ae98d. Тогда почему я не могу просто сделать что-то вроде:

git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d

?

4b9b3361

Если вы хотите зафиксировать поверх текущего 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"
936
ответ дан 13 дек. '09 в 2:51
источник

Что git-revert - это создать коммит, который отменяет изменения, сделанные в заданной фиксации, создание фиксации, которая является обратной (ну, обратной) данной фиксации. Поэтому

git revert <SHA-1>

должен и должен работать.

Если вы хотите перемотать назад на указанный коммит, и вы можете это сделать, потому что эта часть истории еще не была опубликована, вам нужно использовать git-reset, а не git -revert:

git reset --hard <SHA-1>

(Обратите внимание, что --hard приведет к потере любых некорректных изменений в рабочем каталоге).

Дополнительные примечания

Кстати, возможно, это не очевидно, но везде, где документация говорит <commit> или <commit-ish> (или <object>), вы можете поместить SHA-1 (полный или сокращенный) фиксации.

97
ответ дан 13 дек. '09 в 12:54
источник

Он возвращает указанный коммит, то есть добавляет фиксацию напротив него. Если вы хотите проверить предыдущую ревизию, выполните следующие действия:

git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d
83
ответ дан 13 дек. '09 в 2:40
источник

Лучший способ отката для конкретной фиксации:

git reset --hard <commit-id>

Тогда:

git push <reponame> -f
54
ответ дан 19 нояб. '12 в 16:50
источник

Если ваши изменения уже были перенесены на общедоступный, общий удаленный доступ, и вы хотите вернуть все коммиты между HEAD и <sha-id>, то вы можете передать диапазон фиксации в git revert,

git revert 56e05f..HEAD

и он вернет все фиксации между 56e05f и HEAD (исключая начальную точку диапазона, 56e05f).

46
ответ дан 19 дек. '11 в 16:15
источник

Обновлено:

Этот ответ проще, чем мой ответ: Как вернуть репозиторий 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. Первый изменяет рабочий каталог, но также меняет голову. Мы фиксируем голову вторым.

17
ответ дан 22 марта '13 в 8:09
источник

Это более понятно:

git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'

И чтобы доказать, что это сработало:

git diff 56e05fced
3
ответ дан 23 июня '11 в 19:29
источник

Должно быть так же просто, как:

git reset --hard 56e05f

Это вернет вас к этому конкретному моменту времени.

0
ответ дан 04 янв. '13 в 3:15
источник

Это может сработать:

git checkout 56e05f
echo ref: refs/heads/master > .git/HEAD
git commit
-2
ответ дан 26 июня '12 в 1:36
источник