Изменить первый коммит проекта с помощью Git? [дубликат]


На этот вопрос уже есть ответ здесь:

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

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

4 378

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 ), идея такова:

  1. создать новую временную ветвь
  2. перемотайте его к фиксации, которую вы хотите изменить, используя git reset --hard
  3. измените эту фиксацию (это будет верхняя часть текущей головки, и вы можете изменить содержимое любого файла)
  4. Перебазируйте ветвь поверх измененного коммита, используя:

    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