誤って間違ったファイルをGitにコミットしましたが、まだサーバーにコミットをプッシュしていません。 ローカルリポジトリからこれらのコミットを元に戻すにはどうすればよいですか?
1 2 3 次 コミットを元に戻し、やり直します $ git commit -m "何かひどく誤った方向に進んだ"#(0:あなたの事故) $ git reset HEAD〜#(1) <<必要に応じてファイルを編集>>#(2) $ gitadd。 #(3) $ git commit -c ORIG_HEAD#(4) このコマンドは元に戻す役割を果たします。作業ツリー(ディスク上のファイルの状態)を変更せずに、最後のコミットを元に戻します。再度コミットする前に、再度追加する必要があります)。 作業ツリーファイルを修正します。 gitは、新しいコミットに含めたいものをすべて追加します。 古いコミットメッセージを再利用して、変更をコミットします。リセットにより、古いヘッドが.git / ORIG_HEADにコピーされました。 -cを指定してcommitを実行すると、ORIG_HEADがエディターを開きます。エディターには、最初は古いコミットからのログメッセージが含まれており、編集できます。メッセージを編集する必要がない場合は、-Cオプションを使用できます。 または、前のコミット(またはそのコミットメッセージのみ)を編集するには、commit --amendを使用して、現在のインデックス内の変更を前のコミットに追加します。 サーバーにプッシュされたコミットを削除する(元に戻さない)には、git push origin master--forceを使用して履歴を書き換える必要があります。 参考文献 HEADを前の場所に戻すにはどうすればよいですか? (切り離されたヘッド)&コミットを元に戻す 上記の回答は、git reflogを示しています。これを使用して、元に戻したいコミットのSHA-1を決定できます。この値を取得したら、上記で説明した一連のコマンドを使用します。 HEAD〜はHEAD〜1と同じです。記事gitのHEADとは何ですか?複数のコミットをコミット解除する場合に役立ちます。 | コミットの仕組みがわからない場合、コミットを元に戻すのは少し怖いです。しかし、あなたが理解していれば、それは実際には驚くほど簡単です。コミットを元に戻すことができる4つの異なる方法を紹介します。 オプション1:git reset --hard これがあるとしましょう。ここで、CはHEADで、(F)はファイルの状態です。 (F) A-B-C ↑ 主人 コミットCを削除し、それを二度と表示せず、ローカルで変更されたファイルのすべての変更を失いたいとします。これをして: git reset --hard HEAD〜1 結果は次のとおりです。 (F) A-B ↑ 主人 これでBがHEADになります。 --hardを使用したため、ファイルはコミットBでその状態にリセットされます。 オプション2:git reset ああ、でもコミットCは災害ではなく、少しずれていたとしましょう。コミットを元に戻したいが、より良いコミットを行う前に、少し編集するために変更を保持します。ここからもう一度、CをHEADとして使用します。 (F) A-B-C ↑ 主人 --hardを省略して、これを行うことができます。 git reset HEAD〜1 この場合、結果は次のようになります。 (F) A-B-C ↑ 主人 どちらの場合も、HEADは最新のコミットへの単なるポインターです。 git reset HEAD〜1を実行すると、GitにHEADポインターを1コミット戻すように指示します。ただし、(-hardを使用しない限り)ファイルはそのままにしておきます。これで、git statusに、Cにチェックインした変更が表示されます。失ったものはありません。 オプション3:git reset --soft 簡単に、コミットを元に戻すこともできますが、ファイルとインデックスはそのままにしておきます。 git reset --soft HEAD〜1 これにより、ファイルがそのままになるだけでなく、インデックスもそのままになります。 git statusを実行すると、以前と同じファイルがインデックスに含まれていることがわかります。実際、このコマンドの直後にgit commitを実行すると、今と同じコミットをやり直すことになります。 オプション4:git reset --hardを実行し、そのコードを元に戻す必要があります もう1つ:最初の例のようにコミットを破棄したが、結局それが必要であることに気付いたとしますか?頑張ってね? いいえ、それを取り戻す方法はまだあります。 git reflogと入力すると、移動した(部分的な)コミットシャ(つまり、ハッシュ)のリストが表示されます。破棄したコミットを見つけて、次の手順を実行します。 git checkout -b someNewBranchName shaYouDestroyed これで、そのコミットが復活しました。コミットは実際にはGitで約90日間破棄されないため、通常は戻って、削除するつもりがなかったコミットをレスキューできます。 | コミットを既に公開(リモートリポジトリにプッシュ)しているかどうかに応じて、最後のコミットを「元に戻す」には2つの方法があります。 ローカルコミットを元に戻す方法 ローカルでコミットしたとしましょうが、今度はそのコミットを削除したいと思います。 gitログ コミット101:不正なコミット#最新のコミット。これは「HEAD」と呼ばれます。 commit 100:good commit#最後から2番目のコミット。これが私たちが欲しいものです。 すべてを最後のコミット前の状態に戻すには、HEADの前にコミットにリセットする必要があります。 git reset --soft HEAD ^#変更を保持する場合は--softを使用します git reset --hard HEAD ^#行った変更を保持する必要がない場合は、-hardを使用します これで、gitログに最後のコミットが削除されたことが示されます。 パブリックコミットを元に戻す方法 すでにコミットを公開している場合は、以前のコミット(現在のHEAD)で行った変更を「元に戻す」新しいコミットを作成することをお勧めします。 git revert HEAD 変更が元に戻されますそしてあなたがコミットする準備ができています: git commit -m '誤って削除したファイルを復元する' gitログ コミット102:誤って削除したファイルを復元する コミット101:不要なファイルを削除する コミット100:必要なファイルを追加する 詳細については、Gitの基本-やり直しをご覧ください。 | ファイルを追加/削除して、思いどおりの方法でファイルを作成します。 git rm classdir git add sourcedir 次に、コミットを修正します。 git commit --amend 以前の誤ったコミットは、新しいインデックスの状態を反映するように編集されます。つまり、最初から間違いを犯したことがないようになります。 まだプッシュしていない場合にのみこれを行う必要があることに注意してください。プッシュした場合は、通常どおり修正をコミットする必要があります。 | git rm yourfiles/*。class git commit -a -m "フォルダ 'yourfiles'内のすべてのクラスファイルを削除しました" または git reset --hard HEAD〜1 警告:上記のコマンドは、コミットしたい.javaファイル(およびその他のファイル)への変更を完全に削除します。 HEAD-1にハードリセットすると、作業コピーが間違ったコミットの前のコミットの状態に設定されます。 | 最後のコミットを変更するには インデックス内のファイルを置き換えます。 git rm --cached * .class git add * .java 次に、それがプライベートブランチの場合は、コミットを修正します。 git commit --amend または、共有ブランチの場合は、新しいコミットを行います。 git commit -m'.classファイルを.javaファイルに置き換えます ' (以前のコミットを変更するには、素晴らしいインタラクティブリベースを使用してください。) ProTip™:*。classをgitignoreに追加して、これが再び発生しないようにします。 コミットを元に戻すには 最後のコミットを変更する必要がある場合は、コミットを修正することが理想的な解決策ですが、より一般的な解決策はリセットされます。 Gitは、次の方法で任意のコミットにリセットできます。 git reset @ 〜N ここで、NはHEADの前のコミットの数であり、@〜は前のコミットにリセットされます。 したがって、コミットを修正する代わりに、次を使用できます。 git reset @〜 git add * .java git commit -m ".javaファイルを追加する" これが何をするのかをよりよく理解するために、git help reset、特に--soft--mixedと--hardのセクションをチェックしてください。 Reflog 混乱した場合は、いつでもreflogを使用して、ドロップされたコミットを見つけることができます。 $ git reset @〜 $ git reflog c4f708b HEAD @ {0}:リセット:@〜に移動 2c52489 HEAD @ {1}:コミット:いくつかの.classファイルを追加しました $ git reset 2c52489 ...そしてあなたはあなたが始めたところに戻っています | git revertを使用します。 コミットIDを取得するには、gitlogを使用するだけです。 | ローカルコミットを完全に元に戻すことを計画している場合は、コミットで行った変更が何であれ、それについて何も心配しない場合は、次のコマンドを実行します。 git reset --hard HEAD ^ 1 (このコマンドはコミット全体を無視し、変更はローカルの作業ツリーから完全に失われます)。コミットを元に戻したいが、ステージング領域での変更が必要な場合(git addの後と同じようにコミット前)、次のコマンドを実行します。 git reset --soft HEAD ^ 1 これで、コミットしたファイルがステージング領域に入ります。間違ったコンテンツを編集する必要があるためにファイルをアップステージしたい場合は、次のコマンドを実行します。 git reset HEAD ステージングされた領域からステージングされていない領域にファイルが来るようにコミットしました。これでファイルを編集する準備ができたので、何を変更しても、編集して追加し、新しい/新しいコミットを行います。 詳細(リンク切れ)(アーカイブ版) | Git Extrasがインストールされている場合は、git undoを実行して、最新のコミットを元に戻すことができます。 git undo 3は、最後の3つのコミットを元に戻します。 | 共有リポジトリ内の最新の5つのコミットを元に戻したかったのです。ロールバックしたいリビジョンIDを調べました。次に、次のように入力しました。 プロンプト> git reset --hard 5a7404742c85 HEADは現在5a74047にありますカタログにもう1ページを追加しました プロンプト> git push origin master --force 合計0(デルタ0)、再利用0(デルタ0) リモート:bb / acl:neoneyeが許可されます。受け入れられたペイロード。 git@bitbucket.org:thecompany / prometheus.gitへ + 09a6480 ... 5a74047マスター->マスター(強制更新) プロンプト> | 私はこのジョブにgitrebase -iを使用することを好みます。これは、削除するコミットを選択できる素敵なリストがポップアップするためです。ここでの他のいくつかの答えほど直接的ではないかもしれませんが、それはちょうどいい感じです。 リストするコミットの数を選択し、次のように呼び出します(最後の3つを参加させるため) git rebase -i HEAD〜3 サンプルリスト RtmpSrvポートのaa28ba7サニティチェックを選択します c26c541RtmpSrvバージョンオプションを選択します 58d6909を選択してくださいより良いURLデコードサポート 次に、Gitは、削除した行のコミットを削除します。 | 以前のローカルコミットを修正する方法 git-gui(または同様のもの)を使用して、git commit--amendを実行します。 GUIから、コミットから個々のファイルを追加または削除できます。コミットメッセージを変更することもできます。 以前のローカルコミットを元に戻す方法 ブランチを以前の場所にリセットするだけです(たとえば、gitkまたはgit rebaseを使用)。次に、保存したコピーから変更を再適用します。ローカルリポジトリでガベージコレクションを行った後は、不要なコミットが発生しなかったようになります。これらすべてを1つのコマンドで実行するには、git reset HEAD〜1を使用します。 語警告:git resetを不注意に使用することは、作業コピーを混乱させる状態にするための良い方法です。可能であれば、Gitの初心者はこれを避けることをお勧めします。 パブリックコミットを元に戻す方法 変更を元に戻すには、逆チェリーピック(git-revert)を実行します。 ブランチに他の変更をまだ加えていない場合は、簡単に行うことができます... git revert --no-edit HEAD 次に、更新したブランチを共有リポジトリにプッシュします。 コミット履歴には、両方のコミットが別々に表示されます。 詳細:パブリックリポジトリのプライベートブランチの修正 これは危険な場合があります。再プッシュするブランチのローカルコピーがあることを確認してください。 また、注意:他の誰かがブランチで作業している可能性がある場合は、これを実行しないでください。 git push --delete(branch_name)##パブリックバージョンのブランチを削除します ローカルでブランチをクリーンアップしてから、プッシュします... git push origin(branch_name) 通常の場合、プライベートブランチのコミット履歴が元の状態であることを心配する必要はおそらくありません。フォローアップコミットをプッシュするだけで(上記の「パブリックコミットを元に戻す方法」を参照)、後でスカッシュマージを実行して履歴を非表示にします。 | 永久に元に戻したいが、リポジトリのクローンを作成した場合 コミットIDは次の人が見ることができます gitログ その後、あなたはすることができます- git reset --hard git push origin -f | ジャンクをコミットしたがプッシュされていない場合は、 git reset --soft HEAD〜1 HEAD〜1は、headの前のcommitの省略形です。または、にリセットする場合は、ハッシュのSHA-1を参照できます。 --softオプションはコミットを削除しますが、git statusが示すように、変更されたすべてのファイルを「変更をコミットする」ままにします。 ヘッドの前のコミット以降に作業ツリー内の追跡されたファイルへの変更を取り除きたい場合は、代わりに「--hard」を使用してください。 または すでにプッシュして誰かがプルした場合(通常は私の場合)、gitresetを使用することはできません。ただし、gitrevertを実行することはできます。 git revert HEAD これにより、偶発的なコミットによって導入されたすべてを元に戻す新しいコミットが作成されます。 | SourceTree(GitHubのGUI)で、コミットを右クリックして「逆コミット」を実行できます。これにより、変更が取り消されます。 ターミナル上: または、次を使用することもできます。 git revert または: git reset --soft HEAD ^#変更を保持する場合は、-softを使用します。 git reset --hard HEAD ^#変更を保持する必要がない場合は、-hardを使用します。 | 単一のコマンド: git reset --soft'HEAD ^ ' 最後のローカルコミットを元に戻すのは素晴らしいことです! | gitを使用して以下のコマンドを実行してリセットするだけです。 git reset --soft HEAD〜1 説明:git resetの機能は、基本的に、戻りたいコミットにリセットされます。その後、-softキーと組み合わせると、元に戻りますが、ファイルの変更は保持されます。ファイルが追加されたばかりの段階に戻ります。HEADはブランチのヘッドであり、〜1と組み合わせると(この場合はHEAD ^も使用します)、必要なコミットを1つだけ戻します。 .. 実際の状況で発生する可能性のあるすべてのステップやコードのコミットなど、詳細を下の画像にステップを作成します。 | 最後のGitコミットを元に戻す方法は? すべてを最後のコミット前の状態に戻すには、HEADの前にコミットにリセットする必要があります。 行った変更を保持したくない場合: git reset --hard HEAD ^ 変更を保持したい場合: git reset --soft HEAD ^ 次に、gitログを確認します。最後のコミットが削除されたことが表示されます。 | 「作業ツリーを最後のコミットにリセットする」 git reset --hard HEAD ^ 「作業ツリーから不明なファイルを削除する」 git clean 参照-Gitクイックリファレンス 注:このコマンドは以前のコミットを削除するため、注意して使用してください。 git reset--hardの方が安全です。 | reflogを使用して正しい状態を見つけます git reflog リセット前の再ログ 正しいreflog(私の場合はf3cb6e2)を選択し、次のように入力します git reset --hard f3cb6e2 その後、レポHEADはそのHEADidにリセットされます リセット後のログ 最後に、reflogは次の図のようになります REFLOG FINAL | ファーストラン: git reflog リポジトリで実行した可能性のあるすべてのアクション(コミット、マージ、プルなど)が表示されます。 次に、次のことを行います。 git reset --hard ActionIdFromRefLog | 最後のコミットを元に戻す: git reset --soft HEAD ^またはgitreset --soft HEAD〜 これにより、最後のコミットが取り消されます。 ここで--softは、ステージングにリセットすることを意味します。 HEAD〜またはHEAD ^は、HEADの前にコミットするために移動することを意味します。 最後のコミットを新しいコミットに置き換えます。 git commit --amend -m "メッセージ" 最後のコミットが新しいコミットに置き換えられます。 | 別の方法: 復元するブランチをチェックアウトしてから、ローカルの作業コピーを、リモートサーバーで最新のブランチにしたいコミットにリセットします(それ以降はすべてバイバイします)。これを行うには、SourceTreeでを右クリックし、[BRANCHNAMEをこのコミットにリセット]を選択しました。 次に、リポジトリのローカルディレクトリに移動して、次のコマンドを実行します。 git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAMEブランチ名:ブランチ名 これにより、ローカルリポジトリ内の現在のコミット以降のすべてのコミットが消去されますが、その1つのブランチのみが消去されます。 | git logと入力し、最後のコミットハッシュコードを見つけて、次のように入力します。 git reset <前のco> | 私の場合、やりたくないファイルを誤ってコミットしてしまいました。だから私は次のことをしました、そしてそれはうまくいきました: git reset --soft HEAD ^ git rm --cached [不要なファイル] git add [必要なファイル] git commit -c ORIG_HEAD gitkまたはgitlog--statを使用して結果を確認します | 簡単です。コマンドラインでこれを実行します。 git reset --soft HEAD〜 | 2つの主なシナリオがあります まだコミットをプッシュしていません 問題がコミットした余分なファイルであった場合(そしてそれらをリポジトリに残したくない場合)、git rmを使用してそれらを削除し、-amendを使用してコミットできます。 git rm -rを使用してディレクトリ全体を削除したり、他のBashコマンドと組み合わせたりすることもできます。 git rm -r git rm $(find -name '* .class') ファイルを削除した後、-amendオプションを使用してコミットできます git commit --amend -C HEAD#-Cオプションは、同じコミットメッセージを使用することです これにより、最近のローカルコミットが書き換えられて余分なファイルが削除されるため、これらのファイルがプッシュで送信されることはなく、GCによってローカルの.gitリポジトリからも削除されます。 すでにコミットをプッシュしました 他のシナリオと同じソリューションを適用してから、-fオプションを指定してgit pushを実行できますが、リモート履歴が異なる変更で上書きされるため、お勧めしません(リポジトリが混乱する可能性があります)。 代わりに、-amendなしでコミットを実行する必要があります(-amend`についてこれを覚えておいてください:このオプションは最後のコミットの履歴を書き換えます)。 | ローカルコミットの場合 git reset --soft HEAD〜1 または、それがどのコミットであるかを正確に覚えていない場合は、 git rm --cached <ファイル> プッシュコミットの場合 リポジトリ履歴からファイルを削除する適切な方法は、gitfilter-branchを使用することです。あれは、 git filter-branch --index-filter'git rm --cached 'HEAD ただし、このコマンドは注意して使用することをお勧めします。詳細については、git-filter-branch(1)のマニュアルページをご覧ください。 | 以前のリビジョンにリセットするには、コミットされていないすべての変更を完全に削除します。 git reset --hard HEAD〜1 | 何を使用するか、-softまたはreset --hardをリセットしますか? @Kyralessaの回答に2セントを追加しています。 何を使用すればよいかわからない場合は、-softを使用してください(この規則を使用して、安全のために--softを覚えています)。 どうして ? 誤って--hardを選択すると、以前とは異なり、変更が失われます。 誤って--softを選択した場合、追加のコマンドを適用することで--hardと同じ結果を得ることができます。 git reset HEAD file.html git checkout --file.html 完全な例 echo "いくつかの変更..."> file.html git add file.html git commit -m "間違ったコミット" #リセットする必要があります git reset --hard HEAD〜1(変更をキャンセル) #または git reset --soft HEAD〜1#ステージングに戻る git reset HEAD file.html#作業ディレクトリに戻る git checkout --file.html#変更をキャンセル クレジットは@Kyralessaに送られます。 | 1 2 3 次 非常に活発な質問。この質問に答えるために10の評判を獲得してください。レピュテーション要件は、この質問をスパムや無回答のアクティビティから保護するのに役立ちます。 あなたが探している答えではありませんか? git version-control git-commit undoとタグ付けされた他の質問を参照するか、独自の質問をしてください。