ローカルgitコミットをキャンセルする方法


744

私の問題は、ファイルを変更したことです。例:README、新しい行 ' this for my testing line 'を追加してファイルを保存し、次のコマンドを発行しました

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

コードをgithubにプッシュしなかったので、このコミットをキャンセルしたい。

このために私は使用しました

   git reset --hard HEAD~1

しかし、READMEファイルから新しく追加された行「this for my testing line」を失いました。これは起こらないはずです。そこにコンテンツが必要です。コンテンツを保持してローカルコミットをキャンセルする方法はありますか?


3
あなたは間違いなくを求めていないようですがgit revert、これは元に戻されたコミットとは逆の差分で新しいコミットを作成します。リセットすると、現在のブランチが別のコミット(この場合は、「忘れる」前のコミット)を指すようになります。
Cascabel 2011年

1
注意:git-commitメッセージを空白のままにすると中止できるため、実際にコミットを完了していない場合に役立つ可能性があることを言及する価値があるかもしれません。
GKFX 2014

回答:


1423

フラグgit resetなしで使用するだけ--hardです:

git reset HEAD~1

PS:にHEAD^等しいUnixベースのシステムで使用できますHEAD~1。Windowsでは、行の継続を通知するHEAD^ため^機能しません。だからあなたのコマンドプロンプトはあなたに尋ねるだけですMore?


13
ちなみに、これは--mixed マニュアルで呼ばれています
Josh Lee

10
Gitの新しいバージョンでは@^、の省略形としても使用できHEAD^ます。
Koraktor 2014

これが何をしたのかはわかりませんが、変更リストに多くのファイルが表示されました。触れなかったファイル
FRR

@feresr最後のコミットまたは作業ツリーでこれらのファイルに実際に触れなかった場合、これは作業ツリー内の他の不整合が原因で発生します。
Koraktor

1
一方ですべてのコミットをリセットすることは可能ですか?
Webwoman

185

フラグの--soft代わりに使用--hard

git reset --soft HEAD^

18
2つのフラグの違いを説明できますか?
John Giotta、2015

1
パッケージマネージャーコンソールを開いてこの「git reset --soft HEAD ^」を実行すると、必要な処理(および必要な処理)が実行されます。
David Cornelson、2015

54
@JohnGiotta- git reset --soft HEAD^最後のローカル(プッシュされていない)コミットを削除しますが、行った変更保持します
16

@fider Saviour!受け入れられた回答がまだ機能するかどうかはわかりませんが、これがOPに必要な正確な回答になるはずです。
Babu

git reset --soft HEAD~Windowsの場合
Jack0fshad0ws

34

コミットの途中(つまり、エディター内)にいる場合は、最初のを超えるすべての行を削除することで、コミットをキャンセルできます#。コミットが中止されます。

したがって、コミットメッセージが空になるようにすべての行を削除してから、ファイルを保存できます。

このようになります。

次に、というメッセージが表示されますAborting commit due to empty commit message.

編集

すべての行を削除することもでき、結果はまったく同じになります。

vimのすべての行を削除するには(それがデフォルトのエディターの場合)、エディターに入ったらgg、最初の行に移動するように入力してから、dGすべての行を削除します。最後に、ファイルを書き込んで終了するwqと、コミットが中止されます。


3
これはまさに私が探していたものです!この回答にはさらに賛成票が必要です:)
jdunk 2017年

rebase -i mybranchname
参考

18

最初にすべきことは、コミットメッセージを削除する前にローカルの変更を保持するかどうかを決定することです。

を使用git logして現在のコミットメッセージを表示し、削除するコミットではなく、削除するコミットのcommit_id 前を見つけます。

ローカルで変更されたファイルを保持し、コミットメッセージを削除する場合:

git reset --soft commit_id

ローカルで変更されたすべてのファイルとコミットメッセージを削除する場合:

git reset --hard commit_id

それがソフトハードの違いです


1
それは逆だと思います。
Ruff9 '10

9

git resetを実行するときに、パラメーターの1つを使用して、インデックス(次のコミットになるファイルのセット)と作業ディレクトリをどうするかをGitに指示できます。

--soft:コミットのみがリセットされますが、インデックスと作業ディレクトリは変更されません。

--mixed:これにより、インデックスがHEADに一致するようにリセットされますが、作業ディレクトリは変更されません。すべての変更は作業ディレクトリに残り、変更されたように見えます。

--hard:HEADに一致するようにすべて(コミット、インデックス、作業ディレクトリ)をリセットします。

あなたの場合、git reset --soft変更した変更をインデックスと作業ディレクトリに保持するために使用します。確認してくださいこれをより詳細な説明のため。


1

以下のコマンドを使用します。

$ git reset HEAD~1

この後、以下の応答のように戻るファイルを表示することもできます。

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