Сброс пульта дистанционного управления к определенному фиксации
Я хочу отменить все изменения, сделанные после commit <commit-hash>
.
Итак, я сделал:
git reset --hard <commit-hash>
Теперь я хочу сделать то же самое с моим пультом. Как я могу это сделать? Я совершил некоторые коммиты (и толкает) после <commit-hash>
, и я просто хочу их отбросить. Просто что-то пошло ужасно неправильно, и я не хочу делать это хуже, чем это уже происходит.; (
В основном я хочу перемотать мой origin/master
на <commit-hash>
Ответы
Ответ 1
Предполагая, что ваш филиал называется master
, как здесь, так и удаленно, и что ваш пульт называется origin
вы могли бы сделать:
git reset --hard <commit-hash>
git push -f origin master
Однако вам следует избегать этого, если кто-то еще работает с вашим удаленным репозиторием и внес изменения. В этом случае было бы лучше отменить коммиты, которые вам не нужны, а затем нажать как обычно.
Обновление: вы объяснили ниже, что другие люди извлекли изменения, которые вы выдвинули, поэтому лучше создать новый коммит, который отменит все эти изменения. В этом ответе от Якуба Наребски есть хорошее объяснение ваших возможностей сделать это. Какой из них наиболее удобен, зависит от того, сколько коммитов вы хотите вернуть, и какой метод имеет для вас наибольшее значение.
Поскольку из вашего вопроса стало ясно, что вы уже использовали git reset --hard
для сброса вашей master
ветки, вам может потребоваться начать с использования git reset --hard ORIG_HEAD
чтобы переместить вашу ветку туда, где она была раньше. (Как всегда с git reset --hard
, убедитесь, что git status
чистое, что вы находитесь на правильной ветке и что вы знаете о git reflog
как инструменте для восстановления явно потерянных коммитов.) Вы также должны проверить, что ORIG_HEAD
указывает на правильный коммит, с git show ORIG_HEAD
.
Ответ 2
Используйте другие ответы, если не возражаете потерять локальные изменения. Этот метод может по-прежнему разрушать ваш пульт, если вы выберете неправильный хеш фиксации, чтобы вернуться к.
Если вы просто хотите сделать удаленное совпадение с фиксацией, которая уже находится в вашей локальной ветке:
- Сделайте не сброс.
- Используйте
git log
, чтобы найти хеш фиксации, которую хотите, чтобы пульт был включен. git log -p
, чтобы увидеть изменения, или git log --graph --all --oneline --decorate
, чтобы увидеть компактное дерево. (Наличие последнего в качестве псевдонима в вашей оболочке очень удобно.)
- Скопируйте хэш.
-
Выполните команду, например:
git push --force <remote> <the-hash>:<the remote branch>
например.
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
Ответ 3
Я решил эту проблему, как ваш, следующими командами:
git reset --hard <commit-hash>
git push -f <remote> <local branch>:<remote branch>
Ответ 4
Мои два цента к предыдущим ответам: if
git push --force <remote> <the-hash>:<the remote branch>
все еще не работает, вы можете отредактировать раздел приема <your-remote-repo>.git/config
:
[receive]
#denyNonFastforwards = true
denyNonFastforwards = false
Ответ 5
Если вы хотите использовать предыдущую версию файла, я бы рекомендовал использовать git checkout.
git checkout <commit-hash>
Выполняя это, мы вернем вас вовремя, это не повлияет на текущее состояние вашего проекта, вы можете прийти на магистраль git main checkout
но когда вы добавляете файл в аргумент, этот файл возвращается вам
от предыдущего времени до вашего текущего времени проекта, т.е. ваш текущий проект изменяется и должен быть зафиксирован.
git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push
Преимущество этого заключается в том, что он не удаляет историю, а также не отменяет определенные изменения кода (git revert)
Подробнее здесь https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
Ответ 6
Сделайте одно,
получить commit SHA no. таких как 87c9808, а затем,
- перемещайте себя, это ваша голова к указанному фиксации (делая
git reset --hard 89cef43//укажите свой номер здесь)
- Далее выполните некоторые изменения в случайном файле, чтобы git попросил вас совершить это локально, а затем удаленно
Таким образом, то, что вам нужно сделать сейчас.
после внесения изменений
git commit -a -m "trial commit"
- Теперь нажмите следующую фиксацию (если это было сделано локально)
от
git кнопка начала оригинала
- Теперь, что git спросит у вас, что
Ошибка: не удалось нажать несколько ссылок на 'https://github.com/YOURREPOSITORY/AndroidExperiments.git' Подсказка: обновления были отклонены, потому что конец вашей текущей ветки намек: его удаленный аналог. Интегрируйте удаленные изменения (например, hint: 'git pull...') перед повторным нажатием. **
- Таким образом, теперь вы можете сделать
git push --force origin master
- И, таким образом, я надеюсь, что это работает:)
Ответ 7
В GitLab вам может потребоваться установить ветвь незащищенную, прежде чем делать это. Это можно сделать в режиме [репо] > Настройки > Репозиторий > Защищенные ветки. Затем работает метод ответа от Mark.
git reset --hard <commit-hash>
git push -f origin master
Ответ 8
Если ваша ветвь не является разработкой или производством, самый простой способ добиться этого - сбросить локально до определенного коммита и создать оттуда новую ветку. Ты можешь использовать:
git checkout 000000
(где 000000 - это идентификатор коммита, куда вы хотите перейти) в вашей проблемной ветке, а затем просто создайте новую ветку:
git remote add [name_of_your_remote]
Тогда вы можете создать новый пиар, и все будет работать нормально!
Ответ 9
Узнать раздел: Отменить общедоступные комманды с возвратом в Atlasssian Blog
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting