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

Я сделал серию коммитов в Git, и теперь понимаю, что я забыл правильно настроить свойства имени пользователя и пользователя электронной почты (новая машина). Я еще не подтолкнул эти коммиты к моему репозиторию, так как я могу исправить эти коммиты, прежде чем я это сделаю (только 3 последних коммита на главной ветке)?

Я смотрел git reset и git commit -C <id> --reset-author, но я не думаю, что нахожусь на правильном пути.

Ответ 1

Rebase/modify кажется неэффективным, когда у вас есть мощность ветки фильтра:

git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]; then
     [email protected];
     GIT_AUTHOR_NAME="Correct Name";
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
     GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all

(разделить строки для ясности, но не обязательно)

Обязательно проверяйте результат, когда вы закончите, чтобы убедиться, что вы ничего не изменили, что вы не хотели!

Ответ 2

Интерактивный подход к переадресации довольно хорош при использовании в сочетании с exec. Вы можете запустить любую команду оболочки против определенного коммита или всех коммитов в rebase.

Сначала установите настройки автора git

git config --global user.name "John Doe"
git config --global user.email [email protected]

Затем до reset автор для всех фиксирует после заданного 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 <[email protected]>' -CHEAD"

Ответ 3

Чтобы изменить автора только для последнего фиксации:

git commit --amend --author 'Author Name <[email protected]>' --no-edit

Предположим, вы хотите изменить автора только для последних N коммитов:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --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 <[email protected]>' --no-edit
pick dc18f70 bugfix

Ответ 4

Я верю, что вы ищете git rebase --interactive

Это позволяет вам выполнить сброс до определенного коммита, а затем перейти к изменению истории добавления или группировки коммитов.

Здесь у вас есть объяснение https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase -interactive

Ответ 5

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

git reset HEAD~ (отменить последнее коммит)

git config --global user.name "Your Name"

git config --global user.email [email protected]

git commit -m "message"

Ответ 6

Этот метод был задокументирован github для этой цели. Шаги:

  1. Откройте терминал и сделайте голый клон своего репо
git clone --bare https://github.com/user/repo.git
cd repo
  1. Отредактируйте следующий скрипт (заменив OLD_EMAIL, CORRECT_EMAIL и CORRECT_NAME)
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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
  1. Скопируйте/вставьте скрипт в свой терминал и нажмите Enter, чтобы запустить его.
  2. git push --force --tags origin 'refs/heads/*' свои изменения с помощью git push --force --tags origin 'refs/heads/*' и все готово!