Я хочу изменить автора одного конкретного коммита в истории. Это не последний коммит.
Я знаю об этом вопросе - Как изменить автора коммита в git?.
Но я думаю о чем-то, где я идентифицирую коммит по хэшу или короткому хэшу.
Выполните интерактивный ребазинг с более ранней точки в истории, чем коммит, который вам нужно изменить (git rebase -i <earliercommit>
). В списке возвращаемых коммитов измените текст с pick
на edit
рядом с хэшем того коммита, который вы хотите изменить. Затем, когда git предложит вам изменить коммит, используйте следующее:
git commit --amend --author="Author Name <[email protected]>"
Например, если ваша история коммитов имеет вид 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 rebase --continue
.D
.git commit --amend --author="Имя автора<[email protected]>"
.git rebase --continue
.git push -f
, чтобы обновить ваш источник обновленными коммитами.Принятый ответ на этот вопрос - удивительно умное использование интерактивного ребаза, но, к сожалению, оно демонстрирует конфликты, если коммит, который мы пытаемся изменить, был в филиале, который впоследствии был объединен. В целом, это не работает при обработке грязной истории.
Поскольку я опасаюсь запуска сценариев, которые зависят от настройки и отмены переменных среды для переписывания истории git, я пишу новый ответ на основе [этого поста](https://help.github.com/articles/changing-author-info /) который похож на этот ответ, но.
Следующее проверено и работает, в отличие от связанного ответа. Предположим для ясности изложения, что «03f482d6» - это коммит, автора которого мы пытаемся заменить, а «42627abe» - это коммит с новым автором.
Проверьте коммит, который мы пытаемся изменить.
git checkout 03f482d6
Заставьте автора измениться.
git commit --amend --author "Новое имя автора < Новый автор Email >"
Теперь у нас есть новый коммит с хэшем, который считается «42627abe».
Оформить заказ оригинальной ветки.
Замените старый коммит новым локально.
Git заменить 03f482d6 42627abe
Перепишите все будущие коммиты на основе замены.
git filter-branch - --all
Удалить замену для чистоты.
Git заменить -d 03f482d6
Нажмите на новую историю (используйте --force только в случае сбоя ниже и только после проверки работоспособности с помощью git log
и / или git diff
).
Git Push --force-с-арендой
Вместо 4-6 вы можете просто перейти на новый коммит:
git rebase -i 42627abe
Документация Github содержит сценарий, который заменяет информацию о коммиттере для всех коммитов в ветке.
#!/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
Сбросьте свою электронную почту в конфигурацию глобально:
git config --global user.email [email protected]
Теперь сбросьте настройки автора вашего коммита без необходимости редактирования:
git commit --amend --reset-author --no-edit
Вы можете изменить автора последнего коммита, используя команду ниже.
git commit --amend --author = "Имя автора < [email protected] >"
Однако, если вы хотите изменить более одного имени автора коммитов, это немного сложно. Вам нужно запустить интерактивную ребазу, затем пометить коммиты как редактирование, затем поменять их по одному и закончить.
Начните перебазирование с git rebase -i
. Это покажет вам что-то вроде этого.
https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png!
Измените ключевое слово pick
на edit
для коммитов, которые вы хотите изменить, имя автора.
https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png!
Затем закройте редактор. Для начинающих нажмите «Escape», затем введите : wq
и нажмите «Enter».
Тогда вы увидите свой терминал, как будто ничего не случилось. На самом деле вы находитесь в середине интерактивного ребаза. Теперь пришло время изменить имя автора вашего коммита, используя команду выше. Это снова откроет редактор. Выйти и продолжить ребазу с git rebase --continue
. Повторите то же самое для количества коммитов, которые вы хотите редактировать. Вы можете убедиться, что интерактивная ребаза завершена, когда вы получите No rebase в процессе?
сообщение.
Ответы в вопросе, на который вы дали ссылку, являются хорошими ответами и охватывают вашу ситуацию (другой вопрос является более общим, поскольку он включает переписывание нескольких коммитов).
В качестве предлога, чтобы попробовать git filter-branch
, я написал скрипт, который переписывает имя автора и/или email автора для данного коммита:
#!/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 protected]>"
Или, чтобы повторно использовать свое имя и адрес электронной почты, вы можете просто написать:
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 <[email protected]>\"" 4025621
или добавьте этот псевдоним в ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
А потом беги
git reauthor 4025621 Eugen
Есть еще один шаг к ответу Амбер, если вы используете централизованный репозиторий:
git push -f
, чтобы заставить обновление центрального хранилища.
Будьте осторожны, чтобы не было много людей, работающих в одной и той же отрасли, потому что это может разрушить последовательность.
При выполнении git rebase -i
в документации есть интересный момент:
Если вы хотите объединить два или более коммита в один, замените команду
"pick"
для второго и последующих коммитов на"squash"
или"fixup"
. Если у коммитов были разные авторы, свернутый коммит будет приписан автору первого коммита. Предлагаемое сообщение о фиксации для свернутого коммита является объединением сообщений о фиксации первого коммита и коммитов с командой"squash"
, но опускает сообщения о фиксации коммитов с командой"fixup"
.
A-B-C-D-E-F
,B
и D
(= 2 коммита),то вы можете сделать следующее:
git config user.name "Исправить новое имя"
.git config user.email "[email protected]"
.git commit --allow-empty -m "empty"
.git rebase -i B^
B^
выбирает родителя B
.pick
на quash
.Пример того, что даст вам 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...
и вы можете просто удалить первые несколько строк.
В дополнение к ответу Eugen Konkov, чтобы начать с корневого коммита, используйте флаг --root
. Флаг --no-edit
тоже полезен
git rebase --root --exec "git commit --amend --author = 'name < email >' --no-edit"
Что касается сообщения о коммите слияния, я обнаружил, что не могу изменить его, используя rebase
, по крайней мере, на gitlab. Он показывает слияние как коммит, но я не могу перебазировать на эту #sha. Я нашел это сообщение полезно.
git checkout < sha of merge >
git commit --amend # редактировать сообщение
git rebase HEAD privious_branch
Эти три строки кода сделали работу по изменению сообщения о коммите слияния (например, автора).
Если вам нужно изменить коммит AUTHOR OF LAST, а другой не использует ваш репозиторий, вы можете отменить свой последний коммит с помощью:
git push -f origin last_commit_hash:branch_name
изменить имя автора вашего коммита с помощью:
git commit --amend --author "type new author here"
Выйдите из открывающегося редактора и снова нажмите свой код:
git push
Существует также ленивый подход к этой проблеме, особенно если у вас есть более одного коммита, который вы хотите изменить. В моем случае у меня была новая ветка с несколькими коммитами с неправильным автором, так что мне помогло:
Перейдите в исходную ветку:
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 оформить заказ branch_name
Найдите коммит перед коммитом, который вы хотите изменить, и найдите его хэш. Затем введите команду rebase.
git rebase -i -p хэш коммита
Затем откроется редактор и войдет в «править» коммиты, которые вы хотите изменить. Оставьте другие с параметром «pick» по умолчанию. После изменения введите клавишу «esc» и wq! выйти.
Затем введите команду git commit с параметром изменения.
git commit --amend --author = "Имя пользователя электронной почты" --no-edit
Затем введите следующую команду.
Git Rebase - продолжить
После обновления автора коммита в локальном хранилище нажмите изменения в удаленном хранилище.
Шаги по переименованию имени автора после фиксации
Сначала введите «git log», чтобы получить идентификатор коммита и более подробную информацию
git rebase i HEAD ~ 10 (10 - это общий коммит, отображаемый на rebase)
«Если вы получите что-то вроде ниже»
`fatal: кажется, что уже есть каталог rebase-merge, и Интересно, находитесь ли вы в середине другого ребаза?. Если это так кейс, пожалуйста, попробуйте
git rebase (- продолжить | --abort | --skip)
Если это не так, пожалуйста, rm -fr ".git / rebase-merge" и запусти меня снова. Я останавливаюсь на случай, если у тебя еще что-нибудь есть ценно там.
Затем введите «git rebase --continue» или «git rebase --abort» в соответствии с вашими потребностями
теперь ваше окно перебазирования откроется, нажмите клавишу «i» с клавиатуры
тогда вы получите список коммитов до 10 [потому что мы прошли 10 коммитов выше] Как ниже
выберите 897fe9e немного упростите код
pick abb60f9 добавить новую функцию
выберите dc18f70 bugfix
выберите 897fe9e немного упростите код exec git commit --amend --author 'Author Name < [email protected]>' выберите abb60f9 добавить новую функцию exec git commit --amend --author 'Author Name < [email protected]>' выберите dc18f70 исправление exec git commit --amend --author 'Author Name < [email protected]>'
Вот и все, теперь просто нажмите ESC,: wq, и все готово
Тогда git push origin: BRANCH NAME -f [пожалуйста, позаботьтесь о -f Force push]
как git push -f
или git push origin HEAD: dev -f