Как удалить unpushed git commits?

Я случайно совершил неправильную ветку. Как удалить эту фиксацию?

Ответ 1

Удалите последнюю фиксацию, сохраняя выполненную вами работу:

git reset --soft HEAD~1

Удалите последнюю фиксацию, уничтожить выполненную работу:

git reset --hard HEAD~1

Ответ 2

Не удаляйте его: для одной фиксации git cherry-pick достаточно.

Но если у вас было несколько коммитов на неправильной ветке, вот где git rebase --onto светит:

Предположим, что у вас есть это:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

вы можете пометить master и переместить его туда, где вы хотели бы быть:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

reset y, где он должен был быть:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

и, наконец, переместите свои коммиты (повторите их, сделав фактически новые коммиты)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

Ответ 3

Интересно, почему лучший ответ, который я нашел, только в комментариях! (Daenyth с 86 голосами против)

git reset --hard origin

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

Ответ 4

Сделайте git rebase -i FAR_ENOUGH_BACK и отбросьте строку для комманды, которую вы не хотите.

Ответ 5

Если вы хотите переместить эту фиксацию в другую ветвь, получите SHA рассматриваемого коммита

git rev-parse HEAD

Затем переключите текущую ветвь

git checkout other-branch

И cherry-pick фиксация на other-branch

git cherry-pick <sha-of-the-commit>

Ответ 6

Для вашей справки, я считаю, что вы можете "жестко отрезать" из вашей текущей ветки не только с помощью git reset --hard, но также со следующей командой:

git checkout -B <branch-name> <SHA>

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

git branch -f <branch-name> <SHA>

Это был бы программный способ удалить фиксации из ветки, например, чтобы скопировать новые коммиты (используя rebase).

Предположим, что у вас есть ветвь, которая отключена от мастера, потому что вы взяли источники из другого места и сбросили ее в ветку.

Теперь у вас есть ветвь, в которую вы применили изменения, позвольте ей назвать ее "темой".

Теперь вы создадите дубликат своей ветки темы, а затем переустановите ее на дамп исходного кода, который находится в ветке "дамп":

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

Теперь ваши изменения повторно применяются в ветке topic_duplicate на основе начальной точки "дампа" , но только те коммиты, которые произошли после "master". Таким образом, ваши изменения, начиная с мастера, теперь снова применяются поверх "дампа" , но результат заканчивается в "topic_duplicate" .

Затем вы можете заменить "dump" на "topic_duplicate" , выполнив:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

Или с помощью

git branch -M topic_duplicate dump

Или просто отбрасывая дамп

git branch -D dump

Возможно, вы также можете просто выбрать вишню после очистки текущего "topic_duplicate" .

То, что я пытаюсь сказать, состоит в том, что если вы хотите обновить текущую ветвь "дубликат", основанную на другом предке, вы должны сначала удалить ранее сделанные "черрипические" фиксации, выполнив git reset --hard <last-commit-to-retain> или git branch -f topic_duplicate <last-commit-to-retain>, а затем копирование другого происходит за счет (из основной ветки темы) путем переустановки или выбора вишни.

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

Черрипика намного проще:

git cherry-pick master..topic

Таким образом, вся последовательность будет выглядеть следующим образом:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

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

Итак, просто чтобы продемонстрировать:

  • reset приведет к тому, что ваша ветка укажет на другую фиксацию (--hard также проверит предыдущую фиксацию, --soft сохраняет добавленные файлы в индексе (который будет зафиксирован, если вы снова зафиксируете) и по умолчанию (- -mixed) не будет проверять предыдущую фиксацию (очистка локальных изменений), но она очистит индекс (ничего еще не добавлено для фиксации)
  • вы можете просто заставить ветвь указать на другую фиксацию
  • вы можете сделать это, одновременно проверяя, что совершить также
  • перезагрузка работает над коммитами, присутствующими в вашей текущей ветке
  • Выбор вишни для копирования из другой ветки

Надеюсь, это поможет кому-то. Я имел в виду переписать это, но теперь я не могу справиться. С наилучшими пожеланиями.

Ответ 7

Если у вас есть резервная копия вашего кода (включая папку .git), удалите папку .git с последней кодовой базы. Скопируйте старую папку .git в последнюю кодовую базу. Выполнить git pull.

Примечание. Используйте это решение только в том случае, если у вас заканчивается время и много путают.