特定のコミットのコミット作成者を変更するにはどうすればよいですか?


2109

履歴の特定のコミットの作成者を変更したい。これは最後のコミットではありません。

この質問について知っています-gitでコミットの作成者を変更するにはどうすればよいですか?

しかし、私は何かを考えています。そこでは、コミットをハッシュまたはショートハッシュで識別します。


回答:


3566

変更が必要なコミットよりも履歴の早い時点からインタラクティブにリベース(git rebase -i <earliercommit>)。リベースされたコミットの一覧では、からのテキストを変更pickするedit変更したい1のハッシュの隣にあります。次に、gitがコミットを変更するように求めてきたら、これを使用します。

git commit --amend --author="Author Name <email@address.com>" --no-edit

たとえば、あなたのコミットの歴史がある場合A-B-C-D-E-FFのようにHEAD、あなたはの作者を変更したいCDあなたが希望、...

  1. 指定git rebase -i Bここに、git rebase -i Bコマンドを実行した後に表示される例を示します
    • 編集する必要がある場合はAgit rebase -i --root
  2. 両方のための行を変更CしてDからpickedit
  3. エディターを終了します(vimの場合、Escキーを押してからと入力します:wq)。
  4. リベースが開始されると、最初に一時停止します C
  5. するでしょう git commit --amend --author="Author Name <email@address.com>"
  6. その後 git rebase --continue
  7. それは再び一時停止します D
  8. その後、git commit --amend --author="Author Name <email@address.com>"再び
  9. git rebase --continue
  10. リベースが完了します。
  11. git push -f更新されたコミットでオリジンを更新するために使用します。

90
良い答えですが、初心者向けです。まず、変更するコミットの前にあるコミットを見つけてから実行しますgit rebase -i <commit>
Mathew Byrne、2011

47
現在どのエディターにいるかわからない場合は、おそらくその答えが考えられvimます。保存して終了するには、Esc:wq Enterと入力します。一方、Nanoで、下部に「WriteOut:^ O」のようなものが表示される場合は、代わりにCtrl + O、Enter、Ctrl + Xを使用する必要があります。
アンバー

30
最初のコミットを変更したい場合はどうしますか?次に、以前のコミットハッシュは何ですか?
ブレンデン2012

219
--no-editオプションを使用します。git commit --amend --reset-author --no-editエディターを開きません。git 1.7.9以降で使用可能です。
5lava 14年

51
非常に最初のプロジェクトにコミットを修正する@Brenden、使用git rebase -i --root
ノアPassalacqua

488

受け入れ答えこの質問には、対話型リベースの素晴らしく巧妙な使用であるが、私たちは、その後にマージされたブランチ上にあるように使用するの作者を変更しようとしているコミット。より一般的に、それは仕事をしない場合には、残念ながら競合を示し、乱雑な履歴を処理するとき。

私はgit履歴を書き換えるために環境変数の設定と設定解除に依存するスクリプトを実行することに不安があるので、この投稿に基づいて、この答えに似ていますがより完全な新しい答えを書いています。

以下は、リンクされた回答とは異なり、テストされて機能しています。説明をわかりやすく03f482d6するために、作成者が置き換えようとして42627abeいるコミットであり、新しい作成者とのコミットであると想定します。

  1. 変更しようとしているコミットをチェックアウトします。

    git checkout 03f482d6
    
  2. 著者を変更します。

    git commit --amend --author "New Author Name <New Author Email>"
    

    これで、ハッシュをと想定した新しいコミットができました42627abe

  3. 元のブランチをチェックアウトします。

  4. ローカルで古いコミットを新しいコミットに置き換えます。

    git replace 03f482d6 42627abe
    
  5. 置き換えに基づいて、将来のすべてのコミットを書き換えます。

    git filter-branch -- --all
    
  6. 清潔さのために交換品を取り外します。

    git replace -d 03f482d6
    
  7. 新しい歴史を押して(下記に障害が発生した場合にのみ、--force使用、およびだけで正気を確認した後git log、および/またはgit diff)。

    git push --force-with-lease
    

4-6の代わりに、新しいコミットにリベースすることができます:

git rebase -i 42627abe

9
手順2の後に再チェックアウト元のブランチにそこに注釈を入れてください
ベンジャミン・リッグス

42
これは恐ろしいもののはるかに明確な代替手段に見えますgit rebase -i。このgit replaceことは聞いたことがない。+1
FractalSpace 2015

3
refs / original / ...バックアップのクリーンアップについては、こちらを
アレクシス

5
--force-with-lease代わりに使用することをお勧めします-f。安全です。
Jay Bazuzi 2017

11
警告:git filter-branch -- --all元のコミットがあったすべてのブランチでコミットを変更していることに注意してください。十分な資格情報がない場合(または単に他のブランチの履歴を変更したくない場合)、この回答に注意することをお勧めします。
リバマー

225

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'
    

12
これにより、1つだけでなくすべてのコミットで変更されます。面白いことに、私は30分も前にこれを行いました。
Artjom B.

