Я хочу сменить автора одного конкретного коммита в истории. Это не последний коммит.
Я знаю об этом вопросе - Как мне изменить автора коммита в git?
Но я думаю о чем-то, где я идентифицирую коммит по хешу или короткому хешу.
Я хочу сменить автора одного конкретного коммита в истории. Это не последний коммит.
Я знаю об этом вопросе - Как мне изменить автора коммита в git?
Но я думаю о чем-то, где я идентифицирую коммит по хешу или короткому хешу.
Ответы:
Интерактивная перебазировка с точки ранее в истории, чем коммит, который нужно изменить ( git rebase -i <earliercommit>
). В список коммитов время нормированный, изменить текст от pick
к edit
рядом с хэш , который вы хотите изменить. Затем, когда git предложит вам изменить коммит, используйте это:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Например, если ваша история коммитов A-B-C-D-E-F
с F
as HEAD
, и вы хотите сменить автора C
и D
, то вы бы ...
git rebase -i B
( вот пример того, что вы увидите после выполнения git rebase -i B
команды )
A
, используйтеgit rebase -i --root
C
и D
с pick
наedit
:wq
).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 rebase -i <commit>
vim
. Чтобы сохранить и выйти, введите Esc: wq Enter. С другой стороны, если это Nano, и вы видите такие вещи, как «WriteOut: ^ O» внизу, тогда вам следует использовать Ctrl + O, Enter, Ctrl + X.
--no-edit
опцию. git commit --amend --reset-author --no-edit
не открывается редактор Доступно с git 1.7.9.
git rebase -i --root
Общепринятый ответ на этот вопрос удивительно умное использование интерактивных перебазироваться, но , к сожалению , демонстрирует конфликты , если совершить мы пытаемся изменить автор раньше на ветке , который впоследствии слились в. В более общем плане , она не работает при обработке грязных историй.
Поскольку я опасаюсь запуска скриптов, которые зависят от установки и сброса переменных среды для перезаписи истории 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 rebase -i
. Никогда не слышал об этом git replace
раньше. +1
--force-with-lease
вместо -f
. Это безопаснее.
git filter-branch -- --all
во всех ветвях, в которых находился исходный коммит , происходит изменение коммитов. Если у вас недостаточно учетных данных (или вы просто не хотите изменять историю веток других пользователей), хорошо быть осторожным с этим ответом.
Документация 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
Нажмите исправленную историю на GitHub:
git push --force --tags origin 'refs/heads/*'
ИЛИ, если вы хотите нажать выбранные ссылки на ветви, используйте
git push --force --tags origin 'refs/heads/develop'
clone
/ push
, вы получите резервное пространство имен refs/original/
. Я не мог найти способ интеллектуального удаления этого пространства имен, поэтому я в итоге удалил каталог .git/refs/original
, который сработал.
git push -f
будет принудительно принудительно изменить репо.
Сбросьте ваш адрес электронной почты в конфигурации:
git config --global user.email example@email.com
Теперь сбросьте автора вашего коммита без необходимости редактирования:
git commit --amend --reset-author --no-edit
It's not last commit.
Так как они amend
это сделали ?
git reset HEAD~
предложенные строки, а затем снова сделал следующий коммит вручную. Сработало нормально!
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 commit --amend --author="Author Name <email@address.com>"
Однако, если вы хотите изменить более одного коммита, имя автора немного сложнее. Вам нужно начать интерактивную перебазировку, затем пометить коммиты как правки, затем изменить их один за другим и закончить.
Начать ребазинг с git rebase -i
. Это покажет вам что-то вроде этого.
Измените pick
ключевое слово edit
на коммиты, которые вы хотите изменить имя автора.
Затем закройте редактор. Для начинающих нажмите, Escape
затем напечатайте :wq
и нажмите Enter
.
Тогда вы увидите свой терминал, как будто ничего не случилось. На самом деле вы находитесь в середине интерактивной перебазировки. Теперь пришло время изменить имя автора вашего коммита, используя команду выше. Он снова откроет редактор. Выйдите и продолжите ребаз с git rebase --continue
. Повторите то же самое для количества коммитов, которое вы хотите отредактировать. Вы можете убедиться, что интерактивное обновление завершено, когда вы получите No rebase in progress?
сообщение.
pick
действие и добавлять после каждой строкиexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Ответы в вопросе, на который вы ссылались, являются хорошими ответами и охватывают вашу ситуацию (другой вопрос носит более общий характер, поскольку включает переписывание нескольких коммитов).
В качестве предлога, чтобы попробовать 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
Зафиксировать перед:
Чтобы исправить автора для всех коммитов, вы можете применить команду из ответа @ 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
git shortlog -e -s
.
Есть еще один шаг к ответу Амбер, если вы используете централизованное хранилище:
git push -f
форсировать обновление центрального репозитория.
Будьте осторожны, чтобы над одной веткой работало не так много людей, потому что это может нарушить последовательность.
При этом в документе 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...
и вы можете просто удалить первые несколько строк.
В поддержку ответа Евгения Конкова , чтобы начать с корневого коммита, используйте --root
флаг. --no-edit
Флаг полезно тоже
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Найти способ, который может быстро изменить пользователя и не имеет побочных эффектов для других коммитов.
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 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
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
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 push --force-with-lease
Если коммит, который вы хотите изменить, не является последним коммитом, выполните следующие шаги. Если ваш коммит находится в другой ветке, то сначала переключитесь на эту ветку.
git checkout branch_name
Найдите коммит перед коммитом, который вы хотите изменить, и найдите его хеш. Затем выполните команду rebase.
git rebase -i -p хэш коммита
Затем откроется редактор и введите «edit» для коммитов, которые вы хотите изменить. Оставьте других с опцией «выбрать» по умолчанию. После изменения введите клавишу «esc» и wq! выходить.
Затем выполните команду git commit с возможностью изменения.
git commit --amend --author = "Имя пользователя электронной почты" --no-edit
Затем выполните следующую команду.
git rebase - продолжение
Как только автор коммитов обновится в локальном репозитории, отправьте изменения в удаленный репозиторий.
Существует также ленивый подход к этой проблеме, особенно если у вас есть несколько коммитов, которые вы хотите изменить. В моем случае у меня была новая ветка с несколькими коммитами с неправильным автором, так что мне помогло:
Перейдите в исходную ветку:
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 HEAD ~ 10 (10 - общий коммит, отображаемый при 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.
Затем введите «git rebase --continue» или «git rebase --abort» в соответствии с вашими потребностями
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Теперь вам нужно добавить команду ниже под коммитом, который вы хотите редактировать, как показано ниже
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>'
Вот и все, теперь просто нажмите ESC: wq и все готово
Затем git push origin HEAD: ИМЯ ФИЛИАЛА -f [пожалуйста, позаботьтесь о -f Force push]
как git push -f
илиgit push origin HEAD: dev -f
git push
команды?
Изменение имени коммиттера и адреса электронной почты в глобальном масштабе:
$ 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>"
Подсказка : для другой ситуации и получения дополнительной информации прочитайте ссылку на пост .
Если вам нужно изменить коммит AUTHOR OF THE LAST и никто другой не использует ваш репозиторий, вы можете отменить свой последний коммит с помощью:
git push -f origin last_commit_hash:branch_name
измените имя автора вашего коммита с помощью:
git commit --amend --author "type new author here"
Выйдите из редактора, который открывается, и снова нажмите ваш код:
git push
Для сообщения коммита слияния я обнаружил, что не могу изменить его, используя rebase
, по крайней мере, gitlab. Он показывает слияние как коммит, но я не могу переназначить его на #sha. Я нашел этот пост полезным.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Эти три строки кода сделали работу по изменению сообщения фиксации слияния (как автор).
Вы можете использовать эти команды с официальной страницы 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
Здесь вы можете изменить старую электронную почту на новое имя пользователя и адрес электронной почты.