Gitで一連のコミットを行いましたが、ユーザー名とユーザーのメールプロパティを正しく設定するのを忘れていたことがわかりました(新しいマシン)。これらのコミットをまだリポジトリにプッシュしていないので、これらのコミットを修正する前にどのように修正できますか(マスターブランチで最新の3つのコミットのみ)?
私はgit reset
およびgit commit -C <id> --reset-author
、しかし、私は正しい軌道に乗っているとは思わない。
フィルターブランチの機能を指先で使用している場合、リベース/修正は非効率的と思われます。
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
(明確にするために行に分割しますが、必須ではありません)
完了したら結果を調べて、意図していないことを変更していないことを確認してください!
インタラクティブなリベースアプローチは、execと組み合わせて使用すると非常に便利です。リベース内の特定のコミットまたはすべてのコミットに対して任意のシェルコマンドを実行できます。
最初にgit author設定を設定します
git config --global user.name "John Doe"
git config --global user.email [email protected]
次に、指定された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 <[email protected]>' -CHEAD"
最後のコミットに対してのみ作成者を変更するには:
git commit --amend --author 'Author Name <[email protected]>' --no-edit
最後のN個のコミットについてのみ著者を変更するとします。
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"
[〜#〜] notes [〜#〜]
--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 <[email protected]>' --no-edit
pick dc18f70 bugfix
あなたが探しているのはgit rebase --interactive
特定のコミットにリセットしてから、コミットを追加またはグループ化して履歴を変更することができます
脱ベースおよび修正について安全でないと感じている場合は、この方法で行うことができます。同時に、おそらくとにかくするつもりだったグローバル構成も設定することになります。
git reset HEAD~
(最後のコミットを取り消す)
git config --global user.name "Your Name"
git config --global user.email [email protected]
git commit -m "message"
This メソッドは、まさにこの目的のために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="[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 Push --force --tags Origin 'refs/heads/*'
を使用して変更をプッシュすれば完了です。