1つのコミットをロールバックするにはどうすればよいですか?


127

プッシュしなかったコミットが2つあります。

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

最初のロールバック(最も古いロールバック)をロールバックし、2番目のロールバックを保持するにはどうすればよいですか?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

ここから:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

私はただする必要があります:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

あれは?


3
この質問はプログラミングツールに関するものであるため、トピック外のようです。Stack Overflowに属します。
ピーターモーテンセン14

@PeterMortensen同意しました。これは、スーパーユーザーの範囲である
Kolobキャニオン

回答:


95

最も安全でおそらく最もクリーンな方法は、インタラクティブにリベースすることです。

git rebase -i HEAD^^

または、

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

そこからコミットを押しつぶすことができます。これにより、1つ以上のコミットが前のコミットにまとめられます。履歴からコミットを完全に削除するには、リストから行を削除します。

コミットを元に戻すことができgit revertますが、コミットメッセージを履歴に追加するため、望ましくない場合があります。-nパラメーターを使用して、すぐに元に戻すことをコミットしないようにGitに指示します。インタラクティブにリベースし、以前のコミットまでそれらをつぶして、物事をきれいに保つことができます。

ここで作業している2つのコミットが同じファイルに影響する場合、マージの競合が発生する可能性があります。

リポジトリのリセットはgit reset --hard元に戻せないため、注意して行う必要があります。

履歴の書き換えは慎重に行う必要があります。


「git rebase」中にコミットを削除するにはどうすればよいですか?コマンドは、ピック、編集、スカッシュの3つのみです。AFAIKの削除はありません。
n179911

8
リストからその行を完全に削除し、そのコミットを削除します
jtimberman

変更を元に戻したいときは、その痕跡を残しませんでした。復帰の痕跡も残したくない場合は、これが最善の方法です。
フィリップウィーラン

「最も安全で、おそらく最もクリーンな方法は、インタラクティブにリベースすることです」vimを使用しない場合はそうではないでしょう。私は幸運になって、その混乱から抜け出す方法を見つけました。vimを学ぶ必要があるため、まだ賛成です:
isimmons

rebaseできるだけ少ない使用をお勧めします。あなたが他の人と仕事をするならば、ただ作りなさいrevert
boldnik

52

これはhttp://nakkaya.com/2009/09/24/git-delete-last-commit/ からのものであり、私のために働いた

Git Delete Last Commit

時々夜遅くにコーヒーを使い果たしたとき、私は持ってはいけないものをコミットします。次に、最後のコミットを削除する方法をグーグルで次の10〜15分費やします。それで、3回目には後で参照できるように、それを記録したかったのです。

ジャンクをコミットしたがプッシュしていない場合、

git reset --hard HEAD~1

HEAD〜1は、ヘッドの前のコミットの省略形です。または、リセットするハッシュのSHA-1を参照できます。--hardを使用する場合、ヘッドの前のコミットが失われるため、作業ツリー内の追跡ファイルへの変更は失われることに注意してください。

行った作業を--soft完全に消去したくない場合は、コミットを削除するオプションを使用 できますが、git statusで設定されているように、変更されたファイルはすべて「コミットされる変更」のままになります。

今、あなたがすでにプッシュし、誰かがプルした場合、これは通常私の場合ですが、git resetを使用することはできません。ただし、Gitを元に戻すことはできますが、

git revert HEAD

これにより、偶発的なコミットによって導入されたすべてを元に戻す新しいコミットが作成されます。


2
--softオプションを使用すると、ファイルの名前を変更し、最初に「git add」を使用するのではなく、誤って「git commit -a」を実行するのに最適です。
アーロンハルン

8

いや。git-reset --hardを使用すると、履歴に戻ります。探しているのはgit revertで、コミットをすべて取り消します。


4
まあ、これは動作しますが、それはあなたがコミットログを汚染することにもなります。これらのコミットが既にプッシュ/プルされていない場合は、インタラクティブなリベースでクリーンアップすることをお勧めします。履歴を変更する機能は、他のバージョン管理システムに対するgitの主な利点の1つです。
knweiss

6

私はこれをやった:

git rebase -i HEAD^^

私はそれを台無しにしたので

git rebase --abort

それからまたやりました。その後、私はこのようにプッシュする必要がありました:

git push origin master -f

そして、ロールバックしたコミットよりも新しいコミットを破棄しました。うまくいきました。


4

いいえ、コミットgit reset --hard baf8d5eを削除し3368e1c、HEADはbaf8d5eその後になります。

3368e1cコミットを保持し、コミットを削除bad8d5eする場合、最も簡単な解決策は " git rebase -i HEAD~2"(つまり、最後の2つのコミットのインタラクティブなリベース)です。このコマンドはコミットメッセージエディターを起動し、最後の2つのコミットごとに1行表示されます。そこで、bad8d5eコミット行を削除して保存します。gitは履歴を書き換え、2回目のコミットはなくなります。

あなたのようなコミットメッセージエディタで使用できる他の有用なコマンドがありsquasheditなどインタラクティブリベースは非常に強力ですが!

誰かがこれらのコミットを既に見ている場合(リポジトリからプッシュまたはプル)、これをしないでください!



1
git reset --hard {ref}

リポジトリ内に他のコミットが1つしかない場合(最初のコミットなど1つ)、コミットを取り消す唯一の方法です。少なくともgit 1.7.5.1以降、残りの方法(リバート、リベース)は機能しません。

あなたが続く場合git resetgit gc、実際に削除されますその後、gitの古いが完全レポからデータをコミットします。


1
git checkout <treeish> -- /path/to/dir

これにより、/ path / to / dirに指定された「treeish」からディレクトリが戻されます。


0

リポジトリフォルダー内のHEADファイルから最後のコミットのハッシュコードを手動で編集することで、これが機能するようになりました。

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

それ以前は、ローカルで行ったUNMERGE操作を開始することはできませんでした。「いくつかのrefを中央リポジトリにプッシュできませんでした」と言い続けました。

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