変更を失わずに最後のプッシュされていないgit commitをコミット解除する方法


540

ローカルコピーそのコミットで行われた変更を保持するようにコミットを元に戻す方法はありますが、作業コピーではコミットされていない変更になりますか?コミットをロールバックすると、前のコミットに戻ります-変​​更を加えたままにしたいのですが、間違ったブランチにコミットしました。

これはプッシュされておらず、コミットされているだけです。



6
git reset --softそしてgit reset --mixed、(少し異なる)これを行う参照の両方のgit -リセット
torek

回答:


931

これを行う方法はたくさんあります。例えば:

まだコミットを公にプッシュしていない場合:

git reset HEAD~1 --soft   

それだけです。コミットの変更は作業ディレクトリにありますが、LASTコミットは現在のブランチから削除されます。git reset manを参照してください


場合は、あなたはやった(「マスター」と呼ばれるブランチ上)公にプッシュ:

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

コミットを元に戻してプッシュ

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

作業コピーのローカル変更としてこれらの変更を加えたい場合(「ローカルコピーがそのコミットで行われた変更を保持するように」)- --no-commitオプションでコミットを元に戻す:

git revert --no-commit 86b48ba (hash of the revert commit).

小さな例を作成しました:https : //github.com/Isantipov/git-revert/commits/master


5
私の場合、キャンセルしたい2つのコミットがあり、「git reset HEAD〜1 --soft」を2回続けて実行すると、必要な場所に移動できました。
ジェフガンター、2015年

2
CLIを使用していない場合の説明を少し明確にするために、最初にreset述べたコマンドは、ヘッドの前の「ソフトに」1 revにリセットすることで、ローカルの変更をすべて保持しています。これは、SourceTreeで使用するためにすぐにはわかりませんでした。リセットしようとしているリビジョンではなく、以前のリビジョンにソフトリセットしていることを確認してください
Jon B

1
「プッシュ済み」のアプローチを試しましたが、git 2.14.1では動作しません"Already up to date"。マージを実行すると表示されます。
Fabio A.

1
@FabioA。、私は動作するバージョンで答えを更新しました。これに気づいてくれてありがとう!
イサンティポフ2018

1
これは機能しません。私はリセットとコミットをスキップし、gitのリバートとプッシュアウトのみを行いました...おそらく変更はまだ確実に失われていないかもしれません... 。
スカイバックフライング2018

13

変更をプッシュした場合、それを行うundoことができ、別のブランチを使用せずにファイルをステージに戻します。

git show HEAD > patch
git revert HEAD
git apply patch

最後のブランチの変更を含むパッチファイルを作成します。次に、変更を元に戻します。最後に、パッチファイルを作業ツリーに適用します。


あなたもしたいかもしれませrm patch
マックスコプラン

6

ケース:「これはプッシュされていません。コミットのみです。」-IntelliJ(または別のJetBrains IDE)を使用していて、まだ変更をプッシュしていない場合は、次に行うことができます。

  1. バージョン管理ウィンドウ(Alt + 9 / Command + 9)-「ログ」タブに移動します。
  2. 最後のコミットの前のコミットを右クリックします。
  3. 現在のブランチをここにリセット
  4. ソフトを選ぶ(!!!)
  5. ダイアログウィンドウの下部にある[リセット]ボタンを押します。

できました。

これにより、変更が「コミット解除」され、gitステータスが最後のローカルコミットの前の状態に戻ります。行った変更は失われません。


2
JetBrainsの方法を学ぶのが大好きです、ありがとう!これはgit reset --soft "HEAD^"、Windows の場合と同じです。:)
ペイン

3

私の場合、ほとんどの場合、変更を間違ったブランチにプッシュして、後で気づくと発生します。ほとんどの場合、以下の作業を行います。

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. コミットを元に戻す
  2. (作成して)他のブランチをチェックアウトする
  3. 元に戻す元に戻す

1
私はこれをテストしました。リモートにプッシュしていない場合も、このアプローチは機能します。$ git revert <commit-hash> ...次に他のブランチをチェックアウトしてから、$ git revert <revert-commit-hash>と入力します(プッシュなし)。このシンプルなアプローチを共有していただきありがとうございます!!
Natalie Cottrill、2018

2

2020シンプルな方法:

git reset <commit_hash>

保持したい最後のコミットのコミットハッシュ。


1

これらのコマンドを別のフォルダで実行する前に、必ず変更をバックアップしてください。

git checkout branch_name

ブランチでチェックアウト

git merge --abort

マージを中止する

gitステータス

マージを中止した後にコードのステータスを確認する

git reset --hard origin / branch_name

これらのコマンドは変更をリセットし、コードをbranch_name(branch)コードに合わせます。

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