Как изменить автора коммита для одного конкретного коммита?
Я хочу сменить автора одного конкретного коммита в истории. Это не последний коммит.
Я знаю об этом вопросе - как мне изменить автора коммита в git?
Но я думаю о чем-то, где я идентифицирую коммит по хешу или короткому хешу.
28 ответов
Интерактивная перебазировка с точки ранее в истории, чем коммит, который нужно изменить (git rebase -i <earliercommit>
). Измените текст в списке коммитов pick
в edit
рядом с хэшем того, который вы хотите изменить. Затем, когда git предложит вам изменить коммит, используйте это:
git commit --amend --author="Author Name <email@address.com>"
Например, если ваша история коммитов A-B-C-D-E-F
с F
как HEAD
и вы хотите сменить автора C
а также D
тогда вы бы...
- Уточнить
git rebase -i B
( вот пример того, что вы увидите после выполненияgit rebase -i B
команда)- если вам нужно отредактировать
A
использоватьgit rebase -i --root
- если вам нужно отредактировать
- изменить линии для обоих
C
а такжеD
отpick
вedit
- Как только начался ребаз, он сначала остановится на
C
- Ты бы
git commit --amend --author="Author Name <email@address.com>"
- затем
git rebase --continue
- Это снова остановится на
D
- Тогда вы бы
git commit --amend --author="Author Name <email@address.com>"
снова git rebase --continue
- Перебазирование будет завершено.
- использование
git push -f
обновить свое происхождение с обновленными коммитами.
Принятым ответом на этот вопрос является удивительно умное использование интерактивного перебазирования, но, к сожалению, оно вызывает конфликты, если коммит, который мы пытаемся изменить, автор использовал для ветки, которая впоследствии была объединена. В более общем случае, это не работает при обработке грязных историй.
Поскольку я опасаюсь запуска скриптов, которые зависят от установки и сброса переменных среды для перезаписи истории git, я пишу новый ответ на основе этого поста, который похож на этот ответ, но является более полным.
Следующее проверено и работает, в отличие от связанного ответа. Предположим для ясности изложения, что 03f482d6
это коммит, автора которого мы пытаемся заменить, и 42627abe
это фиксация с новым автором.
Оформите коммит, который мы пытаемся изменить.
git checkout 03f482d6
Заставьте автора изменить.
git commit --amend --author "New Author Name <New Author Email>"
Теперь у нас есть новый коммит с хэшем
42627abe
,Оформить заказ оригинальной ветке.
Замените старый коммит на новый локально.
git replace 03f482d6 42627abe
Переписать все будущие коммиты на основе замены.
git filter-branch -- --all
Удалите замену для чистоты.
git replace -d 03f482d6
Нажмите на новую историю (используйте --force только в том случае, если приведенный ниже сбой, и только после проверки работоспособности с помощью
git log
и / илиgit diff
).git push --force-with-lease
Вместо 4-6 вы можете просто перейти на новый коммит:
git rebase -i 42627abe
Сбросьте ваш адрес электронной почты в конфигурации:
git config --global user.email example@email.com
Теперь сбросьте автора вашего коммита без необходимости редактирования:
git commit --amend --reset-author --no-edit
Документация Github содержит скрипт, который заменяет информацию о коммитере для всех коммитов в ветке.
#!/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
Вы можете изменить автора последнего коммита, используя команду ниже.
git commit --amend --author="Author Name <email@address.com>"
Однако, если вы хотите изменить более одного имени автора коммитов, это немного сложно. Вам нужно начать интерактивную перебазировку, затем пометить коммиты как правки, затем изменить их один за другим и закончить.
Начать ребазинг с git rebase -i
, Это покажет вам что-то вроде этого.
Изменить pick
ключевое слово для edit
для коммитов вы хотите изменить имя автора.
Затем закройте редактор. Для начинающих нажмите Escape
затем введите :wq
и ударил Enter
,
Тогда вы увидите свой терминал, как будто ничего не случилось. На самом деле вы находитесь в середине интерактивной перебазировки. Теперь пришло время изменить имя автора вашего коммита, используя команду выше. Он снова откроет редактор. Выйти и продолжить ребаз с git rebase --continue
, Повторите то же самое для количества коммитов, которое вы хотите редактировать. Вы можете убедиться, что интерактивная перебазировка завершена, когда вы получите No rebase in progress?
сообщение.
Мой комментарий 2019 года превратился в ответ:
Чтобы исправить авторинг последних шести коммитов
Сначала установите правильного автора для текущего репозитория Git.
git config --local user.name "FirstName LastName" git config --local user.email first.last@example.com
Затем примените исправление к последним шести коммитам.
git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
Наконец, принудительно нажмите на удаленный репозиторий Git.
git push --force-with-lease
Ответы в вопросе, на который вы ссылались, являются хорошими ответами и охватывают вашу ситуацию (другой вопрос носит более общий характер, поскольку включает переписывание нескольких коммитов).
В качестве предлога, чтобы попробовать git filter-branch
Я написал скрипт для перезаписи имени автора и / или автора сообщения для данного коммита:
#!/bin/sh
#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
# If -f is supplied it is passed to "git filter-branch".
#
# If <branch-to-rewrite> is not provided or is empty HEAD will be used.
# Use "--all" or a space separated list (e.g. "master next") to rewrite
# multiple branches.
#
# If <new-name> (or <new-email>) is not provided or is empty, the normal
# user.name (user.email) Git configuration value will be used.
#
force=''
if test "x$1" = "x-f"; then
force='-f'
shift
fi
die() {
printf '%s\n' "$@"
exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"
TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL
filt='
if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
if test -n "$TARG_EMAIL"; then
GIT_AUTHOR_EMAIL="$TARG_EMAIL"
export GIT_AUTHOR_EMAIL
else
unset GIT_AUTHOR_EMAIL
fi
if test -n "$TARG_NAME"; then
GIT_AUTHOR_NAME="$TARG_NAME"
export GIT_AUTHOR_NAME
else
unset GIT_AUTHOR_NAME
fi
fi
'
git filter-branch $force --env-filter "$filt" -- $br
Найдите способ, который может быстро сменить пользователя и не имеет побочных эффектов для других коммитов.
Простой и понятный способ:
git config user.name "New User"
git config user.email "newuser@gmail.com"
git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit
git commit --amend --reset-author --no-edit
git rebase --continue
git push --force-with-lease
подробные операции
- покажите журналы фиксации и узнайте идентификатор фиксации, предшествующий вашей фиксации, которую вы хотите изменить:
git log
- git rebase start с выбранного идентификатора фиксации на недавний в обратном порядке:
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357
# change word pick to edit, save and exit
edit 809b8f7 change code order
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
- rebase будет остановлен при следующем идентификаторе фиксации, вывод:
Stopped at 809b8f7... change code order
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
- comfirm и продолжайте перебазирование, пока оно не станет
refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
- git нажмите, чтобы обновить
git push --force-with-lease
Зафиксировать перед:
Чтобы исправить автора для всех коммитов, вы можете применить команду из ответа @Amber:
git commit --amend --author="Author Name <email@address.com>"
Или, чтобы повторно использовать свое имя и адрес электронной почты, вы можете просто написать:
git commit --amend --author=Eugen
Фиксация после команды:
Например, чтобы изменить все, начиная с 4025621
:
Ты должен бежать:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
Примечание. Чтобы включить автора с пробелами, такими как имя и адрес электронной почты, автор должен быть заключен в кавычки. Например:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
или добавьте этот псевдоним в ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
А затем запустите:
git reauthor 4025621 Eugen
В поддержку ответа Eugen Konkov, чтобы начать с корневого коммита, используйте --root
флаг. --no-edit
флаг тоже полезен
git rebase --onto <sha> --exec "git commit --amend --author='name <email>' --no-edit" --root
При выполнении git rebase -i
в документе есть кое-что интересное:
Если вы хотите сложить два или более коммитов в один, замените команду
"pick"
для второго и последующих коммитов с"squash"
или же"fixup"
, Если у коммитов были разные авторы, свернутый коммит будет приписан автору первого коммита. Предлагаемое сообщение коммита для сложенного коммита - это конкатенация сообщений коммита первого коммита и тех, которые имеют"squash"
команда, но пропускает сообщения о коммитах коммитов с"fixup"
команда.
- Если у вас есть история
A-B-C-D-E-F
, - и вы хотите изменить коммиты
B
а такжеD
(= 2 коммитов),
тогда вы можете сделать:
git config user.name "Correct new name"
git config user.email "correct@new.email"
- создать пустые коммиты (по одному на каждый коммит):
- вам нужно сообщение для перебазирования
git commit --allow-empty -m "empty"
- начать операцию перебазирования
git rebase -i B^
B^
выбирает родителяB
,
- вы захотите поместить один пустой коммит перед каждым коммитом для изменения
- вы хотите изменить
pick
вsquash
для тех.
Пример чего git rebase -i B^
дам тебе:
pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty
изменить это на:
# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message
Он предложит вам отредактировать сообщения:
# This is a combination of 2 commits.
# The first commit's message is:
empty
# This is the 2nd commit message:
...some useful commit message there...
и вы можете просто удалить первые несколько строк.
Есть еще один шаг к ответу Амбер, если вы используете централизованное хранилище:
git push -f
форсировать обновление центрального репозитория.
Будьте осторожны, чтобы над одной веткой работало не так много людей, потому что это может нарушить последовательность.
РЕШЕНИЕ
Установить (Проект Git рекомендует <tcode id="52136870"></tcode> над <tcode id="52136871"></tcode>)
$ PACKAGE_TOOL install git-filter-repo
Создайте файл в корне репозитория git, содержащий
New Name <new@ema.il> <old@ema.il>
Пробег
git filter-repo --use-mailmap
БОЛЬШЕ ДЕТАЛЕЙ
- перечисляет это как пример в своих документах
- Вместо того, чтобы заменять имя и адрес электронной почты на основе фильтра электронной почты, как в примере выше, взгляните на дополнительные примеры в документации git mailmap.
- Вместо использования по умолчанию
.mailmap
файл вы можете указать свой, вызвавgit filter-repo
с аргументом--mailmap <filename>
. - Еще много примеров того, как дополнительно фильтровать ветку / тег / все, что можно найти в
git-filter-repo
README.md проекта .
Если фиксация, которую вы хотите изменить, не является последней фиксацией, выполните следующие действия. Если ваша фиксация находится в другой ветке, сначала переключитесь на эту ветку.
git checkout имя_ветки
Найдите коммит перед коммитом, который вы хотите изменить, и найдите его хэш. Затем введите команду rebase.
git rebase -i -p хеш фиксации
Затем откроется редактор и введите "изменить" для коммитов, которые вы хотите изменить. Оставьте других с опцией выбора по умолчанию. После изменения введите клавишу "esc" и wq! выйти.
Затем введите команду git commit с опцией поправки.
git commit --amend --author="Имя пользователя по электронной почте" --no-edit
Затем введите следующую команду.
git rebase - продолжить
После обновления автора коммита в локальном репозитории отправьте изменения в удаленный репозиторий.
Использование интерактивной перебазировки
git rebase -i -p <some HEAD before all of your bad commits>
Затем отметьте все ваши плохие коммиты как «редактировать» в файле перебазирования, и когда git попросит вас изменить каждый коммит, сделайте
отредактируйте или просто закройте открывшийся редактор, а затем выполните
git rebase --continue
чтобы продолжить ребаз.
Вы можете вообще не открывать редактор, добавив--no-edit
так что команда будет:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
Единая фиксация
Как отметили некоторые комментаторы, если вы просто хотите изменить самую последнюю фиксацию, команда rebase не нужна. Просто делать
git commit --amend --author "New Author Name <email@address.com>"
Это изменит автора на указанное имя, но коммиттер будет настроен на настроенного вами пользователя в git config user.name и git config user.email. Если вы хотите установить для коммиттера что-то, что вы укажете, это установит и автора, и коммиттера:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
Для сообщения о фиксации слияния я обнаружил, что не могу изменить его, используя rebase
, по крайней мере, на gitlab. Он показывает слияние как фиксацию, но я не могу переустановить этот #sha. Я нашел этот пост полезным.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Эти три строки кода сделали работу по изменению сообщения о фиксации слияния (как автор).
Это может произойти, если вам не хватает настроек на вашем компьютере, например, после форматирования или если Git не настроен правильно без настройки (правильно) этих команд.
git config user.name "Author Name"
git config user.email "<email@address.com>"
Почему бы не упростить себе жизнь, подписавшись на эту статью Atlassian?
- Снимите защиту с ветки, если она защищена. В этом примере это; следовательно, он будет защищен репозиторием исходного кода
Это самый простой сценарий для последней фиксации. Для получения любой "случайной" фиксации вам необходимо:
-
git rebase -i <Earlier Commit>.
- Изменять
pick
наedit
на этом коммите, в котором вы заинтересованы -
git commit --amend --author="Author Name <email@address.com>"
- Снимите защиту с ветки, если она защищена. В этом примере это
master
; следовательно, он будет защищен репозиторием исходного кода -
git push origin master --force
Вы всегда можете
git log
между ними, чтобы быть уверенным, где вы находитесь, прежде чем толкать.
ДОПОЛНИТЕЛЬНО: убедитесь, что вы сохранили свои локальные изменения, если не хотите отправлять их на удаленный компьютер.
$ git status
$ git stash
Обновите автора последней фиксации.
$ git log // Old author in local and remote
$ git commit --amend --author="Author Name <email@address.com>"
$ git log // New Author in local
$ git push origin <branch> --force-with-lease
$ git log // New Author in remote
Тогда, если вы использовали git stash
затем восстанавливает ваши поэтапные изменения
$ git stash pop
$ git status
Затем вам следует обновить конфигурацию для следующих коммитов текущего проекта.
$ git config user.name "Author Name"
$ git config user.email "<email@address.com>"
И проверьте или также отредактируйте это с помощью git config --edit
Уточнение: в редких случаях, когда вы теряете коммиты, используя$ ggpush -f
вы можете восстановить их с помощью reflog. В любом случае используя--force-with-lease
вы защищены даже больше, чем если бы вы использовали только -f
GL
Steps to rename author name after commit pushed
- First type "git log" to get the commit id and more details
git rebase i HEAD~10 (10 is the total commit to display on rebase)
If you Get anything like below
fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.
Then type "git rebase --continue" or "git rebase --abort" as per your need
- now your will rebase window opened, click "i" key from keyboard
- then you will get list of commits to 10 [because we have passed 10 commit above] Like below
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Now you need to add below command just below of the commit you want to edit, like below
pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'
That's it, now just press ESC,:wq and you are all set
Then git push origin HEAD:BRANCH NAME -f [please take care of -f Force push]
like
git push -f
orgit push origin HEAD: dev -f
В дополнение к ответу Евгения Конькова можно сохранить дату фиксации/автора. Чтобы изменить только автора, но не дату последних трех коммитов, используйте
git rebase --onto HEAD~3 --exec 'GIT_COMMITTER_DATE="$(git log -n 1 --format=%aD)" git commit --amend --reset-author --no-edit --date="$(git log -n 1 --format=%aD)"' HEAD~3
затем примените силу толчка
git push --force-with-lease
Существует ярлык, применимый к вопросу, получившему наибольшее количество голосов: использование вместо.
exec
позволяет выполнить команду для указанного коммита.
Использование позволяет избежать использования
edit
, выйдя на терминал и запустив
git
команда для каждого коммита git.
Это особенно полезно, если вам нужно изменить несколько коммитов в истории.
Шаги следующие:
- выполнить перебазирование на более раннюю фиксацию (
git rebase -i <earliercommit>
) - в открывшемся редакторе добавьте строку после каждой строки фиксации, которую вы хотите отредактировать, и добавьте
exec git commit --amend --author="Author Name <email@address.com>" --no-edit
(или используя--reset-author
если вы хотите сбросить до значения, установленного в конфигурации git) - сохранить и выйти - это запустит указанную команду для каждой фиксации, эффективно меняя автора
Пример содержимого редактора (для изменения первых двух коммитов автора):
pick 1fc6c95 Patch A
exec git commit --amend --author="Author Name <email@address.com>" --no-edit
pick 6b2481b Patch B
exec git commit --amend --author="Author Name <email@address.com>" --no-edit
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B
# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Следует упомянуть одну важную вещь, особенно если вы удаляете информацию об авторе в целях конфиденциальности.
После операций из верхних ответов:
git commit --amend --author="Author Name <email@address.com>"
git push -f
Коммиты со старой информацией об авторе все еще существуют в локальном и удаленном кеше git .
На Github вы по-прежнему можете получить доступ к коммиту по SHA1 с предупреждением: «Этот коммит не принадлежит ни одной ветке этого репозитория и может принадлежать ветвлению за пределами репозитория».
Сбор мусора можно выполнить в локальном репо:
git gc
Однако для Github, для которого вы не можете запустить эту команду, перейдите на страницу поддержки https://support.github.com/request/remove-data и отправьте заявку на очистку кэшированных представлений в своем репозитории.
Этот последний шаг применяется ко всем операциям изменения/удаления фиксации.
Предупреждение. В этой статье рассказывается, как выполнять коммиты с конфиденциальными данными, недоступными из каких-либо веток или тегов в вашем репозитории на GitHub.com. Однако эти коммиты по-прежнему могут быть доступны в любых клонах или вилках вашего репозитория, напрямую через их хэши SHA-1 в кешированных представлениях на GitHub, а также через любые запросы на включение, которые ссылаются на них. Вы не можете удалить конфиденциальные данные из клонов вашего репозитория других пользователей, но вы можете навсегда удалить кэшированные представления и ссылки на конфиденциальные данные в запросах на включение на GitHub, обратившись в службу поддержки GitHub.
Вы можете использовать эти команды с официальной страницы github
https://help.github.com/en/github/using-git/changing-author-info
вот команды
#!/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
здесь вы можете изменить старый адрес электронной почты на новое имя пользователя и адрес электронной почты.
Глобальное изменение имени и электронной почты коммиттера:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Изменение имени и адреса электронной почты коммиттера для каждого репозитория:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Изменение информации об авторе только для следующего коммита:
$ git commit --author="John Doe <john@doe.org>"
Подсказка: для другой ситуации и для получения дополнительной информации прочтите ссылку на сообщение.
Существует также ленивый подход к этой проблеме, особенно если у вас есть несколько коммитов, которые вы хотите изменить. В моем случае у меня была новая ветка с несколькими коммитами с неправильным автором, так что мне помогло:
Перейдите в исходную ветку:
git checkout develop
Создайте из него новую ветку:
git checkout -b myFeature develop
Объединить его без информации о коммите как один коммит:
git merge --no-commit --squash branchWrongAuthor
Вы также можете внести изменения:
git stage .
Измените имя автора и передайте изменения:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
И это все, вы можете подтолкнуть изменения.
git push
После этого вы можете удалить ветку с неправильным автором.
Предпочтительный ответ , тот, который используетgit rebase -i
эффективен, но, как подчеркивается в этом другом ответе , он становится беспорядочным, когда есть слияния вокруг коммитов для редактирования. И использованиеgit replace
умный, ноgit filter-branch
переписывает всю историю других веток и тегов, чего мы вообще не хотим.
Я хотел поделиться альтернативой первому ответу, который остается простым даже при слиянии. В моем случае, когда я использовалgit rebase -i <earlier-commit>
, мне нужно сначала решить конфликт, прежде чем приступить к перебазированию. На самом деле проще использовать команду разрыва , чем команду редактирования . И непосредственно перебазируйте фиксацию, на которую мы нацеливаемся.
Возьмем пример и предположимgit log
показывает...
commit a12afg
...
commit dloe7a
...
commit gh7ag1
...
commit qp3zaa
...
И допустим, вы хотите обновить автора, сообщение или подпись коммита для коммитаgh7ag1
. Вы можете продолжитьgit rebase -i gh7ag1
. В вашем редакторе вы увидите:
pick dloe7a
pick a12afg
Просто добавьте команду разрыва:
break
pick dloe7a
pick a12afg
Сохранять (:wq
с ВИ,Ctrl+O
затемCtrl+X
с нано). И теперь вы вернулись сразу после фиксации. Вы можете запуститьgit commit --amend
для обновления автора, сообщения или подписи (например,git commit --amend -S --author="Your Name <your-email>"
). Подтвердить с помощьюgit log --show-signature
. Если все верно, вы можете продолжитьgit rebase --continue
.
И у вас может быть сколько угодно команд break в rebase. Продолжение переместит к следующему разрыву, если он есть, или применит оставшиеся коммиты (при условии, что они помечены какpick
).
Если вам нужно изменить коммит AUTHOR OF THE LAST и никто другой не использует ваш репозиторий, вы можете отменить свой последний коммит с помощью:
git push -f origin last_commit_hash:branch_name
измените имя автора вашего коммита с помощью:
git commit --amend --author "type new author here"
Выйдите из редактора, который открывается, и снова нажмите ваш код:
git push
Если вы хотите изменить автора сразу для всех коммитов, совершенных определенным автором:
Запустите следующую команду, чтобы просмотреть все коммиты и обновить информацию об авторе в соответствии с предоставленными условиями:
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "Older Author Email" ]; then
export GIT_AUTHOR_NAME="New Author Name"
export GIT_AUTHOR_EMAIL="New Author Email""
fi
' -- --all
Затем с силой толкните ветку.
git push --force origin branch-name