Нужно убрать некорректный коммит и сохранить локальные изменения в git - PullRequest
2 голосов
/ 31 октября 2011

У нас проблема с нашим проектом git:

  • плохие изменения были отправлены в удаленный репозиторий
  • на одной машине нет pull -это плохих изменений, но есть незафиксированные локальные изменения

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

Мы не очень опытны с git и боимся испортить его и потерять незафиксированные, хорошие изменения. Мы не уверены, нужно ли нам использовать git revert или git rebase (или что-то еще) и с какого компьютера (то есть с того, на котором нет хороших изменений?).

1 Ответ

3 голосов
/ 31 октября 2011

Первое: не паникуйте

Это система контроля версий . Он существует, поэтому вы не можете легко потерять информацию.

Вы всегда можете сначала сохранить работу:

git checkout -b RESCUE_THIS
git add .
git commit -am 'Do not loose this commit!'

и взять ее оттуда.

Я предлагаю:

  1. отменить неудачный коммит

    • git reset HEAD @ {1} #, если это был последний коммит

      вам нужно выяснить, какие изменения вы хотите сохранить, и потенциально зафиксировать их в новом коммите. Примечание используйте git reflog, чтобы найти 'HEAD @ {1} part that you want. Take your time as this can be a bit confusing when comparing to git log`

    • git revert bad-commit-id #, если он не был't

      Примечание Найдите версии для отмены с помощью git log.Вы можете отменить несколько коммитов.Верните их в обратном хронологическом порядке.Каждый возврат приведет к новой фиксации, которая 'отменяет' шансов от этой фиксации. Если вы обнаружите, что отменяете множество коммитов, вы можете вместо этого выполнить ребазинг.

  2. принудительно подтолкните фиксированную ветвь к центральному репо

    • git push -f # возможно, укажите ветку: origin master или аналогичную
  3. восстановить оставшуюся работу из «хорошего» клиента, например, с помощью

    • мастер проверки git # переключиться обратно с RESCUE_THIS

    • git merge --no-commit --ff RESCUE_THIS

    • git commit -am

    • git push #, когда вы действительно удовлетворены результатом

Byтогда вы можете удалить ветку RESCUE_THIS.Даже если вы это сделаете, он фактически не исчезнет, ​​пока не истечет срок действия reflog (s).

Отказ от ответственности: все вышеперечисленное изобилует предположениями о вашей установке, истории ветвлений, рабочем процессе и конкретном сценарии сбоя.Будьте уверены, они образованные догадки и большую часть времени совпадают с обычной практикой. Держите глаза открытыми и подумайте сами. В качестве последнего средства вы можете сделать физическое резервное копирование git-репо на «хорошем клиенте» для безопасности

...