2016-08-30 3 views
2

特定の著者によるすべてのコミットを削除するにはどうすればよいですか(誤ってコミットしました - そのような作者はコミット履歴には表示されません)。著者によるすべてのコミットを削除する

私はいくつかのコードは、名前を変更することが分かってきた -

git filter-branch --env-filter ' 
OLD_EMAIL="[email protected]" 
CORRECT_NAME="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/*' 

名前の変更が、そのようなコミットを削除しないように、いくつかのフィルタがありますか?

+0

ハッシュをコミット、カスタムフォーマットを使用しますか?これは、次のコミットを前のものに 'rebase'することを意味しますか?削除されたコミットからの変更を保持するかロールバックする必要がありますか? – CoryKramer

+0

このようなコミットからの変更もすべて削除する必要があります。これらのコミット後、さらにコミットが行われました。 – Dancyg

答えて

3

あなたはこのようにそれを行うことができます。

  1. をあなたが開始するコミットに基づいて新しいブランチを作成します。

    git checkout -b <branch-name> <base-commit> 
    
  2. ていないすべてのコミットをチェリー選びますマッチングの作者:

    git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick 
    

logは、作成者が行ったすべてのコミットを除外し、その後、1つ後に1つずつcherry-pickを除外します。

(一部git logマンページから引用)パラメータの説明:

  • --author "name"
    リミット指定したパターン(正規表現)に一致著者/コミッターヘッダーラインを有するものにコミット出力します。複数の--author =で、指定されたパターンのいずれかに一致するコミットが選択されます(複数のコミッター=の場合も同様)。
  • --invert-grep
    リミット--grepで指定されたパターンに一致しないログメッセージを持つものにコミット出力=逆の順序でコミット
  • --reverse 出力。 [...]
  • --format="format:%H" が、この場合にのみ、あなたが「コミットを削除し、」どういう意味ですか
+0

git bashは最後にコミットした人は、ログインした人以外はコミットしていないようです。だから私は間違った著者の下でコミットされたコミットを正常に改名しました。その後、私の同僚は、その血まみれのコミットの間違った作者を含むバージョンをコミットしました。)そして、2つのコミットが現れました - 同一ですが、diffの作者と) 悪いコミットを改名すると問題は解決しました。著者左) – Dancyg

+0

@Dancyg通常、Gitはローカルリポジトリ(.git/config)、ユーザまたはシステム全体のファイル(その順番)のいずれかで、.gitconfigで設定された作者を使用します。 'git config --get-regexp 'user。*" 'で設定された値を確認することができます。 –

0

フィルタブランチで直接行うことができます。あなたができることは、希望の開始点を持つ新しいブランチを作成し、フィルターブランチを使用して、不要なものを除外したいコミットにcherry-pickを実行することです。

あなたの新しい支店では、特定の作者が作ったものを使わずにすべてのコミットを取ることになります。

git cherry-pickは、最後の「良い」コミットを保存し、1つではなくコミットの範囲を追加できる範囲をサポートしています。

もう1つの方法はgit revertですが、元のコミットは元のままにしておき、元のコミットの変更を元に戻します。

関連する問題