Gitで最新のローカルコミットを元に戻すにはどうすればよいですか?

2009年05月30日に質問されました。  ·  閲覧回数 9.1M回  ·  ソース

Hamza Yerlikaya picture
2009年05月30日

誤って間違ったファイルGitにコミットしましたが、まだサーバーにコミットをプッシュしていません。

ローカルリポジトリからこれらのコミット戻すにはどうすればよい

回答

Esko Luontola picture
2009年05月30日
23848

コミットを元に戻し、やり直します

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
<< edit files as necessary >>                  # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)
  1. このコマンドは元に戻す役割を果たします。 作業ツリー(ディスク上のファイルの状態)を変更せずに、最後のコミットを元に戻します

  2. 作業ツリーファイルを修正します。

  3. git add新しいコミットに含めたいものは何でも。

  4. 古いコミットメッセージを再利用して、変更をコミットします。 resetは古いヘッドを.git/ORIG_HEADコピーしました; commit-c ORIG_HEADを指定すると、エディターが開きます。エディターには、最初は古いコミットからのログメッセージが含まれており、編集できます。 メッセージを編集する必要がない場合は、 -Cオプションを使用できます。

または、前のコミット(またはそのコミットメッセージのみ)を編集するにはcommit --amendが現在のインデックス内の変更を前のコミットに追加します。

サーバーgit push origin master --forceで書き換える必要があります。


参考文献

HEADを前の場所に戻すにはどうすればよいですか?

上記の回答はgit reflogを示しています。これを使用して、元に戻すコミットのSHA-1を決定できます。 この値を取得したら、上記で説明した一連のコマンドを使用します。


HEAD~HEAD~1と同じです。 記事gitのHEADとは何ですか? 複数のコミットをコミット解除する場合に役立ちます。

Ryan Lundy picture
2011年07月29日
11044

コミットの仕組みがわからない場合、コミットを元に戻すのは少し怖いです。 しかし、あなたが理解していれば、それは実際には驚くほど簡単です。 コミットを元に戻すことができる4つの異なる方法を紹介します。

オプション1: git reset --hard

これがあるとしましょう。ここで、CはHEADで、(F)はファイルの状態です。

   (F)
A-B-C
    ↑
  master

コミットCを削除し、それを二度と表示せず、ローカルで変更されたファイルのすべての変更を失いたいとします。 これをして:

git reset --hard HEAD~1

結果は次のとおりです。

 (F)
A-B
  ↑
master

これでBがHEADになります。 --hardを使用したため、ファイルはコミットBでその状態にリセットされます。

オプション2: git reset

ああ、でもコミットCは災害ではなく、少しずれていたとしましょう。 コミットするために保持します。 ここからもう一度、CをHEADとして使用します。

   (F)
A-B-C
    ↑
  master

--hard省略して、これを行うことができます。

git reset HEAD~1

この場合、結果は次のようになります。

   (F)
A-B-C
  ↑
master

どちらの場合も、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日間破棄されないため、通常は戻って、削除するつもりがなかったコミットをレスキューできます。

Andrew picture
2011年06月17日
2235

コミットを既に公開(リモートリポジトリにプッシュ)しているかどうかに応じて、最後のコミットを「元に戻す」には2つの方法があります。

ローカルコミットを元に戻す方法

ローカルでコミットしたとしましょうが、今度はそのコミットを削除したいと思います。

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

すべてを最後のコミット前の状態に戻すには、 HEAD前のコミットにresetする必要があります。

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

これで、 git logは、最後のコミットが削除されたことを示します。

パブリックコミットを元に戻す方法

すでにコミットを公開している場合は、以前のコミット(現在のHEAD)で行った変更を「元に戻す」新しいコミットを作成することをお勧めします。

git revert HEAD

これで、変更が元に戻され、コミットできるようになります。

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

詳細については、 Gitの基本-元に戻すことを確認してください。

bdonlan picture
2009年05月30日
1779

ファイルを追加/削除して、思いどおりの方法でファイルを作成します。

git rm classdir
git add sourcedir

次に、コミットを修正します。

git commit --amend

以前の誤ったコミットは、新しいインデックスの状態を反映するように編集されます。つまり、最初から間違いを犯したことがないようになります。

まだプッシュしていない場合にのみこれを行う必要があることに注意してください。 プッシュした場合は、通常どおり修正をコミットする必要があります。

Lennart Koopmann picture
2009年05月30日
1058
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

または

git reset --hard HEAD~1

警告:上記のコマンドは、コミットしたい.javaファイル(およびその他のファイル)への変更を完全に削除します。

hard resetからHEAD-1は、間違ったコミットの前のコミットの状態に作業コピーを設定します。

Zaz picture
2010年07月31日
809

最後のコミットを変更するには

インデックス内のファイルを置き換えます。

git rm --cached *.class
git add *.java

次に、それがプライベートブランチの場合は、コミットを修正します。

git commit --amend

または、共有ブランチの場合は、新しいコミットを行います。

git commit -m 'Replace .class files with .java files'


以前のコミットを変更するには、素晴らしいインタラクティブリベースを使用してください。)


ProTip™: *.classgitignoreに追加して、これが再び


コミットを元に戻すには

最後のコミットを変更する必要がある場合は、コミットを修正することが理想的な解決策ですが、より一般的な解決策はresetです。

次の方法でGitを任意のコミットにリセットできます。

git reset @~N

ここで、 NHEADまでのコミット数であり、 @~は前のコミットにリセットされます。

したがって、コミットを修正する代わりに、次を使用できます。

git reset @~
git add *.java
git commit -m "Add .java files"

git help reset 、特に--soft --mixed--hardのセクションをチェックして、これが何をするのかをよりよく理解してください。

Reflog

混乱した場合は、いつでもreflogを使用して、ドロップされたコミットを見つけることができます。

$ git reset @~
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~
2c52489 [email protected]{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


Jaco Pretorius picture
2012年05月26日
716

git revert <commit-id>ます。

コミットIDを取得するには、 git logます。

Madhan Ayyasamy picture
2013年01月31日
562

ローカルコミットを完全に元に戻すことを計画している場合は、コミットで行った変更が何であれ、それについて何も心配しない場合は、次のコマンドを実行します。

git reset --hard HEAD^1

(このコマンドはコミット全体を無視し、変更はローカルの作業ツリーから完全に失われます)。 コミットを元に戻したいが、ステージング領域での変更が必要な場合( git add後と同じように、コミット前)、次のコマンドを実行します。

git reset --soft HEAD^1

これで、コミットしたファイルがステージング領域に入ります。 間違ったコンテンツを編集する必要があるためにファイルをアップステージしたい場合は、次のコマンドを実行します。

git reset HEAD

ステージングされた領域からステージングされていない領域にファイルが来るようにコミットしました。 これでファイルを編集する準備ができたので、何を変更しても、編集して追加し、新しい/新しいコミットを行います。

詳細(リンク切れ)アーカイブ版

nickf picture
2011年12月13日
529

Git Extrasがインストールされている場合は、 git undoを実行して、最新のコミットを元に戻すことができます。 git undo 3は、最後の3つのコミットを元に戻します。

neoneye picture
2012年04月06日
493

共有リポジトリ内の最新の5つのコミットを元に戻したかったのです。 ロールバックしたいリビジョンIDを調べました。 次に、次のように入力しました。

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>