プッシュされていないgit commitを削除します


724

実行しましたgit commitが、まだリポジトリにプッシュしていません。だから私がそうするときgit status、私は「#あなたのブランチは1回のコミットで「マスター」よりも進んでいます。

だから私が私のトップコミットをロールバックしたいのなら、私はただ行うことができます:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

私がそうするとgit log私が得ることを考えると:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
日付:2009年9月29日火曜日11:21:41 2009 -0700


コミットdb0c078d5286b837532ff5e276dcf91885df2296
日付:2009年9月22日火曜日10:31:37 2009 -0700

9
この質問は、あなた自身の質問の別の質問と重複しているようです:stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
危険:reset --hardgitがローカルファイル(新しい作業)をWeb上のファイル(私に起こった)で上書きするため、作業が失われる可能性があります。gitに関する質問と回答では、コマンドの実行内容と読者がフォローしているリスクを明示する必要があります。
OrangeSherbet

回答:


673

あなたが使用している場合、実際にgit reset、あなたがリセットされていることをコミットを参照してくださいdb0c078おそらくあなたはコミットを望んでいるでしょう。

より簡単なバージョンはgit reset --hard HEAD^、現在のヘッドの前の以前のコミットにリセットすることです。そうすれば、コミットIDをコピーする必要がなくなります。

git reset --hardコミットしていない変更は失われる可能性があるため、を行うときは注意してください。git status作業コピーがクリーンであることを確認したり、そこにある変更をすべて破棄したい場合があります。

さらにorigin/master、コメントの@bdonlanで提案されているように、HEADの代わりに参照として使用できます。git reset --hard origin/master


374
またはgit reset --hard origin/master、それを元の場所にリセットします。
bdonlan 2009年

1
リセットできるもう1つの便利なポインタは、ORIG_HEADまたはreflog HEAD @ {1}(HEADの最後の位置)を利用したその一般化です。
JakubNarębski、2009年

12
git resetあなたのコードの前の読者。違い:あなたの将来の自己好意を行いresetreset --soft、およびreset --hard以前のはどのようになるのです(git add別名「作業」:)ピクチャー:リンク
user18099

3
これにより、削除するコミットにあったものがすべて削除されることに注意してください(つまりgit status、変更は表示されず、コミットは削除されます/変更は失われます)。
ビョルンBørresen

12
注:使用git reset --hard HEAD^すると、コミットされたファイルの変更が失われるので注意してください(変更は削除されます)。この質問には2つの分岐があります:コミットを元に戻すが、まだディスクに変更がある場合git reset --soft HEAD~1
papigee

625

変更をリモートにプッシュしていない場合

git reset HEAD~1

で作業コピーがクリーンかどうかを確認しgit statusます。

変更をリモートにプッシュしたELSE

git revert HEAD

このコマンドは最後の1つのコミット/変更を元に戻し/削除し、次にプッシュすることができます


