Сброс пульта до определенного коммита - PullRequest
570 голосов
/ 28 апреля 2011

Я хочу отменить все изменения, сделанные после коммита <commit-hash>. Итак, я сделал:

git reset --hard <commit-hash>

Теперь я хочу сделать то же самое с моим пультом. Как я могу это сделать? Я сделал несколько коммитов (и подтолкнул) после <commit-hash>, и я просто хочу отменить их все. Просто что-то пошло ужасно неправильно в пути, и я не хочу, чтобы это было хуже, чем сейчас. ; (

Я хочу перемотать origin/master на <commit-hash>

Ответы [ 9 ]

1010 голосов
/ 28 апреля 2011

Предполагая, что ваша ветвь называется 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.

92 голосов
/ 14 ноября 2016

Используйте другие ответы, если вы не против потерять локальные изменения. Этот метод все еще может разрушить ваш пульт, если вы выберете неверный коммит хеша для возврата.

Если выпросто хотите, чтобы удаленное совпадение было зафиксировано в коммите, который уже находится в вашей локальной ветке:

  1. Не , а не выполняйте сброс.
  2. Используйте git log, чтобы найтихэш коммита, на котором вы хотите, чтобы удаленный был.git log -p чтобы увидеть изменения, или git log --graph --all --oneline --decorate чтобы увидеть компактное дерево.(Наличие последнего в качестве псевдонима в вашей оболочке очень удобно.)
  3. Скопируйте хеш.
  4. Выполните команду, например:

    git push --force <remote> <the-hash>:<the remote branch>
    

    , например,

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
    
56 голосов
/ 07 марта 2015

Я решил проблему, подобную вашей, с помощью следующих команд:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch> 
7 голосов
/ 04 января 2018

На GitLab вам, возможно, придется установить ветку на незащищенную , прежде чем делать это.Вы можете сделать это в [repo]> Настройки> Репозиторий> Защищенные ветви.Тогда метод из ответа Марка работает.

git reset --hard <commit-hash>
git push -f origin master
6 голосов
/ 22 декабря 2016

Мои два цента к предыдущим ответам: если

git push --force <remote> <the-hash>:<the remote branch>

все еще не работает, вы можете отредактировать <your-remote-repo>.git/config секцию приема файла:

[receive]
  #denyNonFastforwards = true
  denyNonFastforwards = false
5 голосов
/ 06 мая 2017

Если вам нужна предыдущая версия файла, я бы порекомендовал использовать git checkout.

git checkout <commit-hash>

Выполнение этого отправит вас назад во времени, это не повлияет на текущее состояние вашего проекта, вы можете перейти на основную линию git checkout mainline

но когда вы добавляете файл в аргумент, этот файл возвращается к вам с предыдущего времени до текущего времени проекта, т. е. ваш текущий проект изменен и должен быть зафиксирован.

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

1 голос
/ 29 июня 2018

Если ваша ветвь не является разработкой или производством, самый простой способ добиться этого - сбросить локально до определенного коммита и создать оттуда новую ветку. Вы можете использовать:

git checkout 000000

(где 000000 - это идентификатор коммита, куда вы хотите перейти) в вашей проблемной ветке, а затем просто создайте новую ветку:

git remote add [name_of_your_remote]

Тогда вы можете создать новый пиар, и все будет отлично работать!

0 голосов
/ 23 мая 2018

Раздел изучения: Отмена публичных коммитов с возвратом в блоге Atlasssian https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

0 голосов
/ 18 июля 2017

Сделай одну вещь, получить SHA коммита нет. такие как 87c9808, а затем,

  1. перемести себя, то есть твоя голова к указанному коммиту (выполнив git reset --hard 89cef43 // укажите здесь свой номер)
  2. Затем внесите некоторые изменения в случайный файл, чтобы git попросил вас сделать это локально, а затем удаленно. Таким образом, то, что вам нужно сделать сейчас, это. после применения изменений git commit -a -m "пробный коммит"
  3. Теперь нажмите следующий коммит (если он был зафиксирован локально) от git push origin master
  4. Теперь, что мерзавец спросит у вас, это

ошибка: не удалось отправить некоторые ссылки на «https://github.com/YOURREPOSITORY/AndroidExperiments.git' подсказка: обновления были отклонены, потому что кончик вашей текущей ветви находится позади подсказка: его удаленный аналог. Интеграция удаленных изменений (например, подсказка: 'git pull ...') перед повторным нажатием. **

  1. Итак, теперь вы можете сделать

git push --force origin master

  1. И, таким образом, я надеюсь, что это работает:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...