Git에서 일련의 커밋을 수행했으며 이제는 사용자 이름과 사용자 이메일 속성을 올바르게 설정하는 것을 잊었 음을 알게되었습니다 (새 컴퓨터). 아직 커밋을 저장소에 푸시하지 않았으므로 커밋하기 전에 어떻게 커밋을 수정할 수 있습니까 (마스터 브랜치에서 3 개의 최신 커밋 만 해당)?
나는 git resetand을 보고 git commit -C <id> --reset-author있었지만, 내가 올바른 길을 가고 있다고 생각하지 않습니다.
Git에서 일련의 커밋을 수행했으며 이제는 사용자 이름과 사용자 이메일 속성을 올바르게 설정하는 것을 잊었 음을 알게되었습니다 (새 컴퓨터). 아직 커밋을 저장소에 푸시하지 않았으므로 커밋하기 전에 어떻게 커밋을 수정할 수 있습니까 (마스터 브랜치에서 3 개의 최신 커밋 만 해당)?
나는 git resetand을 보고 git commit -C <id> --reset-author있었지만, 내가 올바른 길을 가고 있다고 생각하지 않습니다.
답변:
손끝에 필터 브랜치의 힘이있을 때 Rebase / Amend은 비효율적 인 것처럼 보입니다.
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
GIT_AUTHOR_EMAIL=correct@email;
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(명확성을 위해 여러 줄로 나누지 만 필수는 아님)
작업이 끝나면 결과를 검사하여 의도하지 않은 것을 변경하지 않았는지 확인하십시오!
git filter-branch --help는 매우 간단합니다 :)
--tag-name-filter cat합니다 filter-branch. 또한 사용하는 --branches --tags대신 --all단지 브랜치와 태그의 역사와 잎을 다시 작성하는을, 다른 refs(즉, 아마 당신이 사용하고있는 예를 들어하지 않는 많은 차이가되지 않습니다하지만 혼자 git-notes)
-- --all와 함께HEAD~1..HEAD
git log HEAD~2..HEAD됩니까?
대화식 rebase 접근 방식은 exec와 함께 사용하면 매우 좋습니다. rebase의 특정 커밋 또는 모든 커밋에 대해 쉘 명령을 실행할 수 있습니다.
먼저 git author 설정을 설정하십시오.
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
그런 다음 지정된 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 <new_address@example.com>' -CHEAD"
filter-branch마지막 커밋을 수정하려는 경우 보다 훨씬 간단 합니다. :). 그러나 이로 인해 커밋의 타임 스탬프가 변경됩니다.
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
git log는 저 에게도 오래된 저작권을 보여 주었지만 git status는 새로운 커밋을 올바르게 식별했으며 강제로 푸시하면 의도했던대로였습니다.
git rebase -i --root …SHA를 전달하는 대신.
마지막 커밋에 대해서만 작성자를 변경하려면
git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
마지막 N 커밋의 작성자 만 변경한다고 가정합니다.
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --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 <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
--rebase-merges(짧은 -r) 옵션 을 추가하는 것이 좋습니다 .
이 방법은이 목적을 위해 github에 의해 문서화되었습니다. 단계는 다음과 같습니다.
git clone --bare https://github.com/user/repo.git
cd repo
OLD_EMAIL, CORRECT_EMAIL및 CORRECT_NAME)#!/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 push --force --tags origin 'refs/heads/*'하면 완료됩니다!나는 당신이 찾고있는 것이 믿습니다 git rebase --interactive
특정 커밋으로 재설정 한 다음 커밋을 추가하거나 그룹화하여 히스토리를 던질 수 있습니다.
여기에 https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase에 대한 설명이 있습니다. -인터렉티브
remote: error: GH007: Your push would publish a private email address....`! [원격 거부] 마스터-> 마스터 (이메일 프라이버시 제한으로 인해 푸시 거부)`.