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


21062

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

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


138
新しい回答を投稿する前に、この質問にはすでに65以上の回答があることを考慮してください。あなたの回答が既存の回答にないものを提供していることを確認してください。
Sazzad Hissain Khan 2017

91
gitに何が必要か知っていますか?git undo、 それでおしまい。そうすれば、gitが私たちが犯した間違いを処理するという評判が消えてしまいます。gitコマンドを実行する前に、現在の状態をgitスタックにプッシュして実装します。これはパフォーマンスに影響するので、有効にするかどうかに関する構成フラグを追加するのが最善です。
Yimin Rong、

11
@YiminRongこれはGitのalias機能で実行できます:git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric

3
@RomainValeri-同じ方法で元に戻す操作が他の場所でも機能します。
Yimin Rong

1
@YiminRong買ってない。人々はまだ元に戻してはならないことをいじって元に戻します。しかし、より重要なgit reflogことは、あなたが説明するものに既に近いですが、ユーザーが何を(行わない)かをより詳細に制御できるようにします。しかし、いいえ、「元に戻す」はどこでも同じように機能するわけではなく、人々は機能が実現するために多くの異なることを期待するでしょう。最後のコミットを取り消しますか?最後のアクションを元に戻しますか?最後のアクションがプッシュだった場合、(リセットしてプッシュ)または(元に戻してプッシュ)をどの程度正確に取り消しますか?
RomainValeri

回答:


22860

コミットを取り消してやり直す

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. これは元に戻したいものです。
  2. これは作業ツリー(ディスク上のファイルの状態)には何もしませんが、コミットを取り消し、コミットした変更はステージングされないままにします(そのため、変更はコミット用にステージングされていない変更として表示されgit statusます)。コミットする前に再度追加してください)。あなたがいる場合のみにしたい追加メッセージコミット以前に多くの変更をコミット、または変更1を、あなたが使用できるgit reset --soft HEAD~ようになる、代わりにgit reset HEAD~2しかし、既存の変更が上演葉。
  3. 作業ツリーファイルを修正します。
  4. git add 新しいコミットに含めたいもの。
  5. 古いコミットメッセージを再利用して、変更をコミットします。reset古いヘッドをにコピーしました.git/ORIG_HEADcommitwith -c ORIG_HEADはエディタを開きます。エディタには最初に古いコミットからのログメッセージが含まれており、編集することができます。メッセージを編集する必要がない場合は、この-Cオプションを使用できます。

ただし、インデックスに新しい変更を追加した場合は、 commit --amendすると以前のコミットに追加されることに注意してください。

コードがすでにサーバーにプッシュされており、履歴を上書きする権限がある場合(リベース):

git push origin master --force

この回答もご覧ください。

HEADを以前の場所に戻すにはどうすればよいですか?(切り離されたヘッド)&コミットの取り消し

上記の回答git reflog,は、SHA-1を特定するために使用されるものを示します。SHA-1は元に戻したいものです。上記で説明したコマンドのシーケンスを使用するために元に戻すポイントを見つけたら、


1ただし、コミットメッセージを間違えただけの場合は、以前のコミットにリセットする必要はありません。簡単なオプションは、git reset(それ以降に行った変更をステージング解除する)とgit commit --amendで、最後のコミットメッセージが事前に入力されたデフォルトのコミットメッセージエディターを開きます。

2 HEAD~はと同じHEAD~1です。また、gitのHEADとは何ですか?。複数のコミットのコミットを解除したい場合に役立ちます。


472
そして、コミットが間違ったブランチに対するものだった場合git checkout theRightBranch、すべての変更ステージを使用できます。私がしなければならなかったように。
Frank Shearar

490
DOSで作業している場合は、代わりにgit reset --soft HEAD^を使用する必要がありますgit reset --soft HEAD~1。^はDOSの継続文字であるため、正しく機能しません。また、--softがデフォルトなので、省略したい場合は省略できますgit reset HEAD~1
Ryan Lundy

119
zshユーザーは次のようになるでしょう:zsh: no matches found: HEAD^-エスケープする必要があります^ iegit reset --soft HEAD\^
tnajdek

