2012-06-06 3 views
72

Мне интересно, как удалить первый коммит в git.Как удалить первый коммит в git?

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

+2

Для начала с мерзавцем, вы должны знать, что пересмотр не имеет смысла. Вы можете говорить о коммитах или их относительных SHA. Кроме того, почему вы хотите это сделать? Первая фиксация - это то, на чем все построено. Вы можете раздавить несколько коммитов вместе, включая первый коммит, который становится новым первым фиксатором, но что означает даже удалить первый фиксатор (или удалить любой, кроме последнего фиксации)? – Shahbaz

+0

@Shahbaz да, вот лучший способ, посмотрите здесь: http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one – timaschew

+4

Вы можете использовать 'git rebase - i --root'. Для получения более подробной информации см. Следующий ответ SO: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert

ответ

122

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

git update-ref -d HEAD 

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

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

git rebase -i --root 

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

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

Очень жаль, что это не принятый ответ. Слишком плохо, что большинство хитов в google более или менее говорят «вы не можете отменить первый коммит». Это помогло мне. Благодаря! – danielpops

+1

Спасибо @danielpops за вашу поддержку! Приятно заметить, что я ответил на этот вопрос 3 года спустя. Тем временем Гит развился. – tzi

+0

Сиротская ветвь сделала трюк. Спасибо! – fanaugen

36

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

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

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

+1

Этот ответ неверный: есть способ вернуться к состоянию до сначала совершить. См. [Ответ tzi] (http://stackoverflow.com/a/32765827/46783) ниже. –

2

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

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

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

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

5

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

2

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

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

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

+1

После этого вы должны удалить ветвь в пульте дистанционного управления перед нажатием. В противном случае при попытке нажать эту ошибку вы получите:! [reject] master -> master (non-fast-forward) - ошибка: не удалось направить некоторые ссылки на «[email protected]: r1/r2.git» - подсказка: обновления были отклонены, поскольку кончик текущей ветви позади - намек: его удаленный аналог. Интеграция удаленных изменений (например, подсказка: «git pull ...») перед повторным нажатием ... - Если вы делаете git, все коммиты возвращаются. – dxvargas

2

Отъезд во временную ветвь:

мерзавца проверки --orphan TE MP_BRANCH

Добавить все файлы:

мерзавец добавить -A

Зафиксируйте изменения:

мерзавец совершающие -am "Initial совершить"

Удалить старую ветку:

git branch -D master

Переименовать тему porary филиал в мастер:

мерзавец филиал -m мастер

Наконец, обновление силы в наше хранилище:

мерзавца толчке -f мастер происхождения

Смежные вопросы