Изменить первый коммит проекта с помощью Git? [дубликат]
На этот вопрос уже есть ответ здесь:
- редактировать корневой коммит в Git? 5 ответов
Я хочу изменить что-то в первом коммите моего проекта без потери всех последующих коммитов. Есть ли способ сделать это?
Я случайно указал свою необработанную электронную почту в комментарии в исходном коде, и я хотел бы изменить ее по мере получения спам от ботов индексирования GitHub.
4 ответа:
Как упоминалось ecdpalma ниже, git 1.7.12+ (август 2012) расширил опцию
--root
дляgit rebase
:"
git rebase [-i] --root $tip
" Теперь можно использовать для перезаписи всей истории, ведущей к "$tip
" вплоть до корневой фиксации.Это новое поведение было первоначально обсуждено здесь :
Я лично считаю, что "git rebase -i --root
" следует заставить просто работать, не требуя "--onto
", и позволить вам "редактировать" даже первый в истории.
Это понятно, что никого это не беспокоило, так как люди гораздо реже переписывают в самом начале истории, чем в других случаях.Патчпоследовал за .
(оригинальный ответ, февраль 2010 г.)
Как упоминалось в git FAQ (и это SO question ), идея такова:
Хитрость заключается в том, чтобы убедиться, что информация, которую вы хотите удалить, не будет повторно введена более поздней фиксацией в другом месте вашего файла. Если вы подозреваете, что, то вы должны использовать
- создать новую временную ветвь
- перемотайте его к фиксации, которую вы хотите изменить, используя
git reset --hard
- измените эту фиксацию (это будет верхняя часть текущей головки, и вы можете изменить содержимое любого файла)
Перебазируйте ветвь поверх измененного коммита, используя:
git rebase --onto <tmp branch> <commit after changed> <branch>`
filter-branch --tree-filter
чтобы убедиться, что содержимое этого файла не содержит в какой-либо фиксации разумной информации.В обоих случаях вы в конечном итоге переписываете SHA1 каждого коммита, поэтому будьте осторожны, если вы уже опубликовали ветку, в которой изменяете содержимое. Вы, вероятно, не должны этого делать, если ваш проект еще не является публичным, и другие люди не основали работу над коммитами, которые вы собираетесь переписать.
Как указано в 1.7.12 примечания к выпуску , вы можете использовать
$ git rebase -i --root
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
Если вы хотите изменить только первый коммит, вы можете попробовать git rebase и изменить коммит, который похож на этот пост: Как изменить указанный коммит в git?
И если вы хотите изменить все коммиты, которые содержат необработанную электронную почту, filter-branch-лучший выбор. Есть пример того, как изменить адрес электронной почты глобально в книге Pro Git, и вы можете найти эту ссылку полезной http://git-scm.com/book/en/Git-Tools-Rewriting-History