7
誤って除外されるべきgit commit -aだったときに誤って発行された場合、答えは正しくありません-a。その場合は、--soft(どちらが--mixedデフォルトになるか)を省略せずに、コミットする予定の変更を再ステージングすることをお勧めします。
dmansfield 14

6
@IcyBrk git addはコマンドです。 git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786

10734

コミットの仕組みがわからない場合、コミットを元に戻すのは少し怖いです。しかし、あなたが理解していれば、それは実際には驚くほど簡単です。

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

   (F)
A-B-C
    ↑
  master

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

git reset --hard HEAD~1

結果は次のとおりです。

 (F)
A-B
  ↑
master

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

ああ、でも、コミットCが災害ではなかったとしたら、ほんの少しずれているとしましょう。コミット取り消すが、より良いコミットを行う前に、少し編集のために変更保持したい。ここからもう一度、Cをヘッドにして:

   (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にチェックインした変更が表示されます。何も失っていません!

最も簡単な方法として、コミットを取り消すこともできますが、ファイルとインデックスは残しておいてください

git reset --soft HEAD~1

これは、ファイルをそのままにするだけでなく、インデックスもそのままにします。実行するとgit status、以前と同じファイルがインデックスに含まれていることがわかります。実際、このコマンドの直後に実行できgit commit、同じコミットをやり直します。

もう1つ:最初の例のようにコミットを破棄したが、結局それが必要であるとわかったとします。か?頑張ってね

いいえ、それを取り戻す方法はまだあります。入力するgit reflogと、移動した(部分的な)コミットsha(つまり、ハッシュ)のリストが表示されます。破棄したコミットを見つけて、次のようにします。

git checkout -b someNewBranchName shaYouDestroyed

これで、そのコミットが復活しました。コミットは実際にはGitで約90日間破棄されないため、通常は戻って、取り除くつもりのなかったコミットを救うことができます。


15
注意してください!エラーのあるコミットが(早送り)マージであった場合、これは期待どおりに動作しない可能性があります。頭がマージコミット(例:ブランチ機能をマスターにマージ)している場合git reset --hard~1、マスターブランチは機能ブランチ内の最後のコミットを指します。この場合、相対コマンドの代わりに特定のコミットIDを使用する必要があります。
Chris Kerekes

90
重要なポイントがありません:上記のコミットが以前にリモートに「プッシュ」された場合、「元に戻す」操作は、どんなに単純であっても、ローカルコピーにこのコミットを持っている残りのユーザーに多大な苦痛と苦痛を引き起こします。彼らが将来「git pull」をするとき。したがって、コミットがすでに「プッシュ」されている場合は、代わりに次のようにします。git revert <bad-commit-sha1-id> git push origin:
FractalSpace

12
@FractalSpace、それは「巨大な痛みと苦しみ」を引き起こしません。チームでGitを使用するときに、いくつかの強制プッシュを実行しました。必要なのはコミュニケーションだけです。
Ryan Lundy

14
@Kyralessa私の職場では、チーム全体のワークフローをめちゃくちゃにして、修正方法を伝えることは「コミュニケーション」と呼ばれていません。git history re-writeは、レポの一部を破壊する破壊的な操作です。明確かつ安全な代替手段が利用可能である一方で、その使用を主張することは単に無責任です。
FractalSpace 2013年

14
私はコミットを核にしたくて二度とそれを見たくありませんでした。私はあなたの例を使用しました--hardが、私が理解していないことは、私の作業ツリーでのステージングされていないすべての変更もまた核になるということです!これらのファイルを後でコミットするときにコミットしました。現在、これらのファイルを元に戻すことは不可能のようです-あなたが投稿した解決策を試しましたreflogが、これは以前にステージされていない変更を復元しませんでした。
Adam Burley

2129

最後のコミットを「取り消す」には、コミットを公開(リモートリポジトリにプッシュ)しているかどうかによって、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.

それが最後の前には、コミットされた方法にすべてのバックを復元するには、我々はする必要がreset前にコミットしますHEAD

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 Basics-Undoing Thingsをご覧ください。


101
私はこの答えを最も明確に見つけました。git revert HEAD^前ではなく、前の前です。私はそうしました:git revert HEADそしてもう一度プッシュしてそれは
うまくいき

Gitから「もっと?」と聞かれたら これらのコマンドを試すときは、この回答の代替構文を使用してください:stackoverflow.com/a/14204318/823470
tar

1745

ファイルを追加/削除して、思い通りの状態にします。

git rm classdir
git add sourcedir

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

git commit --amend

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

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


2
参考:これによりすべてのファイルが削除され、変更が失われました。
egorlitvinenko

UPD:ただし、reflogを使用して復元しました。しかし、最初のコミットでは領収書は機能しませんでした。
egorlitvinenko

1
git rm --cachedファイルシステムにファイルを保持し、gitインデックスからのみ削除するために使用します!
xuiqzy

1016
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コミットあなたの間違った前のコミットの状態にあなたの作業コピーを設定します。


19
git commit -a -m ""またはgit commit -am ""自然に!:]
trejder 2014年

