Мне любопытно, как удалить первую фиксацию в git.
Какая ревизия перед совершением каких-либо действий? У этой версии есть название или тег?
Мне любопытно, как удалить первую фиксацию в git.
Какая ревизия перед совершением каких-либо действий? У этой версии есть название или тег?
Для меня наиболее безопасный способ - использовать команду update-ref
:
git update-ref -d HEAD
Он удалит указанную ссылку HEAD
, поэтому он сбросит (мягко, вы не потеряете свою работу) все ваши коммиты текущей ветки.
Если вы хотите объединить первую фиксацию со второй, вы можете использовать команду rebase
:
git rebase -i --root
Последним способом может быть создание ветки-сироты, ветки с тем же содержимым, но без истории коммитов, и фиксация на ней нового контента:
git checkout --orphan <new-branch-name>
Перед первой фиксацией нет ничего, поскольку каждая фиксация ссылается на родительскую фиксацию. Это делает первую фиксацию особенной (осиротевшую фиксацию), поэтому нет возможности ссылаться на предыдущее «состояние».
Поэтому, если вы хотите исправить фиксацию, вы можете просто git commit --amend
: это изменит фиксацию без создания новой.
Если вы просто хотите начать все сначала, удалите репозиторий .git
и создайте еще один с помощью git init
--amend
также не будет правильно обновлять автора, если он изначально был неправильно настроен. Это то, что мне было нужно, поэтому я использовал принятый ответ, а затем просто сделал новую фиксацию.
- person Mark Edington; 25.02.2019
Возможно, вы просто захотите отредактировать свою первую фиксацию (поскольку в репозитории git всегда есть первая фиксация). Рассмотрите возможность использования git commit --amend --reset-author
вместо обычного git commit --amend
.
Я искал способ отменить все коммиты git из репо, как будто их никогда не было.
Ребазинг будет работать до определенного момента. Однако самый первый (хронологически самый старый коммит git) всегда будет проблематичным, поскольку у него нет родителя, поэтому это приведет к ошибке.
Ни один из этих ответов не решил это для меня. Но после долгих поисков и проб и ошибок я обнаружил, что это работает!
git update-ref -d HEAD
git push origin master -f
Надеюсь, это тебе поможет. Хорошего дня.
Другой способ:
git checkout dev
git branch -D master
git checkout --orphan master
Конечно, все это будет зависеть от вашего варианта использования, но если у вас более одной ветки, удаление каталога .git
не имеет смысла.
Если вы хотите сохранить другие ветки, но, например, заставить ветку master
запускаться заново без общей истории для других веток, один из безопасных способов добиться этого - создать новый репозиторий и поместить его содержимое в старый:
cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster
Это создает newmaster
ветку в старом репозитории с историей, которая не похожа ни на одну из других веток. Конечно, вы также можете просто перезаписать master
с помощью git push -f
.
Если вы хотите уничтожить все ветки и весь существующий контент, просто запустите
rm -rf .git/
git rebase --root
, вероятно, то, что хотел OP, но, учитывая, что этот ответ имеет два положительных голоса, я воздержусь от его удаления, если кто-то все еще сочтет его актуальным.
- person user1338062; 09.10.2018
Если вы только что зафиксировали его, но не нажали, просто удалите каталог .git и снова git init
...
Ответ на вопрос зависит от того:
Вы хотите удалить первую И ТОЛЬКО фиксацию в ветке (оставив другие ветки такими, какие они были), или
Вы хотите удалить первую фиксацию в какой-либо ветке, «оставив на месте» последующие фиксации (и другие ветки).
Второй из них относительно проще. По сути, вам нужно выполнить переустановку на root - большинство ответов здесь о том, как это сделать.
Сделать второе (удалить первую и единственную фиксацию из ветки, оставив другие ветки в покое) сложнее. Или, по крайней мере, особенно сложнее, если вы хотите, чтобы это произошло и изменение отразилось обратно в GitHub или Bitbucket. Насколько я могу судить, в Git нет никакого способа нажать или принудительно нажать ветку без коммитов. И также (опять же, насколько я понимаю) вообще нет способа создать новую пустую ветку без каких-либо коммитов ни в GitHub, ни в Bitbucket. Таким образом, вам, по сути, нужно создать новый репозиторий, чтобы создать полностью пустую ветку, а затем добавить обратно те ветки, которые вы хотите (включая коммиты, которые вы хотите) - в соответствии с ответом @ user1338062.
Итак, я надеюсь, что этот ответ проясняет то, что могло быть неочевидным - что необходимо использовать два разных подхода для двух разных (более или менее разумных) сценариев, которые оба могут вам понадобиться. уметь делать, чтобы полностью освоить выполнение того, что просит ОП.
git rebase -i --root
. Подробности см. В следующем SO-ответе: stackoverflow.com/questions/2246208/ - person MKroehnert   schedule 03.06.2013git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
- person Jody Bruchon   schedule 11.07.2020