以前の答えを読んでこの答えを見つけたとき、試してみる価値はあると思いました。ただし、私の場合、最初のコミットでのみコミッター名が変更されました。ちなみに、最初の答えからアイデアを試す前に。たぶんそれはシステムに何らかの影響を与えました。
Ruslan Gerasimov

2
clone/の使用を避けた場合push、バックアップの名前空間が作成されることに注意してくださいrefs/original/。私はこの名前空間をインテリジェントに削除する方法を見つけることができなかったので、ディレクトリを削除してしまい.git/refs/originalました。
VasiliNovikov

たとえば、OLD_EMAILが何にも一致しない場合、これによりリポジトリが変更されるのはなぜですか?何らかの理由で、いくつか(すべてではない!)のコミットハッシュが変更されました。
mjs 2018

1
この回答の使用例は次のとおりです。2つのgithubアカウントがあり、そのうちの1つは意図せずにコミットに使用しました。このスクリプトは、誤ったコミッターの電子メール/名前を変更することで、すべてのコミットを修正するのに役立ちました。もちろん、間違ったユーザーを使ってコミットした場合、たとえば、50番目のコミットから500番目のコミットまで、450の異なるコミットがあります。とにかく、スクリプトを実行した後、@ andrejが指摘したgit push -fように、リポジトリへのプッシュ変更を強制する必要があります。
LWY

168
  • メールを設定にグローバルにリセットします。

    git config --global user.email example@email.com

  • 次に、編集を必要とせずにコミットの作成者をリセットします。

    git commit --amend --reset-author --no-edit


2
いいえ、ちがいます。OPを見てください:It's not last commit.では、どうすればよいでしょうamendか?
underscore_d

2
これは素晴らしいことですが、残念ながら最後のコミットだけです。幸いなことに、最新の2つで必要だったのでgit reset HEAD~、を実行し、提案された行を実行してから、次のコミットを手動で再度実行しました。うまくいきました!
マットフレッチャー

2
ありがとう!--reset-authorは私にとってはうまくいきました。それがなければ作者は変更されますが、「コミッター」は古い作者の詳細を保持するためです。
Lucas P.

9
最後の6つのコミットを修正するには:まず、現在のGitリポジトリの正しい作成者をgit config --local user.name FirstName LastName とを使用して設定します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ます。
オリブレ

@olibreそれは魅力のように機能します、ありがとう。
Bruno Gasparotto

88

以下のコマンドを使用して、最後のコミットの作成者を変更できます。

git commit --amend --author="Author Name <email@address.com>"

ただし、複数のコミットの作成者名を変更する場合は、少し注意が必要です。インタラクティブなリベースを開始し、コミットを編集済みとしてマークし、1つずつ修正して終了する必要があります。

でリベースを開始し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 in progress?メッセージを受け取ったら、インタラクティブなリベースが完了したことを確認できます。


写真を更新していただけますか?
Shimmy Weitzhandler

1
変更するコミットが複数ある場合は、個別に編集するのではなく、pickアクションを許可して、各行の後に追加することもできますexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Pierre-Olivier Vares

60

リンクした質問の回答は良い回答であり、状況をカバーしています(他の質問は、複数のコミットの書き換えを伴うため、より一般的です)。

試す口実として、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

+1ありがとうございます。assembla.com git repoは、リポジトリのWebビューですべての作成者の参照を変更するようには見えませんが、「git pull / clone」の結果はすべて正常に機能しているように見えます。
ジョニーUtahh 2012年

コミット日付のような他のフィールドではなく、意図したものだけを変更するので、素晴らしいソリューションです。
GuillaumeLemaître2014年

12
Githubのドキュメントには同様のスクリプト
olivieradam666 '18 / 06/18

2
魅力的で読みやすい@ olivieradam666
fregante

@ olivieradam666ありがとうございます。あなたは本当にそれを答えとして追加して、もっと注目を集めるべきです。
ショーン2015年

44

前にコミット:

ここに画像の説明を入力してください

すべてのコミットの作成者を修正するには、@ 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

1
コマンドが期待どおりに機能したことを確認するために、の出力を確認しましたgit shortlog -e -s
テイラーエドミストン

5
これが私の目的に最もよく応えた答えです、ありがとう。また電子メールアドレスを調整したいだけなので、.git / configを更新した後、-exec = "git commit --amend --reset-author"で実行できます。
Dato

1
ええ、なぜ私が忘れたかわかりません!もう終わりました。
Dato

すばらしい答えで、修正も非常に簡単です。エイリアスが大好きです!
J_A_X

それは私を助けませんでした。現在、Rebase Failedの続行エラーが発生しています
Alexey Sh。

17

一元化されたリポジトリを使用している場合、アンバーの答えには1つの追加ステップがあります。

git push -f 中央リポジトリを強制的に更新します。

一貫性を損なう可能性があるため、同じブランチで作業する人が多くないように注意してください。


16

これを行うgit rebase -iと、ドキュメントに次の興味深い部分があります。