stashのもう1つの「ショートカット」使用。すべてのステージを解除したい場合(取り消しgit add)git stash、次の場合git stash pop
seanriordan08

778

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

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

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

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

git commit --amend

または、それが共有ブランチの場合は、新しいコミットを作成します。

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


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


ProTip™:gitignoreに追加*.classして、これが再び発生しないようにします。


コミットを元に戻すには

最後のコミットを変更する必要がある場合は、コミットの修正が理想的なソリューションですが、より一般的なソリューションはresetです。

次のコマンドを使用して、Gitをコミットにリセットできます。

git reset @~N

どこNのコミットの数が前にありHEAD、かつ@~、前にリセットがコミット。

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

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

チェックアウトgit help reset、特に上のセクション--soft --mixed--hardこれが何をするかをよりよく理解するため、。

Reflog

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

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



2
これから読む人のために-それgit revertは別のコマンドであることに注意してください-これは基本的に単一のコマンドを「リセット」します。
BKSpurgeon

682

を使用しgit revert <commit-id>ます。

コミットIDを取得するには、単にを使用しますgit log


15
それはどういう意味ですか、チェリーはコミットを選びますか?私の場合、ファイルを編集したときに間違ったブランチにいました。私はそれをコミットした後、自分が間違ったブランチにいることに気付きました。「git reset --soft HEAD〜1」を使用すると、コミットの直前に戻りましたが、正しいブランチをチェックアウトした場合、間違ったブランチのファイルへの変更を取り消す代わりに、(同じ名前の)ファイル)正しいブランチにありますか?
astronomerdave

私はちょうど利用git revert commit-id魅力のように働きました。もちろん、変更をプッシュする必要があります。
Casey Robinson

8
それはgit cherry-pick <<erroneous-commit-sha>>@astronomerdave だと思います。から、ほぼ2歳の党党首。
トムハワード

@クリス:チェリーピックの代わりにリベースを使用。高度なチェリーピッキングなので
Eugen Konkov

コミットをすでにプッシュしている場合にのみ、リバートを使用します。それ以外の場合は、リセットをお勧めします。revertが新しいコミットを作成することを忘れないでください。通常、これは目標ではありません。
Hola Soy Edu Feliz Navidad

532

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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

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

もっと


13
@SMR、あなたの例では、すべてが現在のHEADのみを指しています。HEAD ^ = HEAD ^ 1。HEAD ^ 1 = HEAD〜1と同様。HEAD〜2を使用する場合、〜記号と^記号には違いがあります。〜2を使用する場合、「最初の親の最初の親」または「祖父母」を意味します。
Madhan Ayyasamy 2015

501

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


470

共有リポジトリで最新の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 git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

25
共有リポジトリの履歴を書き換えることは、一般的に非常に悪い考えです。私はあなたがあなたが何をしているか知っていると思います、私は将来の読者もそうすることを望みます。
Brad Koch

はい、ロールバックは危険です。プッシュする前に、作業コピーが目的の状態であることを確認してください。プッシュすると、不要なコミットが完全に削除されます。
neoneye

