Как удалить первую фиксацию в git?

Мне любопытно, как удалить первую фиксацию в git.

Какая ревизия перед совершением каких-либо действий? У этой версии есть название или тег?


person Weihang Jian    schedule 06.06.2012    source источник
comment
Для начала вы должны знать, что ревизия бессмысленна. Вы можете поговорить о коммитах или их относительных SHA. Кроме того, зачем вам это делать? Первый коммит - это то, на чем все построено. Вы можете сжать несколько коммитов вместе, включая первую фиксацию, которая становится новой первой фиксацией, но что это значит - даже удалить первую фиксацию (или удалить любую фиксацию, кроме последней)?   -  person Shahbaz    schedule 06.06.2012
comment
@Shahbaz да, это лучший способ, посмотрите здесь, например: ariejan.net/2011/07/05/git-squash-your-latests-commit-into-one   -  person timaschew    schedule 06.06.2012
comment
Вы можете использовать git rebase -i --root. Подробности см. В следующем SO-ответе: stackoverflow.com/questions/2246208/   -  person MKroehnert    schedule 03.06.2013
comment
возможный дубликат Могу ли я удалить начальную фиксацию из Git репо?   -  person Gordon Gustafson    schedule 27.04.2014
comment
Этот ответ содержит правильное решение для удаления корневого коммита текущей ветки: git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD   -  person Jody Bruchon    schedule 11.07.2020
comment
Отвечает ли это на ваш вопрос? Как отменить первоначальную фиксацию git?   -  person NB Samar    schedule 20.01.2021


Ответы (9)


Для меня наиболее безопасный способ - использовать команду update-ref:

git update-ref -d HEAD

Он удалит указанную ссылку HEAD, поэтому он сбросит (мягко, вы не потеряете свою работу) все ваши коммиты текущей ветки.

Если вы хотите объединить первую фиксацию со второй, вы можете использовать команду rebase:

git rebase -i --root

Последним способом может быть создание ветки-сироты, ветки с тем же содержимым, но без истории коммитов, и фиксация на ней нового контента:

git checkout --orphan <new-branch-name>
person tzi    schedule 24.09.2015
comment
Жаль, что это не принятый ответ. Также очень плохо, что большинство обращений к Google более или менее говорят, что вы не можете отменить первую фиксацию. Это помогло мне. Спасибо! - person danielpops; 27.04.2016
comment
Спасибо @danielpops за вашу поддержку! Приятно отметить, что я ответил на этот вопрос спустя 3 года. Тем временем Git эволюционировал. - person tzi; 30.04.2016
comment
Я использовал rebase, пометил вторую фиксацию как squash, а затем сделал --force push to origin. Спасибо! - person Philip Atz; 25.07.2018
comment
git update-ref -d HEAD - самый безопасный способ удалить всю историю, а не только первоначальную фиксацию. - person user1767316; 28.01.2019
comment
Я сделал это, и он удалил все мои файлы, которые я добавил в первую фиксацию. Грустный. По крайней мере, это было не так много - person Vyacheslav Tsivina; 12.07.2020
comment
спасибо, удалил большую часть файлов из каталога: P - person sKopheK; 19.01.2021

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

Поэтому, если вы хотите исправить фиксацию, вы можете просто git commit --amend: это изменит фиксацию без создания новой.

Если вы просто хотите начать все сначала, удалите репозиторий .git и создайте еще один с помощью git init

person CharlesB    schedule 06.06.2012
comment
Этот ответ неверен: ЕСТЬ способ вернуться к состоянию до первой фиксации. См. ответ tzi ниже. - person David Nelson; 22.03.2016
comment
--amend также не будет правильно обновлять автора, если он изначально был неправильно настроен. Это то, что мне было нужно, поэтому я использовал принятый ответ, а затем просто сделал новую фиксацию. - person Mark Edington; 25.02.2019
comment
Я действительно не понимаю, на каком основании кто-то приходит к выводу, что НЕТ ответа, даже если его явно нет (я помещаю эту фразу сюда, потому что ответ очень старый). - person nomad; 24.01.2021

