履歴内の特定のコミットの作成者を変更したい。最後のコミットではありません。
この質問について知っています-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
asF
であり、 andHEAD
の作成者を変更したい場合は...C
D
git rebase -i B
(これは、コマンドを実行した後に表示される内容の例ですgit rebase -i B
)
。A
、git rebase -i --root
C
とD
fromの両方の行を変更し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履歴を書き換えるスクリプトを実行することに不安があるため、この回答に似ていますが、より完全なこの投稿に基づいて新しい回答を書いています。
リンクされた回答とは異なり、以下はテストされ、機能しています。説明を明確にするため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-5 の代わりに、新しいコミットにリベースできます:
git rebase -i 42627abe
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'
```
以下のコマンドを使用して、最後のコミットの作成者を変更できます。
git commit --amend --author="Author Name <email@address.com>"
ただし、複数のコミットの作成者名を変更したい場合は、少し注意が必要です。インタラクティブなリベースを開始し、コミットを編集としてマークし、1 つずつ修正して終了する必要があります。
でリベースを開始しgit rebase -i
ます。このようなものを表示します。
作成者名を変更したいコミットのpick
キーワードをに変更します。edit
次に、エディターを閉じます。初心者の方は、打ってEscape
からタイプ:wq
して打ってEnter
ください。
その後、何事もなかったかのように端末が表示されます。実際、あなたはインタラクティブなリベースの真っ最中です。上記のコマンドを使用して、コミットの作成者名を修正します。エディターが再び開きます。を終了して、リベースを続行しgit rebase --continue
ます。編集するコミット数に対して同じことを繰り返します。メッセージが表示されたら、インタラクティブなリベースが終了したことを確認できNo rebase in progress?
ます。
あなたがリンクした質問の答えは良い答えであり、あなたの状況をカバーしています(他の質問は複数のコミットを書き換える必要があるため、より一般的です)。
を試す言い訳として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 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 rebase -i
、ドキュメントにこの興味深いビットがあります:
2 つ以上のコミットを 1 つに折りたたむ場合は
"pick"
、2 つ目以降のコミットのコマンドを"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...
最初の数行を削除するだけです。