6
「現実世界と同じように、歴史を書き直したい場合は、陰謀が必要です。誰もが陰謀に「参加」している必要があります(少なくとも、歴史について知っているすべての人、つまり、これまでに支店から引っ張ったことのある人)。 」出典:stackoverflow.com/a/2046748/334451
Mikko Rantalainen 2013

440

git rebase -iはこの仕事に使うことを好みます。それは、削除するコミットを選択できる素敵なリストがポップアップするからです。ここで他のいくつかの答えほど直接的ではないかもしれませんが、それは正しい感じています

リストするコミットの数を選択し、次のように呼び出します(最後の3つをエンリストするには)

git rebase -i HEAD~3

サンプルリスト

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

次に、Gitは削除した行のコミットを削除します。


422

以前のローカルコミットを修正する方法

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) ## remove public version of branch

ローカルでブランチをクリーンアップしてから再プッシュします...

git push origin (branch_name)

通常の場合、プライベートブランチのコミット履歴が元のままであることを心配する必要はないでしょう。ただフォローアップコミットをプッシュし(上記の「パブリックコミットを元に戻す方法」を参照)、後でスカッシュマージを実行して履歴を非表示にします。


8
gitk --all $(git reflog | cut -c1-7)&「--amend」コミットを取り消す場合は、以前のリビジョンを見つけるのに役立ちます。
nobar 2014年

4
共有リポジトリにプッシュする前に秘密情報を削除しようとしている場合、情報は以前のコミットの履歴に残っているため、元に戻すことは役に立ちません。変更が他のユーザーに表示されないようにする場合は、使用する必要がありますgit reset
Jherico

'private' / 'public'はより正確には 'local' / 'remote'になると思います。
nobar 2018年

リモートリポジトリのプライベートブランチを修正することもできますgit push origin (branch_name) --force
nobar

336

完全に元に戻したい場合で、リポジトリを複製した場合

コミットIDは、

git log 

その後、あなたは行うことができます-

git reset --hard <commit_id>

git push origin <branch_name> -f

「<commit_id>」を使用せず、単に「git reset --hard」を使用するとどうなりますか?私は通常、まだコミットしていない最新の更新を取り除き、作成した最新のコミットに戻したいだけで、常に「git reset --hard」を使用します。
Jaime Montoya 2017

3
@JaimeMontoya最新の変更を取り消すにはを使用できますがgit reset --hard、最後の "n"コミットを
完全に

334

ジャンクをコミットしたがプッシュされなかった場合、

git reset --soft HEAD~1

HEAD〜1は、ヘッドの前にコミットの省略形です。または、リセットしたい場合は、ハッシュのSHA-1を参照できます。--softオプションはコミットを削除しますが、git statusがコミットするため、変更されたすべてのファイルは「コミットされる変更」のままになります。

ヘッドの前のコミット以降に作業ツリーで追跡されたファイルへの変更を取り除きたい場合は、代わりに「--hard」を使用してください。

または

すでにプッシュしていて、誰かがプルした場合は通常は私のケースですが、git resetを使用することはできません。ただし、git revertを実行できます。

git revert HEAD

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


2番目のケースですが、「git revert HEAD」を実行すると、「エラー:コミット[ID]はマージですが、-mオプションが指定されていません。致命的:復帰に失敗しました」と表示されます。助言がありますか?
metaforge 2014年

2
おそらくHEAD~1、実際のハッシュをby git log --statまたはbyで表示されるように使用できることに言及する価値があるでしょうgit reflog-複数のコミットを「元に戻す」必要がある場合に便利です。
ccpizza

284

SourceTree(GitHubのためのGUI)、あなたがコミットして「逆にコミット」を実行右クリックしてください。これで変更が取り消されます。

ターミナルで:

別の方法として使用できます。

git revert

または:

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 your changes.

263

単一のコマンド:

git reset --soft 'HEAD^' 

最後のローカルコミットを元に戻すのは素晴らしいことです!


