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

StackOverflow https://stackoverflow.com/questions/2246208

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

"git rebase [-i] --root $tip"теперь можно использовать, чтобы переписать всю историю, ведущую к "$tip" вплоть до корневого коммита.

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

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

А патч подписан.


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

Как упоминалось в Часто задаваемые вопросы по Git (и это ТАК вопрос), идея такая:

  1. Создать новую временную ветку
  2. Перемотайте его к коммиту, который вы хотите изменить, используя git reset --hard
  3. Измените этот коммит (он будет находиться вверху текущего HEAD, и вы сможете изменить содержимое любого файла)
  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.В книге приведен пример того, как изменить адрес электронной почты глобально. Про Гит, и эта ссылка может оказаться вам полезной http://git-scm.com/book/en/Git-Tools-Rewriting-History

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top