34
これは、「プッシュされていない最新のgitコミットを削除する」に対する回答です(最も近い答えは
IMHO

25
また、最後のコミットで行われたローカルの変更を保持しますが、git reset --hardは保持しません
Stanimir Stoyanov

1
私にとっては、最後にプッシュされたコミットとプッシュされていないコミットが取り消されます
CodyChan

git revert HEAD for meは、プッシュする準備ができていたすべてのファイルを削除しました。注意してください!
Jason Bruce

159
git reset --hard origin/master

元の場所にリセットします。

これは、コメントで @bdonlanによって投稿されました。コメントを読んでいない人のためにこの回答を追加しました。


4
この質問は5年近く前に尋ねられましたが、これはすでにコメントの1つにあります。
Anubian Noob 2014

1
何から現在のローカルのブランチ異なる場合master-私が使用する必要がありorigin/mybranch、その後?
Pavel Vlasov

9
答えを急いでいるときはコメントを読んでいないのですが…答えとして答えてくれてありがとう(動作する簡単なもの)
Leonardo Alves Machado

警告:これにより、git reset HEAD~コミットをコードに戻すだけでなく、既存のコード変更がすべて削除されることに注意してください
Mayer Spitzer

70

この質問には2つの分岐があります(コミットをロールバックしても、ローカルの変更をすべて失いたくはありません)。

1.最新のコミットを元に戻し、コミットされたファイルの変更破棄するには、次のようにします。

git reset --hard HEAD~1

2.最新のコミットを元に戻し、ローカルの変更(ディスク上)を保持するには、次のようにします。

git reset --soft HEAD~1

これ(後のコマンド)は、実行した場合の状態に移動しますgit add

その後、ファイルのステージを解除したい場合は、

git reset

追加してから再度コミットする前に、さらに変更を加えることができます。


47

コンソールに入力するだけです:

$ git reset HEAD~

このコマンドは、リモートHEADより前のすべてのローカルコミットを破棄します


7
あなたの答えが既存の答えに何を追加するか説明できますか?
nvoigt 2018

これにより、プッシュする前に現在のコミットがクリアされます-他の回答のように、ローカルで行った変更を元に戻すことはありません-これは深刻な髪の引き出しの瞬間である可能性があります
Grant

43

私はそれらの1つがあなたのニーズに合うと信じています

1-コミットを元に戻し、すべてのファイルをステージングしたままにします。 git reset --soft HEAD~;

2-コミットを元に戻し、すべてのファイルをステージング解除します。 git reset HEAD~;

3-コミットを元に戻し、すべての変更を完全に削除します。 git reset --hard HEAD~;

ここに私は答えを見つけました


この回答は受け入れられる必要があります:D
アーロンジョンサブ

30

プッシュする前に最後のコミットを削除します

git reset --soft HEAD~1

1最後の2つの使用を削除する場合など、最後のコミットを意味します2*


3
こんにちはカリーナ、の言及は--soft可能な答えに加えて素晴らしいですが、理由も挙げていただけますか?ソリューションを説明することは常に役に立ちます。また、英語に固執するようにしてください。ありがとう
VlastimilOvčáčík2018

1
--soft-コミットを
取り消そ

19

私はこれをずっと簡単にしたので、私が以下をした同じ状況を経験しました。渡すcommit-Idことで、行きたい特定のコミットに到達できます:

git reset --hard {commit-id}

最後のコミットを削除したいのでcommit-Id、ポインタを移動する必要がある場所を渡す必要があります:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

私のような初心者のための警告です-変更を保持したいファイルをバックアップしてください。以前のバージョンに戻されるためです。私のシナリオでは、誤ってデータベースダンプをリポジトリディレクトリーに入れてコミットしました。これらのファイルをリポジトリにコミットしたくなかったのは明らかでしたが、DIDは他のファイルに加えた変更を保持したいと考えていました。そのため、git resetを実行する前に、バックアップから必要な変更をコピーして貼り付ける必要がありました。
user1063287

10

これが私がすることです:

最初にブランチをチェックアウトします(私の場合はmasterブランチ):

git checkout master

次に、リモートHEAD ^にリセットします(ローカルの変更がすべて削除されます)。強制的にクリーンアンドプルします。

git reset HEAD^ --hard && git clean -df && git pull

1
それは非常に核のオプションです。制限付きコミットにソフトリセットすることをお勧めします。
c0der512

3

1つの方法は、ローカルブランチを削除してサーバーからそのブランチをチェックアウトすることです。ローカルブランチが複数のコミットによってリモートより先にあり、それらすべてのコミットを解除する必要がある場合です。


素晴らしい答え-ソースツリーで簡単にクリックできます:)
KamilKiełczewski

1

私は同じ問題を抱えていて、結局やってしまいました:

git rebase -i HEAD~N

(Nはgitが表示するコミットの数です)

これにより、テキストエディターが表示され、それに関連付けられている行を削除することで、必要なコミットを削除できます。

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