11
私はgit reset --soft "HEAD ^"を二重引用符で囲む必要がありました。これは、Windowsコマンドプロンプトから書き込むためです。
恵那

253

以下のコマンドを使用してリセットするだけです gitです:

git reset --soft HEAD~1

説明:git reset、それは基本的にだんresetあなたはあなたがそれを組み合わせる場合は、その後、戻って行きたいコミットいずれかに--softあなたが戻って、ステージに取得するので、キー、それが戻って行くが、あなたのファイル(複数可)の変化を維持します追加されたばかりのファイルHEADのブランチのヘッドであり、~1(この場合はも使用するHEAD^)と組み合わせると、必要なコミットが1つだけ戻ります...

実際の状況で発生する可能性のあるすべてのステップやコードのコミットなど、以下の画像のステップをより詳細に作成します。

Gitの最後のコミットを元に戻すには?


239

最後のGitコミットを元に戻すには?

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

  1. 行った変更を保持したくない場合:

    git reset --hard HEAD^
    
  2. 変更を保持したい場合:

    git reset --soft HEAD^
    

次に、gitログを確認します。最後のコミットが削除されたことを示します。


193

「作業ツリーを最後のコミットにリセットします」

git reset --hard HEAD^ 

「作業ツリーから不明なファイルを削除する」

git clean    

参照-Gitクイックリファレンス

注:このコマンドは以前のコミットを削除するため、注意して使用してください!git reset --hardより安全です。


190

reflogを使用して正しい状態を見つける

git reflog

前にreflog リセット前の再ログ

正しいreflog(私の場合はf3cb6e2)を選択して、

git reset --hard f3cb6e2

その後、リポジトリのHEADは、リセット後のHEADid LOGにリセットされます リセット効果

最後に、reflogは次の図のようになります。

後の再ログ REFLOG FINAL


164

ファーストラン:

git reflog

コミット、マージ、プルなど、リポジトリで実行したすべての可能なアクションが表示されます。

次に行います:

git reset --hard ActionIdFromRefLog

155

最後のコミットを元に戻す:

git reset --soft HEAD^ または git reset --soft HEAD~

これにより、最後のコミットが取り消されます。

ここで--softは、ステージングへのリセットを意味します。

HEAD~または、HEAD^HEADの前にコミットするように移動することを意味します。


最後のコミットを新しいコミットに置き換える:

git commit --amend -m "message"

最後のコミットを新しいコミットに置き換えます。


153

別の方法:

元に戻したいブランチをチェックアウトし、ローカルの作業用コピーを、リモートサーバー上の最新のものにするコミットにリセットします(それ以降はすべてバイバイ)。これを行うには、SourceTreeでを右クリックして、「BRANCHNAMEをこのコミットにリセット」を選択しました。

次に、リポジトリのローカルディレクトリに移動して、次のコマンドを実行します。

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

これにより、ローカルリポジトリ内の現在のコミット以降のすべてのコミットが消去されますが、その1つのブランチについてのみです。


144

git log最後のコミットハッシュコードを入力して見つけ、次のように入力します。

git reset <the previous co>

139

私の場合、不要なファイルを誤ってコミットしました。だから私は次のことをしましたそしてそれはうまくいきました:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

gitkまたはgit log --statで結果を確認します


133

コマンドラインでこれを実行してください:

git reset --soft HEAD~ 

126

それを行うには多くの方法があります:

最後のコミット/以前のコミットを取り消すGitコマンド:

警告:何をしているかわからない場合は--hardを使用しないでください。--hardは危険すぎます。ファイルを削除する可能性があります。

Gitでコミットを元に戻す基本的なコマンドは次のとおりです。

$ git reset --hard <COMMIT -ID>

または

$ git reset --hard HEAD~<n>

COMMIT-ID:コミットのID

n: 元に戻したい最後のコミットの数です

以下に示すように、コミットIDを取得できます。

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

ここで、d81d3f1be20eb8はコミットIDです。

いくつかのケースを見てみましょう:

最後のコミット「d81d3f1」を元に戻したいとします。2つのオプションがあります。

$ git reset --hard d81d3f1

または