Возможно, вы просто захотите отредактировать свою первую фиксацию (поскольку в репозитории git всегда есть первая фиксация). Рассмотрите возможность использования git commit --amend --reset-author вместо обычного git commit --amend.

person Max Beikirch    schedule 02.05.2013
comment
Не ответ: вопрос хотел удалить первую фиксацию, а не изменять свойства последней. - person peterh; 08.10.2018
comment
@ peterh-ReinstateMonica Для пояснения: коммиты можно изменить во время интерактивной перебазировки, чтобы полностью изменить их содержимое, но также необходимо указать --reset-author, чтобы сменить автора. При этом вы можете полностью заменить первый коммит по своему вкусу. См. Также ответ CharlesB. - person Max Beikirch; 02.05.2020

Я искал способ отменить все коммиты git из репо, как будто их никогда не было.

Ребазинг будет работать до определенного момента. Однако самый первый (хронологически самый старый коммит git) всегда будет проблематичным, поскольку у него нет родителя, поэтому это приведет к ошибке.

Ни один из этих ответов не решил это для меня. Но после долгих поисков и проб и ошибок я обнаружил, что это работает!

git update-ref -d HEAD
git push origin master -f

Надеюсь, это тебе поможет. Хорошего дня.

person kp123    schedule 22.10.2019
comment
Для ясности для всех, кто читает этот ответ: это удаляет все фиксации, но OP хочет удалить только первую фиксацию, сделанную в репо; не запускайте это, чтобы удалить первую фиксацию, потому что она удалит ВСЕ фиксации. - person Jody Bruchon; 11.07.2020

Другой способ:

  1. Оформить заказ в ветку, которую вы хотите сохранить (например, разработчик) git checkout dev
  2. Теперь удалите ветку, которую хотите сбросить git branch -D master
  3. Теперь создайте пустую ветку с тем же именем git checkout --orphan master

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

person kumarharsh    schedule 08.08.2013
comment
После этого вы должны удалить ветку на удаленном сервере перед тем, как нажимать. В противном случае при попытке нажать вы получите такую ​​ошибку:! [отклонено] master - ›master (без перемотки вперед) - ошибка: не удалось отправить некоторые ссылки на '[email protected]: r1 / r2.git' - подсказка: обновления были отклонены, потому что конец вашей текущей ветки позади - подсказка: его удаленный аналог. Интегрируйте удаленные изменения (например, подсказку: 'git pull ...') перед повторным нажатием ... - Если вы выполните git pull, все коммиты вернутся. - person dxvargas; 29.12.2016

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

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

Это создает newmaster ветку в старом репозитории с историей, которая не похожа ни на одну из других веток. Конечно, вы также можете просто перезаписать master с помощью git push -f.

Если вы хотите уничтожить все ветки и весь существующий контент, просто запустите

rm -rf .git/
person user1338062    schedule 06.06.2012
comment
Не ответ: OP хотел удалить первую фиксацию, а не запускать новое репозиторий git с текущим рабочим деревом в качестве начальной фиксации. - person peterh; 08.10.2018
comment
@peterh Я согласен, что git rebase --root, вероятно, то, что хотел OP, но, учитывая, что этот ответ имеет два положительных голоса, я воздержусь от его удаления, если кто-то все еще сочтет его актуальным. - person user1338062; 09.10.2018
comment
Я думаю, что этот ответ точно уместен - если вы хотите удалить первую фиксацию в какой-то ветке, а там есть только одна фиксация! (Но вы также хотите сохранить другие коммиты в других ветвях; и вы также хотите сделать это, чтобы изменения заканчивались либо в Bitbucket, либо в Github, а не только локально.) Я считаю, что этот ответ - один из способов сделать это, и Я думаю, что это может быть единственный способ сделать это. (Это потому, что, насколько я понимаю, нет способа принудительно протолкнуть локальную ветку без коммитов по удаленной ветке с некоторыми коммитами.) - person MikeBeaton; 26.02.2019