あなたが一つに二つ以上のコミットを折るしたい場合は、コマンドを交換"pick"して目以降のコミットのため"squash""fixup"。コミットの作成者が異なる場合、折りたたまれたコミットは最初のコミットの作成者に帰属します。折りたたまれたコミットの推奨コミットメッセージは、最初のコミットのコミットメッセージと"squash"コマンドを使用したコミットメッセージを連結したものですが、コマンドを使用したコミットのコミットメッセージは省略しています"fixup"

  • の履歴がある場合A-B-C-D-E-F
  • あなたがコミット変更するBD、(= 2つのコミットをして)

その後、あなたは行うことができます:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • 空のコミットを作成(コミットごとに1つ):
    • リベースの目的でメッセージが必要です
    • git commit --allow-empty -m "empty"
  • リベース操作を開始する
    • git rebase -i B^
    • B^の親を選択しBます。
  • 変更する各コミットの前に空のコミットを1つ置きます
  • あなたはそれらに変更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...

最初の数行を削除するだけです。


16

Eugen Konkov応答を促進するために、ルートコミットから開始するには、--rootフラグを使用します。--no-editフラグがあまりにも便利です

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"

これはすべてのコミットで機能し、変更されました。
SagarKapasi099

1
答えてくれてありがとう。それを機能させるには--interactiveを追加する必要がありました。git rebase --root --interactive --exec "git commit --amend --author = 'name <email>' --no-edit"
Sreeragh AR

8

ユーザーをすばやく変更でき、他のコミットに副作用がない方法を見つけます。

シンプルで明確な方法:

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

詳細な操作

  • コミットログを表示し、変更するコミットの前にあるコミットIDを確認します。
git log
  • git rebaseは、選択したコミットIDから最近のリバースに逆に開始します。
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
  • リベースは次のコミットIDで停止し、出力:
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 to update
git push --force-with-lease

5

変更するコミットが最後のコミットでない場合は、以下の手順に従ってください。コミットが別のブランチにある場合は、最初にそのブランチに切り替えます。

git checkout branch_name

変更するコミットの前にコミットを見つけ、そのハッシュを見つけます。次に、rebaseコマンドを発行します。

git rebase -i -pコミットのハッシュ

次に、エディターが開き、変更するコミットの「編集」を入力します。デフォルトの「選択」オプションを使用して他のユーザーを残します。変更したら、「esc」キーとwqを入力します。出る。

次に、修正オプションを指定してgit commitコマンドを発行します。

git commit --amend --author = "Username email" --no-edit

次に、次のコマンドを発行します。

git rebase-続行

コミット作成者がローカルリポジトリで更新されたら、変更をリモートリポジトリにプッシュします。


これが最も簡単な方法だと思います。rewordコマンドを使用していて、失敗しました。代わりに編集コマンドを使用する必要があることを学びました。おそらく「編集」キーワードを強調表示できます。答え@ChannaB👍てくれてありがとう
バーク

手順を実行するのは本当に簡単です。ありがとうございました!
ハビバ

4

特に、変更したいコミットが複数ある場合は、この問題に対する遅延アプローチもあります。私の場合、私は間違った作者とのいくつかのコミットを持つ新しいブランチを持っていたので、何が私を助けました:

元のブランチに移動します。

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

その後、間違った作者のブランチを削除できます。


4

コミットがプッシュされた後に著者名を変更する手順

  1. 最初に「git log」と入力して、コミットIDと詳細を取得します
  2. 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.

  3. 次に、必要に応じて「git rebase --continue」または「git rebase --abort」と入力します

    • これでウィンドウがリベースされます。キーボードから「i」キーをクリックしてください
    • 次に、10へのコミットのリストを取得します[上記の10のコミットを通過したため]以下のように

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. 次に、以下のように、編集したいコミットのすぐ下に以下のコマンドを追加する必要があります

    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>'

    1. それだけです、今すぐESC、:wqを押すだけですべて完了です

    2. 次にgit push origin HEAD:BRANCH NAME -f [-f Force pushに注意してください]

    好き git push -fgit push origin HEAD: dev -f


すばらしい答えgit pushです。コマンドの例でポイント6を更新できますか?
Lukasz 'Severiaan' Grela

1
@ Lukasz'Severiaan'Grelaが編集し
ました。

3

コミッターの名前とメールをグローバルに変更する:

$ 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>"

ヒント:その他の状況や詳細については、投稿のリファレンスをご覧ください。


2

変更する必要があるのが最後のコミットの作成者であり、他にリポジトリを使用していない場合は、次のコマンドで最後のコミットを取り消すことができます。

git push -f origin last_commit_hash:branch_name 

コミットの作成者名を次のように変更します。

git commit --amend --author "type new author here"

開いているエディターを終了し、コードをもう一度プッシュします。

git push

2

マージコミットメッセージについて、rebase少なくともgitlabでは、を使用してそれを修正できないことがわかりました。マージをコミットとして示していますが、その#shaにリベースすることはできません。これを見つけ投稿が便利です。

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

この3行のコードで、マージコミットメッセージ(作成者など)を変更することができました。


1

これらのコマンドは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

ここで、古いメールを新しいユーザー名とメールアドレスに変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.