Как изменить несколько коммитов в Git, чтобы изменить автора
Я сделал ряд коммитов в Git, и теперь я понимаю, что забыл правильно установить имя пользователя и свойства электронной почты пользователя (новая машина). Я еще не отправил эти коммиты в свой репозиторий, поэтому как я могу исправить эти коммиты, прежде чем я это сделаю (только 3 последних коммита в главной ветке)?
Я смотрел на git reset
и git commit -C <id> --reset-author
, но я не думаю, что я на правильном пути.
5 ответов:
Rebase / amend кажется неэффективным, когда у вас есть сила фильтра-ветви на кончиках ваших пальцев:
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then GIT_AUTHOR_EMAIL=correct@email; GIT_AUTHOR_NAME="Correct Name"; GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL; GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(разделить по линиям для ясности, но не обязательно)
обязательно проверьте результат, когда вы закончите, чтобы убедиться, что вы не изменили ничего, что вы не хотели!
интерактивный подход к перебазированию довольно хорош при использовании в сочетании с exec. Вы можете запустить любую команду оболочки против определенного коммита или всех коммитов в ребазе.
Сначала установите настройки автора git
git config --global user.name "John Doe" git config --global user.email johndoe@example.com
затем сбросить автора для всех коммитов после заданного SHA
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
это появится ваш редактор, чтобы подтвердить изменения. Все, что вам нужно сделать здесь, это сохранить и выйти, и он будет проходить через каждую фиксацию и запускать команду указанных в -Х флаг.
в комментарии @Dave ниже вы также можете изменить автора, сохраняя исходные метки времени с помощью:
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
чтобы изменить автора только для последней фиксации:
git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
Предположим, вы хотите изменить автора только для последних N коммитов:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
Примечания
- the
--no-edit
флаг убеждаетсяgit commit --amend
не требует дополнительного подтверждения- при использовании
git rebase -i
, вы можете вручную выбрать коммиты, где изменить автора,файл, который вы редактируете, будет выглядеть так:
pick 897fe9e simplify code a little pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit pick dc18f70 bugfix
Я считаю, что вы ищете это
git rebase --interactive
Это позволяет перейти сброс к конкретной фиксации, а затем перейти бросить историю изменения добавления или группировки коммитов
здесь у вас есть объяснение http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive
если вы чувствуете себя небезопасно о обесценивания и изменения вы могли бы сделать это таким образом. В то же время вы также устанавливаете глобальную конфигурацию, которую вы, вероятно, хотели сделать в любом случае.
git reset HEAD~
(отмена последнего коммита)
git config --global user.name "Your Name"
git config --global user.email you@example.com
git commit -m "message"