私はGitで一連のコミットを行いましたが、ユーザー名とユーザーのメールプロパティを正しく設定するのを忘れたことに気づきました(新しいマシン)。これらのコミットをリポジトリにまだプッシュしていません。そうする前に、これらのコミットを修正するにはどうすればよいですか(masterブランチの最新の3つのコミットのみ)。
とを見てきましたが、正しい方向に進んでいるgit reset
とgit commit -C <id> --reset-author
は思いません。
私はGitで一連のコミットを行いましたが、ユーザー名とユーザーのメールプロパティを正しく設定するのを忘れたことに気づきました(新しいマシン)。これらのコミットをリポジトリにまだプッシュしていません。そうする前に、これらのコミットを修正するにはどうすればよいですか(masterブランチの最新の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
(明確にするために行をまたいで分割していますが、必須ではありません)
完了したら必ず結果を調べて、意図していないものを変更していないことを確認してください。
git filter-branch --help
は非常に単純です:)
--tag-name-filter cat
はfilter-branch
、タグを新しい履歴に移行するためにに追加されます。また、の--branches --tags
代わりに使用します--all
。これは、ブランチとタグの履歴を書き換えるだけで、その他refs
はそのままにします(たとえば、を使用している場合を除いて、それほど大きな違いはありませんgit-notes
)
-- --all
てHEAD~1..HEAD
git log HEAD~2..HEAD
?
インタラクティブなリベースアプローチは、execと組み合わせて使用すると非常に便利です。リベース内の特定のコミットまたはすべてのコミットに対して任意のシェルコマンドを実行できます。
最初にgit author設定を設定します
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
次に、指定された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 <new_address@example.com>' -CHEAD"
filter-branch
、最後のコミットを修正したいだけの場合よりもはるかに簡単です:)。ただし、これによりコミットのタイムスタンプが変更されることに注意してください。
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
git log
も古い作成者を示しましたが、gitステータスは新しいコミットを正しく識別し、強制プッシュ後は意図したとおりでした。
git rebase -i --root …
、SHAを渡す代わりに、次を使用します。
最後のコミットについてのみ作成者を変更するには:
git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
最後のN回のコミットについてのみ作成者を変更したいとします。
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
ノート
--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 <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
--rebase-merges
(short -r
)オプションを追加することをお勧めします。ブランチにマージが含まれている場合、ブランチのトポロジをそのまま維持するためです。
このメソッドは、まさにこの目的のために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="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
git push --force --tags origin 'refs/heads/*'
完了です!あなたが探しているのは git rebase --interactive
特定のコミットにリセットしてから、コミットの追加またはグループ化を変更する履歴をスローすることができます
remote: error: GH007: Your push would publish a private email address.
... `![リモートで拒否されました]マスター->マスター(メールのプライバシー制限によりプッシュが拒否されました) `。