Как удалить первый фиксатор в git?

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

Что такое ревизия перед тем, как совершить какую-либо вещь? У этой версии есть имя или тег?

Ответ 1

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

git update-ref -d HEAD

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

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

git rebase -i --root

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

git checkout --orphan <new-branch-name>

Ответ 2

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

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

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

Ответ 3

# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master

Ответ 4

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

Ответ 5

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

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

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

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

rm -rf .git/

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

  • Вы хотите удалить первый коммит в некоторой ветки, в то время как "оставляя на месте" последующие коммиты (и другие ветки).

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

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

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

Ответ 9

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

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

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

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

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