Возвратитесь к фиксации с помощью SHA-хеша в Git?
Мне не ясно, как работает git revert
. Например, я хочу вернуть коммит на шесть коммитов за головой, вернув все изменения в промежуточных коммитах между ними.
Скажите, что его SHA хеш - 56e05fced214c44a37759efa2dfc25a65d8ae98d
. Тогда почему я не могу просто сделать что-то вроде:
git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d
Ответы
Ответ 1
Если вы хотите зафиксировать поверх текущего 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 [email protected]{1}
git commit -m "Revert to 56e05fced"
Ответ 2
Что git-revert - это создать коммит, который отменяет изменения, сделанные в заданной фиксации, создание фиксации, которая является обратной (ну, обратной) данной фиксации. Поэтому
git revert <SHA-1>
должен и должен работать.
Если вы хотите перемотать назад на указанный коммит, и вы можете это сделать, потому что эта часть истории еще не была опубликована, вам нужно использовать git-reset, а не git -revert:
git reset --hard <SHA-1>
(Обратите внимание, что --hard
приведет к потере любых некорректных изменений в рабочем каталоге).
Дополнительные примечания
Кстати, возможно, это не очевидно, но везде, где документация говорит <commit>
или <commit-ish>
(или <object>
), вы можете поместить SHA-1 (полный или сокращенный) фиксации.
Ответ 3
Он возвращает указанный коммит, то есть добавляет фиксацию напротив него. Если вы хотите проверить предыдущую ревизию, выполните следующие действия:
git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d
Ответ 4
Лучший способ отката для конкретной фиксации:
git reset --hard <commit-id>
Тогда:
git push <reponame> -f
Ответ 5
Если ваши изменения уже были перенесены на общедоступный, общий удаленный доступ, и вы хотите вернуть все коммиты между HEAD
и <sha-id>
, то вы можете передать диапазон фиксации в git revert
,
git revert 56e05f..HEAD
и он вернет все фиксации между 56e05f
и HEAD
(исключая начальную точку диапазона, 56e05f
).
Ответ 6
Обновлено:
Этот ответ проще, чем мой ответ: fooobar.com/questions/67/...
Оригинальный ответ:
# 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
здесь волшебны. Первый изменяет рабочий каталог, но также и заголовок (текущая ветвь). Зафиксируем голову вторым.
Ответ 7
Это более понятно:
git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'
И чтобы доказать, что это сработало:
git diff 56e05fced
Ответ 8
Должно быть так же просто, как:
git reset --hard 56e05f
Это вернет вас к этому конкретному моменту времени.
Ответ 9
Это может сработать:
git checkout 56e05f
echo ref: refs/heads/master > .git/HEAD
git commit