Если вы только что зафиксировали его, но не нажали, просто удалите каталог .git и снова git init ...

person Ali Sajid    schedule 27.08.2018
comment
@peterh Да, это так. Вы предполагаете (я думаю), что вопрос OP о желании удалить первую фиксацию, но сохранить последующие фиксации. Другая возможность (которая, как мне кажется, полностью соответствует вопросу OP - и на которую этот ответ является ответом) заключается в том, чтобы удалить первую и единственную фиксацию из ветки, вернув ее снова к полностью пустой. - person MikeBeaton; 26.02.2019
comment
@MikeBeaton Вы правы. Я удаляю свой комментарий, но затем мне нужно проголосовать, чтобы закрыть вопрос как неясный. Обратите внимание, хотя этот комментарий был сделан только мной, но позади меня 40000 посетителей, и значительная часть из них нашла этот вопрос с помощью Google - и они не получили то, что хотели. - person peterh; 26.02.2019
comment
Это кажется экстремальным. Удалить вопрос? Разве нельзя (совершенно правильно) утверждать, что полный ответ на совершенно разумный вопрос состоит в том, что есть два разных подхода, которые необходимо использовать, в зависимости от того, ... и т. Д.? (Я имею в виду, что я, например, хотел бы знать, как удалить первую фиксацию, если это не единственная фиксация, а также как удалить первую фиксацию, когда она равна Единственная фиксация. Это, конечно, не очевидно и, конечно, зависит от конкретных деталей реализации, что на самом деле оказывается, что действительно в каждом случае требуются довольно разные подходы.) - person MikeBeaton; 27.02.2019

Ответ на вопрос зависит от того:

  • Вы хотите удалить первую И ТОЛЬКО фиксацию в ветке (оставив другие ветки такими, какие они были), или

  • Вы хотите удалить первую фиксацию в какой-либо ветке, «оставив на месте» последующие фиксации (и другие ветки).

Второй из них относительно проще. По сути, вам нужно выполнить переустановку на root - большинство ответов здесь о том, как это сделать.

Сделать второе (удалить первую и единственную фиксацию из ветки, оставив другие ветки в покое) сложнее. Или, по крайней мере, особенно сложнее, если вы хотите, чтобы это произошло и изменение отразилось обратно в GitHub или Bitbucket. Насколько я могу судить, в Git нет никакого способа нажать или принудительно нажать ветку без коммитов. И также (опять же, насколько я понимаю) вообще нет способа создать новую пустую ветку без каких-либо коммитов ни в GitHub, ни в Bitbucket. Таким образом, вам, по сути, нужно создать новый репозиторий, чтобы создать полностью пустую ветку, а затем добавить обратно те ветки, которые вы хотите (включая коммиты, которые вы хотите) - в соответствии с ответом @ user1338062.

Итак, я надеюсь, что этот ответ проясняет то, что могло быть неочевидным - что необходимо использовать два разных подхода для двух разных (более или менее разумных) сценариев, которые оба могут вам понадобиться. уметь делать, чтобы полностью освоить выполнение того, что просит ОП.

person MikeBeaton    schedule 27.02.2019

person    schedule
comment
Не ответ: вопрос был в том, как удалить первую фиксацию, а не в том, как удалить все, кроме последней фиксации. - person peterh; 08.10.2018
comment
Я именно это и искал. Спасибо! - person Krzysztof Tomaszewski; 20.11.2019
comment
Этот ответ скопирован с здесь. - person Jason Law; 14.12.2020
comment
для меня я хотел избавиться от файла .gitignore в битбакете, потому что он мешал мне сделать мой первый толчок из моего локального репо в битбакет. Я решил это, используя git push -f origin master, чтобы заставить его. оглядываясь назад, я думаю, что мог бы решить эту проблему, добавив .gitignore в свое локальное репо. - person luckyguy73; 10.05.2021