2584

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

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

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

4

22 に答える 22

4344

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

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

たとえば、コミット履歴がA-B-C-D-E-FasFであり、 andHEADの作成者を変更したい場合は...CD

  1. 指定しますgit rebase -i B(これは、コマンドを実行した後に表示される内容の例ですgit rebase -i B) 。
    • 編集する必要がある場合はAgit rebase -i --root
  2. CDfromの両方の行を変更しpickますedit
  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更新されたコミットでオリジンを更新するために使用します。
于 2010-06-15T04:31:46.400 に答える
626

この質問に対する受け入れられた答えは、インタラクティブなリベースの素晴らしく巧妙な使用ですが、作成者を変更しようとしているコミットが、後でマージされたブランチにあった場合、残念ながら競合が発生します。より一般的には、それは機能しません。乱雑な履歴を処理する場合。

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

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

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

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

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

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

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

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

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

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

     git replace -d 03f482d6
    
  5. 新しい履歴をプッシュします (以下が失敗した場合にのみ --force を使用し、git logおよび/またはでサニティ チェックを行った後にのみ使用しますgit diff)。

     git push --force-with-lease
    

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

git rebase -i 42627abe
于 2015-03-04T02:11:25.787 に答える
310

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'
```
于 2015-06-09T16:02:45.953 に答える
108

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

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?ます。

于 2015-08-29T00:52:24.913 に答える
66

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

を試す言い訳として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
于 2010-06-15T05:24:55.783 に答える
34

ユーザーをすばやく変更でき、他のコミットに影響を与えない方法を見つけてください。

シンプルで明確な方法:

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 から最近のコミット 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 で更新
git push --force-with-lease
于 2020-02-13T07:48:54.487 に答える
18

やっているとき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"
  • 空のコミットを作成します (コミットごとに 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...

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

于 2013-08-28T01:03:14.967 に答える