Возвратитесь к фиксации с помощью 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