$ git reset --hard HEAD~1

コミット 'be20eb8'を元に戻したいとします。

$ git reset --hard be20eb8

詳細情報については、ヘッドを指定した状態にリセットするために、他のいくつかのコマンドも参照して試してみてください。

$ git reset --help

5
git reset --hard HEAD~1ある危険すぎる!これは「最後のコミットをキャンセルする」だけでなく、リポジトリを以前のコミットに完全に戻します。したがって、最後のコミットでコミットされたすべての変更が失われます。
Arnis Juraga 2017年

あなたが正しい、これを元に戻すために使用できますgit push -f <remote> HEAD@{1}:<branch>
Benny

残念ながら、私は--hardを使用し、ファイルは削除されます!コメントは折りたたまれているため、最初にチェックしませんでした。何をしているかわからない場合は--hardを使用しないでください。
匿名

125

ローカルコミットの場合

git reset --soft HEAD~1

または、それがどのコミットであるかを正確に覚えていない場合は、

git rm --cached <file>

プッシュされたコミットの場合

リポジトリ履歴からファイルを削除する適切な方法は、を使用することですgit filter-branch。あれは、

git filter-branch --index-filter 'git rm --cached <file>' HEAD

ただし、このコマンドは慎重に使用することをお勧めします。詳しくはgit-filter-branch(1)マニュアルページをご覧ください


125

主なシナリオは2つあります

まだコミットをプッシュしていません

問題があなたがコミットした余分なファイルだった場合(そしてそれらをリポジトリに置きたくない場合)、を使用git rmしてそれらを削除してからコミットすることができます--amend

git rm <pathToFile>

を使用してディレクトリ全体を削除し-rたり、他のBashコマンドと組み合わせたりすることもできます

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

ファイルを削除した後、-amendオプションを使用してコミットできます

git commit --amend -C HEAD # the -C option is to use the same commit message

これにより、最近のローカルコミットが書き換えられて余分なファイルが削除されるため、これらのファイルはプッシュで送信されることはなく、GCによってローカルの.gitリポジトリからも削除されます。

あなたはすでにコミットをプッシュしました

他のシナリオと同じ解決策を適用git pushしてから-fオプションを使用することもできますが、リモート履歴がさまざまな変更で上書きされるため、お勧めしません(リポジトリが混乱する可能性があります)。

代わりに、せずにコミットを実行する必要があります--amend(-amendについてこれを覚えておいてください:このオプションは、最後のコミットの履歴を書き換えます)。


125

以前のリビジョンにリセットするには、コミットされていないすべての変更を完全に削除します。

git reset --hard HEAD~1

23
多分あなたは彼のコマンドがコミットそれ以上の質問なしに作業ディレクトリの変更を捨てるというメモ/警告でできたでしょう。
cr7pt0gr4ph7 2014年

6
たまたまこれを偶然に行っても、すべてが失われるわけではありません。stackoverflow.com/questions/10099258/…、stackoverflow.com / questions / 15479501 / およびstackoverflow.com/questions/7374069/undo-git-reset-hard/7376959を参照してください。
cr7pt0gr4ph7 2014年

13
使用--softとして変更内容を保つためにuncommitted changes--hard1によって完全にコミットし、復帰背中をNUKEします。このような操作は、まだプッシュされていない変更に対してのみ行うことを忘れないでください。
Yunus Nedim Mehel

@Zaz:あなたは正しいです。多分それを明確にすべきだった。インデックスに追加された(/ staged)、またはコミットされたファイル/変更のみが、おそらく回復できます。あなたが言ったように、コミットされていない段階的な変更によって完全に捨てられgit reset --hardます。
cr7pt0gr4ph7 2016

1
補足として:ファイルがステージングされるたびに、gitその内容をオブジェクトデータベースに保存します。保存されたコンテンツは、ガベージコレクションが実行されたときにのみ削除されます。したがって、git reset --hard実行時に現在ステージングされていなかったファイルの最後にステージングされたバージョンを復元することができます(詳細については、上記のリンクを参照してください)。
cr7pt0gr4ph7 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.