как изменить несколько коммитов в git, чтобы сменить автора

<p>я сделал серию коммитов в git, и теперь я понимаю, что забыл правильно указать свое имя пользователя и свойства электронной почты пользователя (новый компьютер). я еще не отправил эти коммиты в свой репозиторий, так как я могу исправить эти коммиты до того, как я это сделаю (только 3 последних коммита в основной ветке)?</p><p>я смотрю на <code>git reset</code> и <code>git commit -c <id> --reset-author</code>, но я не думаю, что я на правильном пути.</p>

<p>перебазировать/изменить кажется неэффективным, когда у вас под рукой есть сила ответвления фильтра:</p><pre><code>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. вы можете запустить любую команду shell для определенного коммита или всех коммитов в ребазе.сначала установите ваши настройки git authorgit config --global user.name "john doe" git config --global user.email johndoe@example.com затем сбросить автора для всех коммитов после данного shagit 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" <strong>заметки</strong>  флаг --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это позволяет вам выполнить сброс до определенного коммита, а затем перейти к изменению истории добавления или группировки коммитов.здесь у вас есть объяснение <a href="https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive">https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git -rebase-интерактивный 

если вы чувствуете себя неуверенно по поводу унижения и исправления, вы можете сделать это таким образом. в то же время вы также устанавливаете глобальный конфиг, который вы, вероятно, намереваетесь делать в любом случае. git reset head~ (отменить последний коммит)git config --global user.name "your name"git config --global user.email you@example.comgit commit -m "message"

 <a href="https://help.github.com/articles/changing-author-info/">этот метод был задокументирован github для этой цели. шаги: откройте терминал и сделайте голый клон своего репо  git clone --bare https://github.com/user/repo.git cd repo <ol start="2"> отредактируйте следующий скрипт (заменив old_email, correct_email и correct_name) #!/bin/sh git filter-branch --env-filter ' old_email="your-old-email@example.com" correct_name="your correct name" correct_email="your-correct-email@example.com" if [ "$git\_committer\_email" = "$old_email" ] then export git_committer_name="$correct\_name" export git\_committer\_email="$correct_email" fi if [ "$git\_author\_email" = "$old_email" ] then export git_author_name="$correct\_name" export git\_author\_email="$correct\_email" fi ' --tag-name-filter cat -- --branches --tags </code></pre><ol start="3"> <li>скопируйте/вставьте скрипт в свой терминал и нажмите enter, чтобы запустить его. </li> <li>нажмите ваши изменения с <code>git push --force --tags origin 'refs/heads/*'</code>, и все готово!</li> </ol>