歴史の中のある特定のコミットの作者を変更したいのです。それは最後のコミットではありません。
私はこの質問について知っています - Gitでコミットの作者を変更するにはどうすればいいですか?
しかし、私は何かを考えています、そこで私はハッシュまたはショートハッシュによってコミットを識別します。
変更が必要なコミットよりも前の履歴から対話式にリベースします(git rebase -i <earliercommit>
)。リベースされているコミットのリストで、変更したいコミットのハッシュの横にあるテキストをpick
からedit
に変更します。それからgitがコミットを変更するように促したら、これを使います:
git commit --amend --author="Author Name <[email protected]>"
たとえば、コミット履歴がF
をHEAD
としてA-B-C-D-E-F
で、C
とD
の作成者を変更したい場合は、.
git rebase -i B
を指定します( これは、git rebase -i B
コマンドの実行後に表示される例です )A
を編集する必要がある場合はgit rebase -i --root
を使用してください。C
とD
の両方の行をpick
からedit
に変更します。C
で一時停止します。git commit --amend --author="Author Name <[email protected]>"
になりますgit rebase --continue
D
で再び一時停止しますgit commit --amend --author="Author Name <[email protected]>"
でしょうgit rebase --continue
git Push -f
を使います。この質問に対する 受け入れられた答え )はインタラクティブなリベースの素晴らしく賢い使用法ですが、作成者を変更しようとしているコミットがその後マージされたブランチにある場合、残念ながらそれは矛盾を示します。乱雑な履歴を処理するときは機能しません。
Gitの履歴を書き換えるために環境変数の設定と設定解除に依存するスクリプトを実行することに不安を感じているので、 this post と類似した this answer がより完成した)に基づいて新しい答えを書きます。
以下はリンクされた答えとは異なり、テスト済みで動作しています。説明を明確にするために、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
新しい履歴をプッシュします(以下が失敗した場合、 - git log
および/またはgit diff
による健全性チェックの後にのみ--forceを使用してください)。
git Push --force-with-lease
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="Author Name <[email protected]>"
ただし、複数のコミットされた作者名を変更したい場合は、少し注意が必要です。対話的なリベースを開始してからコミットを編集としてマークし、それらを1つずつ修正して終了する必要があります。
git rebase -i
でリベースを開始してください。それはあなたにこのような何かを見せるでしょう。
作成者名を変更したいコミットのpick
キーワードをedit
に変更します。
それからエディタを閉じます。初心者の場合は、Escape
を押してから:wq
を入力し、Enter
を押します。
それから何も起こらなかったようにあなたはあなたの端末を見るでしょう。実際、あなたは対話型のリベースの最中です。それでは上記のコマンドを使ってコミットの作者名を修正しましょう。再びエディタが開きます。 git rebase --continue
で終了して、リベースを続けてください。編集したいコミット数についても同じことを繰り返します。 No rebase in progress?
メッセージが表示されたら、対話式リベースが終了したことを確認できます。
あなたがリンクした質問の中の答えは良い答えであり、あなたの状況をカバーします(他の質問はそれが複数のコミットを書き直すことを含むのでより一般的です)。
git filter-branch
を試すための言い訳として、私は与えられたコミットのためにAuthor NameやAuthor 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]>"
あるいはあなたの名前とEメールを再利用するためにあなたはただ書くことができます:
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
Amber's answer に追加のステップが1つあります。集中型リポジトリを使用している場合:
中央リポジトリの更新を強制するためのgit Push -f
。
一貫性が損なわれる可能性があるため、同じブランチに取り組んでいる人が多くないように注意してください。
git rebase -i
をするとき、docにこの興味深いビットがあります:
2つ以上のコミットを1つにまとめる場合は、2回目以降のコミットのコマンド
"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 "[email protected]"
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...
そして最初の数行を削除するだけです。
変更するコミットが最後のコミットでない場合は、次の手順に従います。コミットが別のブランチにある場合、最初にそのブランチに切り替えます。
git checkout branch_name
変更するコミットの前にコミットを見つけ、そのハッシュを見つけます。次に、rebaseコマンドを発行します。
git rebase -i -pコミットのハッシュ
次に、エディターが開き、変更するコミットの「編集」を入力します。他のデフォルトの「選択」オプションのままにします。変更したら「esc」キーとwqを入力してください!出る。
次に、修正オプションを指定してgit commitコマンドを発行します。
git commit --amend --author = "ユーザー名メール" --no-edit
次に、次のコマンドを発行します。
git rebase --continue
コミットの作成者がローカルリポジトリで更新されたら、変更をリモートリポジトリにプッシュします。
変更する必要があるのがAUTHOR OF THE LASTコミットで、他に自分のリポジトリを使用していない場合は、最後のコミットを元に戻すことができます。
git Push -f Origin last_commit_hash:branch_name
あなたのコミットの作者名を次のように変更してください。
git commit --amend --author "type new author here"
開いたエディタを終了して、コードをもう一度プッシュします。
git Push
Eugen Konkov responseを促進するために、rootコミットから始めるには、--root
フラグを使用してください。 --no-edit
フラグも役に立ちます
git rebase --onto <sha> --exec "git commit --amend --author='name <email>' --no-edit" --root
コミットをプッシュした後に作成者名を変更する手順
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 <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'
これで、ESCを押すだけで:wqが設定されました。
次にgit Push Origin HEAD:BRANCH NAME -f [-f Force Pushに注意してください]
特に、変更したいコミットが複数ある場合には、この問題に対する怠惰なアプローチもあります。私の場合、私は間違った作者といくつかのコミットを持つ新しいブランチを持っていました。
元のブランチに移動してください:
git checkout develop
そこから新しいブランチを作る:
git checkout -b myFeature develop
コミット情報なしで1つのコミットとしてマージする:
git merge --no-commit --squash branchWrongAuthor
変更を上演することもできます:
git stage .
作者の名前を変更し、変更を確定します。
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
それで、変更をプッシュできます。
git Push
その後、間違った作者でブランチを削除することができます。