역사에서 특정 커밋의 저자를 변경하고 싶습니다. 마지막 커밋이 아닙니다.
이 질문에 대해 알고 있습니다- 자식 커밋의 저자를 어떻게 변경합니까?
그러나 나는 해시 또는 짧은 해시로 커밋을 식별하는 무언가에 대해 생각하고 있습니다.
역사에서 특정 커밋의 저자를 변경하고 싶습니다. 마지막 커밋이 아닙니다.
이 질문에 대해 알고 있습니다- 자식 커밋의 저자를 어떻게 변경합니까?
그러나 나는 해시 또는 짧은 해시로 커밋을 식별하는 무언가에 대해 생각하고 있습니다.
답변:
커밋보다 먼저 히스토리의 시점을 벗어난 대화식 리베이스 ( 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
같은 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
편집기를 열지 않습니다. 자식 1.7.9부터 사용할 수 있습니다.
git rebase -i --root
허용 대답 이 질문에 대한 대화 형 REBASE의 멋지고 영리한 사용하지만 우리는 이후에 합병되었다 지점에 예전의 저자을 변경하려는 커밋 경우는 불행하게도 충돌을 나타낸다. 더 일반적으로, 그것은 일을하지 않습니다 지저분한 역사를 다룰 때
git history를 다시 작성하기 위해 환경 변수를 설정하고 설정 해제하는 스크립트를 실행하는 것에 대해 걱정하기 때문에이 게시물 을 기반으로 하는 이 답변 과 비슷 하지만 더 완전한 새로운 답변을 작성하고 있습니다.
다음은 링크 된 답변과 달리 테스트되고 작동합니다. 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
repo에 푸시 변경을 강제로 수행 해야합니다 .
이메일을 전역으로 구성으로 재설정하십시오.
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
and를 사용하여 현재 Git 리포지토리에 올바른 작성자를 설정하십시오 git config --local user.email first.last@example.com
. 그런 다음을 사용하여 마지막 6 개의 커밋에 적용하십시오 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>"
그러나 하나 이상의 커밋 작성자 이름을 변경하려면 약간 까다 롭습니다. 대화식 리베이스를 시작한 다음 커밋을 편집으로 표시 한 다음 하나씩 수정하고 완료해야합니다.
로 rebasing을 시작하십시오 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
.
중앙 집중식 저장소를 사용하는 경우 Amber의 답변에 추가 단계가 있습니다.
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...
처음 몇 줄만 제거하면됩니다.
에 조성에서 오이겐 Konkov의 응답 루트 커밋 사용에서 시작하는 --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
변경하려는 커밋이 마지막 커밋이 아닌 경우 아래 단계를 수행하십시오. 커밋이 다른 지점에있는 경우 먼저 해당 지점으로 전환하십시오.
자식 체크 아웃 branch_name
변경하려는 커밋 전에 커밋을 찾아 해시를 찾으십시오. 그런 다음 rebase 명령을 발행하십시오.
커밋의 자식 rebase -i -p 해시
그런 다음 편집기는 변경하려는 커밋에 대해 'edit'을 열고 입력합니다. 기본 '선택'옵션으로 다른 사람을 남겨 두십시오. 변경되면 'esc'키와 wq를 입력하십시오! 나가기 위해서.
그런 다음 수정 옵션과 함께 git commit 명령을 실행하십시오.
git commit --amend --author = "Username email"--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 : BRANCH NAME -f [-f Force push를 처리하십시오]
같은 git push -f
또는git push origin HEAD: dev -f
git push
명령 의 예로 포인트 6을 업데이트 할 수 있습니까?
커미터 이름 및 이메일을 전 세계적으로 변경 :
$ 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>"
힌트 : 다른 상황과 자세한 정보 는 포스트 레퍼런스를 읽으 십시오 .
이 명령은 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
여기에서 이전 이메일을 새로운 사용자 이름과 이메일 주소로 변경할 수 있습니다.