Как изменить несколько коммитов в 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"

это появится ваш редактор, чтобы подтвердить изменения. Все, что вам нужно сделать здесь, это сохранить и выйти, и он будет проходить через каждую фиксацию и запускать команду указывается в флаге-x.

в комментарии @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"

Примечания

  • на --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"