web-dev-qa-db-ja.com

誤ってプッシュされたコミット:git commitメッセージを変更する

私のローカルリポジトリには、1つのコミットがあり、コミットメッセージが正しくありません。

git Pushを含む誤ったコミットメッセージを既に公開しました。

これで、リモートリポジトリ(GitHubでホストされている)に誤ったコミットメッセージも含まれるようになりました。

私はすでにgit commit --amendを試しましたが、間違ったコミット以降に追加のコミットを行ったため、この状況ではうまくいかないことがわかりました。

この状況をどのように修正しますか?

65
jonny

最も簡単な解決策(ただし、これを行う前にこの答え全体をお読みください):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. 開いたエディターで、不正なコミットの行でpickrewordに変更します。
  3. ファイルを保存して、エディターを閉じます。
  4. エディターは、誤ったコミットメッセージで再び開きます。修理する。
  5. ファイルを保存して、エディターを閉じます。
  6. git Push --force GitHubを更新します。

これは、以前に公開されたリポジトリの修正バージョンを公開することを意味します。間違ったコミットメッセージでミスを犯したときと修正したときの間にリポジトリから誰かがプルまたはフェッチした場合、後でいくつかの問題が発生します。したがって、これを試す前にこの結果を受け入れることができることを確認してください。

94
Dan Moulding

1回のコミットでリベースルート全体に移動するのではなく:

git reset --soft head~
git commit -m "The message you wanted to use"
git Push -f

git-reset マンページでオプションを確認できます。

自分だけが作業しているプロジェクトの場合、変更された履歴は問題になりません。

34
Abizern

古いコミットメッセージを複数のブランチにわたって変更する必要がある場合(つまり、誤ったメッセージを含むコミットが複数のブランチに存在する場合)、使用することができます。

git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all

コミットメッセージを置き換えます。

Gitは、書き換え用の一時ディレクトリを作成し、refs/original /に古い参照を追加でバックアップします。

-fは、操作の実行を強制します。これは、一時ディレクトリがすでに存在する場合、またはrefs/originalの下にすでに参照が保存されている場合に必要です。そうでない場合は、このフラグをドロップできます。

--フィルター分岐オプションと改訂オプションを分離します

--allは、すべてのbranchesおよびtagsが書き換えられるようにします。

古い参照のバックアップにより、コマンドを実行する前の状態に簡単に戻ることができます。

マスターを復旧し、ブランチold_masterでアクセスしたいとします:

git checkout -b old_master refs/original/refs/heads/master

変更に満足したら、git Push -fを使用して、変更をパブリックリポジトリにプッシュします。

最初に変更されたものから始まるコミットのハッシュはすべて変更されているため、このことについてコラボレーターに通知する必要があることに注意してください。

6
sebers

コードをリモートブランチ(Github/Bitbucket)にプッシュしていない場合は、コマンドラインのコミットメッセージを次のように変更できます。

 git commit --amend -m "Your new message"

特定のブランチで作業している場合、これを行います。

git commit --amend -m "BRANCH-NAME: new message"

間違ったメッセージでコードをすでにプッシュしている場合、メッセージを変更するときは注意する必要があります。つまり、コミットメッセージを変更し、もう一度プッシュしようとすると、問題が発生します。スムーズにするには、次の手順を実行します。 実行する前に回答全体をお読みください

git commit --amend -m "BRANCH-NAME : your new message"

git Push -f Origin BRANCH-NAME                # Not a best practice. Read below why?

重要な注意:プッシュを直接使用すると、他の開発者が同じブランチで作業しているコードの問題が発生する可能性があります。そのため、この競合を回避するには、force Pushを行う前にブランチからコードをプルする必要があります

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

コミットメッセージが既にプッシュされている場合、これはコミットメッセージを変更する際のベストプラクティスです。

2
Prabhakar