Изменить первый коммит проекта с помощью Git?[дубликат]
-
20-09-2019 - |
Вопрос
На этот вопрос уже есть ответ здесь:
- Отредактировать корневой коммит в Git? 5 ответов
Я хочу изменить что-то в первом коммите моего проекта, не теряя при этом все последующие коммиты.Есть какой-либо способ сделать это?
Я случайно указал свой необработанный адрес электронной почты в комментарии к исходному коду и хотел бы изменить его, так как я получаю спам от ботов, индексирующих GitHub.
Решение
Как упоминал экдпальма ниже, мерзавец 1.7.12+ (август 2012 г.) расширил возможности --root
для git rebase
:
"git rebase [-i] --root $tip
"теперь можно использовать, чтобы переписать всю историю, ведущую к "$tip
" вплоть до корневого коммита.
Это новое поведение изначально было обсуждалось здесь:
Я лично думаю»
git rebase -i --root
"нужно заставить просто работать, не требуя "--onto
" и позвольте вам "редактировать" даже первый в истории.
Понятно, что никто не заморачивался, ведь в самом начале истории переписывают гораздо реже, чем в противном случае.
(исходный ответ, февраль 2010 г.)
Как упоминалось в Часто задаваемые вопросы по Git (и это ТАК вопрос), идея такая:
- Создать новую временную ветку
- Перемотайте его к коммиту, который вы хотите изменить, используя
git reset --hard
- Измените этот коммит (он будет находиться вверху текущего HEAD, и вы сможете изменить содержимое любого файла)
Перебазируйте ветку поверх измененного коммита, используя:
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.В книге приведен пример того, как изменить адрес электронной почты глобально. Про Гит, и эта ссылка может оказаться вам полезной http://git-scm.com/book/en/Git-Tools-Rewriting-History