web-dev-qa-db-ja.com

著者を変更するためにGitでいくつかのコミットを修正する方法

Gitで一連のコミットを行いましたが、ユーザー名とユーザーのメールプロパティを正しく設定するのを忘れていたことがわかりました(新しいマシン)。これらのコミットをまだリポジトリにプッシュしていないので、これらのコミットを修正する前にどのように修正できますか(マスターブランチで最新の3つのコミットのみ)?

私はgit resetおよびgit commit -C <id> --reset-author、しかし、私は正しい軌道に乗っているとは思わない。

143
pauldoo

フィルターブランチの機能を指先で使用している場合、リベース/修正は非効率的と思われます。

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

(明確にするために行に分割しますが、必須ではありません)

完了したら結果を調べて、意図していないことを変更していないことを確認してください!

186
Cascabel

インタラクティブなリベースアプローチは、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"
121
Alex

最後のコミットに対してのみ作成者を変更するには:

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
62
Chris Maes

あなたが探しているのはgit rebase --interactive

特定のコミットにリセットしてから、コミットを追加またはグループ化して履歴を変更することができます

ここに説明があります https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness -git-rebase-interactive

脱ベースおよび修正について安全でないと感じている場合は、この方法で行うことができます。同時に、おそらくとにかくするつもりだったグローバル構成も設定することになります。

git reset HEAD~(最後のコミットを取り消す)

git config --global user.name "Your Name"

git config --global user.email [email protected]

git commit -m "message"

0
tymac

This メソッドは、まさにこの目的のためにgithubによって文書化されました。手順は次のとおりです。

  1. ターミナルを開き、リポジトリのbareクローンを作成します
git clone --bare https://github.com/user/repo.git
cd repo
  1. 次のスクリプトを編集します(OLD_EMAILCORRECT_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
  1. スクリプトを端末にコピーして貼り付け、Enterキーを押して実行します。
  2. git Push --force --tags Origin 'refs/heads/*'を使用して変更をプッシュすれば完了です。
0
user5783745