「git push」後にローカルで、リモートで「git commit」を元に戻すにはどうすればよいですか


242

を実行しgit commitましたgit push。ローカルとリモートの両方のリポジトリでその変更を元に戻すにはどうすればよいですか?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

回答:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(実施例プッシュ: git push -f origin bugfix/bug123

これにより、最後のコミットが取り消され、更新された履歴がリモートにプッシュされます。-fリモートのアップストリーム履歴を置き換えるため、これを渡す必要があります。


24
または、を使用しますgit reset --hard <the-sha-you-want-to-return-to>
AlexanderGroß11年

2
リファレンスはHEAD(大文字と小文字が区別されます)と呼ばれます
dunni '06 / 06/23

26
また、注意してください-私の知る限り、他の人がリポジトリからプルした場合、これを行うべきではありません。
アマダン2013

1
@BipinVayaluそれはあなたが現在いるブランチに影響します。より正確には、HEAD。HEADは、ほとんどの場合、ブランチに「アタッチ」されます(コミットを直接指すのではなく、ブランチ名を指す)。したがって、一般的に言えば、HEADが指すブランチに影響します。git log --decorate --onelineHEADが指す場所を見つけるために使用します。
AlexanderGroß14年

4
git reset HEAD~1変更を削除したくない場合(ステージングされていない変更)。変更、コミット、および再度プッシュするgit push -f [origin] [branch]
softvar '25 / 06/25

161

一般的には、次のようにして「逆」コミットを行います。

git revert 364705c

次に、通常どおりリモートに送信します。

git push

これはコミットを削除しません。最初のコミットが行ったことを元に戻す追加のコミットを作成します。特に変更がすでに伝達されている場合は特に、安全ではない何か。


9
これは、AlexanderGroßの(選択された回答)よりも安全な(おそらくより良い)回答です。
Graeck 2013

6
@Graeckすべてのソリューションには、その意味とメリットがあります。
AlexanderGroß

5
これは受け入れられる答えである必要があります。チームと共同作業する場合はさらに、履歴を上書きしないことをお勧めします。git reset変更をサーバーにまだプッシュしていない場合にのみ受け入れられます。
Josue Alexander Ibarra 14

17
@JosueIbarra私はすべての場合に同意しません。ほとんどの場合、はい、履歴を上書きしないでください。しかし、絶対にすべき正当なケースがあると私は思います。たとえば、シークレットファイルを誤ってコミットしてプッシュしたとします。これはgitリポジトリでは必要ありません。したがって、ここで受け入れられた回答を使用して、すばやく削除できます。
bfcoder 14

11
@bfcoderが「秘密」をリモートリポジトリにプッシュした場合、それはもはや秘密ではありません。そして、適切な修正は、新しい秘密を作成することであり、間違いを隠そうとしないことです。
erbsman 2014

41

まず、リラックス。

「私たちの支配下にあるものはありません。私たちの支配は単なる幻想です。」、「誤りを犯すことは人間です」

意図せずにコードをにプッシュしたようですremote-master。これで大丈夫です。

1.最初に、SHA-1返そうとしているコミットの値を取得します(例:マスターブランチへのコミット)。これを実行してください:

git log

各コミットとともに、一連の「f650a9e398ad9ca606b25513bd​​4af9fe ...」のような文字列が表示されます。戻したいコミットからその番号をコピーします。

2.次に、以下のコマンドを入力します。

git reset --hard your_that_copied_string_but_without_quote_mark

「HEAD is now at」のようなメッセージが表示されるはずです。あなたは晴れています。それが行ったことは、その変更をローカルに反映することです。

3.次に、以下のコマンドを入力します。

git push -f

あなたは次のように見えるはずです

"警告:push.defaultは設定されていません。その暗黙の値が変更されています。......合計0(デルタ0)、再利用0(デルタ0)... ... your_branch_name->マスター(強制更新) 」

今、あなたはすべて明確です。もう一度「git log」でマスターを確認してください。fixed_destination_commitがリストの一番上にあるはずです。

あなたは大歓迎です(事前に;))

更新:

これで、これらすべてが始まる前に行った変更はなくなりました。 これらのハードワークを再び取り戻したい場合は、それが可能です。git refloggit cherry-pickコマンドに感謝します。

そのため、このブログまたはこの投稿をフォローすることをお勧めします。


"git push -f"を実行するときは、リモートとブランチも指定することをお勧めしますが、ほとんどの場合、 "git push -f"が機能します
Robson

8

git reset HEAD~1変更を削除したくない場合(ステージングされていない変更)。変更、コミット、再度プッシュgit push -f [origin] [branch]


3

インタラクティブなリベースを行うことができます:

git rebase -i <commit>

これにより、デフォルトのエディターが表示されます。削除するコミットを含む行を削除して、そのコミットを削除します。

もちろん、この変更をリモートリポジトリに適用するには、リモートリポジトリにアクセスする必要があります。

この質問を参照してください:Git:リポジトリから選択したコミットを削除する


3

使ってみてください

git reset --hard <commit id> 

注意:ここのコミットIDは、移動したいコミットのIDですが、リセットしたいIDではありません。これも私が行き詰まった唯一のポイントでした。

次に押します

git push -f <remote> <branch>

2

または:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

元のリモートリポジトリのマスターブランチを最後のコミットの親に強制します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.