Я случайно совершил не ту ветку. Как мне удалить этот коммит?
949
Удалите самый последний коммит, сохранив работу, которую вы сделали:
git reset --soft HEAD~1
Удалите самый последний коммит, уничтожив работу, которую вы сделали:
git reset --hard HEAD~1
git reset --hard origin
git remote
Списки мыслей происхождения для меня,git reset --hard origin
говоритfatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
. Почему?git reset HEAD~1
также сохранит все ваши изменения, но оставит вас с пустым индексом, а не сохранит все (как--soft
вариант).Интересно, почему лучший ответ, который я нашел, только в комментариях! ( Daenyth с 86 голосами против )
Эта команда синхронизирует локальный репозиторий с удаленным репозиторием, чтобы избавиться от всех изменений, которые вы внесли в свой локальный репозиторий. Вы также можете сделать следующее, чтобы получить именно ту ветку, которая у вас есть в источнике.
источник
git reset --hard origin/<branch>
git reset --soft origin/<branch>
, если вы хотите избавиться от коммита, но продолжите локальную работу.fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
, вам нужно указать ветку, как:git reset --hard origin/feature/my-cool-stuff
Не удаляйте его: достаточно одного коммита
git cherry-pick
.Но если у вас было несколько коммитов на неправильной ветке, вот где
git rebase --onto
светит:Предположим, у вас есть это:
, затем вы можете пометить
master
и переместить его туда, где вы хотите быть:, сбросьте y ветку, где она должна была быть:
и, наконец, переместите свои коммиты (примените их заново, делая новые коммиты)
источник
Сделайте
git rebase -i FAR_ENOUGH_BACK
и оставьте строку для коммита, который вам не нужен.источник
Если вы хотите переместить этот коммит в другую ветку, получите SHA соответствующего коммита
Затем переключите текущую ветку
И
cherry-pick
обязательствоother-branch
источник
git reset --hard HEAD~1
последующих действий . Я думаю, что использованиеreset --soft
затем переключения веток и повторной фиксации спасло бы дополнительную работу. С другой стороны, я использовал SourceTree для выполнения большинства моих базовых задач, только после того, как выполнил командную строку после ошибки.Для справки, я полагаю, что вы можете «жестко вырезать» коммиты из вашей текущей ветки не только с помощью git reset --hard, но и с помощью следующей команды:
Фактически, если вы не заботитесь о проверке, вы можете установить ветку на что хотите:
Это может быть программный способ удаления коммитов из ветви, например, для копирования в него новых коммитов (с использованием rebase).
Предположим, у вас есть ветвь, которая отключена от мастера, потому что вы взяли источники из какого-то другого места и сбросили его в ветку.
Теперь у вас есть ветка, в которой вы применили изменения, давайте назовем это «тема».
Теперь вы создадите дубликат вашей ветки тем и затем переместите ее в дамп исходного кода, который находится в ветке «dump»:
Теперь ваши изменения повторно применяются в ветке topic_duplicate, основываясь на начальной точке «dump», но только на тех коммитах, которые произошли после «master». Таким образом, ваши изменения, так как master теперь повторно применяются поверх «dump», но результат заканчивается в «topic_duplicate».
Затем вы можете заменить «dump» на «topic_duplicate», выполнив:
Или с
Или просто отбросив дамп
Возможно, вы также можете просто выбрать вишню после очистки текущей "topic_duplicate".
Я пытаюсь сказать, что если вы хотите обновить текущую «дублирующуюся» ветвь на основе другого предка, вы должны сначала удалить ранее «выбранные» коммиты, выполнив
git reset --hard <last-commit-to-retain>
или илиgit branch -f topic_duplicate <last-commit-to-retain>
затем скопировав другие коммиты (из основного ветка темы) либо перебазировкой, либо сбором вишни.Перебазирование работает только на ветке, в которой уже есть коммиты, поэтому вам нужно дублировать ветку темы каждый раз, когда вы захотите это сделать.
Cherrypicking гораздо проще:
Таким образом, вся последовательность будет сводиться к:
Когда ваша тема-дубликат ветки была проверена. Это позволит удалить ранее выбранные коммиты из текущего дубликата и просто повторно применить все изменения, происходящие в «топике» поверх вашего текущего «дампа» (другого предка). Кажется, это достаточно удобный способ, чтобы основывать свою разработку на «реальном» ведущем мастере, используя другой «нижестоящий» мастер, чтобы проверить, применимы ли ваши локальные изменения к этому. В качестве альтернативы вы можете просто сгенерировать diff и затем применить его за пределами любого исходного дерева Git. Но таким образом вы можете сохранить обновленную модифицированную (исправленную) версию, основанную на версии вашего дистрибутива, в то время как ваша фактическая разработка идет вразрез с реальным вышестоящим мастером.
Так что просто для демонстрации:
Надеюсь, это кому-нибудь поможет. Я хотел переписать это, но я не могу справиться сейчас. С уважением.
источник
Следующая команда сработала для меня, все локальные зафиксированные изменения отбрасываются, а локальный сбрасывается на то же, что и удаленная исходная / главная ветвь.
источник