Как мне удалить невыдвинутые коммиты git? - PullRequest
761 голосов
/ 07 июля 2010

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

Ответы [ 6 ]

1439 голосов
/ 07 июля 2010

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

git reset --soft HEAD~1

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

git reset --hard HEAD~1
52 голосов
/ 07 июля 2010

Не удаляйте его: для одного коммита достаточно 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

, сбросьте ветку 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
32 голосов
/ 23 января 2019

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

git reset --hard origin

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

11 голосов
/ 07 июля 2010

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

6 голосов
/ 07 июля 2010

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

git rev-parse HEAD

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

git checkout other-branch

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

git cherry-pick <sha-of-the-commit>
2 голосов
/ 28 июля 2016

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

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

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

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

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

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

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

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

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

Теперь ваши изменения повторно применяются в ветке topic_duplicate, основываясь на начальной точке "dump", но только на тех фиксациях, которые произошли после "master".Таким образом, ваши изменения, так как master теперь повторно применяются поверх «dump», но результат заканчивается в «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>, а затем скопировавдругие коммиты (из основной ветки темы) перебазируют или выбирают вишню.

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

Cherrypicking гораздо проще:

git cherry-pick master..topic

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

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

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

Так что просто продемонстрируйте:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...