Изменить первое завершение проекта с помощью Git?

Я хочу что-то изменить в первом коммите моего проекта, потеряв все последующие коммиты. Есть ли способ сделать это?

Я случайно перечислил свое сырое сообщение в комментарии в исходном коде, и я хотел бы изменить его, поскольку я получаю спам от индексации ботов GitHub.

Ответ 1

Как упоминалось ecdpalma ниже, git 1.7.12+ (август 2012) улучшил опцию --root для git rebase:

"git rebase [-i] --root $tip" теперь можно использовать для перезаписи всей истории, ведущей к "$tip", вплоть до корневой фиксации.

Новое поведение было первоначально обсуждалось здесь:

Я лично считаю, что "git rebase -i --root" нужно просто работать, не требуя "--onto" и позволить вам "редактировать" даже первый в истории.
Понятно, что никто не беспокоился, так как люди гораздо реже переписываются в самом начале истории, чем в противном случае.

Патч следует.


(исходный ответ, февраль 2010 г.)

Как упоминалось в git FAQ (и этот вопрос SO), идея такова:

  • Создать новую временную ветку
  • Перемотайте его на фиксацию, которую хотите изменить, используя git reset --hard
  • Измените это commit (это будет верхняя часть текущего HEAD, и вы можете изменить содержимое любого файла)
  • Разверните ветку поверх измененной фиксации, используя:

    git rebase --onto <tmp branch> <commit after changed> <branch>`
    

Трюк заключается в том, чтобы убедиться, что информация, которую вы хотите удалить, не будет повторно введена позже в другом месте в вашем файле. Если вы подозреваете, что вам нужно использовать filter-branch --tree-filter, чтобы убедиться, что содержимое этого файла не содержит каких-либо данных, передающих разумные данные.

В обоих случаях вы переписываете SHA1 каждого коммита, поэтому будьте осторожны, если вы уже опубликовали ветвь, которую вы изменяете. Вы, вероятно, не должны это делать, если ваш проект еще не открыт, а другие люди не работают на основе коммитов, которые вы собираетесь переписать.

Ответ 3

git rebase -i позволяет вам удобно редактировать любые предыдущие фиксации, , за исключением корневой фиксации. Следующие команды показывают, как это сделать вручную.

# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`

# switch to a new branch pointing at the first commit
git checkout -b new-root root

# make any edits and then commit them with:
git commit --amend

# check out the previous branch (i.e. master)
git checkout @{-1}

# replace old root with amended version
git rebase --onto new-root root

# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue

# delete the branch "new-root"
git branch -d new-root

# delete the tag "root"
git tag -d root

Ответ 4

Если вы хотите изменить только первое коммитирование, вы можете попробовать git переустановить и исправить фиксацию, похожую на эту запись: Как изменить указанный коммит в git?

И если вы хотите изменить все коммиты, содержащие сырое электронное письмо, лучше всего выбрать фильтр-ветку. Пример того, как изменить адрес электронной почты глобально на книге Pro Git, и вы можете найти эту ссылку полезной http://git-scm.com/book/en/Git-Tools-Rewriting-History