ファイルやフォルダを含むコミットされていない変更を元に戻すにはどうすればよいですか?


1071

作業ツリーとインデックスでコミットされていないすべての変更を元に戻し、新しく作成されたファイルとフォルダーを削除するgitコマンドはありますか?



1
ええと、私は以下のさまざまな覚えにくい答えをすべて注意深く読み、「xxxがある場合は機能しませんでした」という回答を読んで、リポジトリ全体を削除し、それを複製してすべての編集および追加されたファイルを削除することにこだわっています。また、2つのコマンドのみです。rm -r projectdir; git clone xxx。私にとってはこれは頻繁に行われる操作です。リポジトリを試してみて、クリーンなチェックアウトに戻って変更を加えたいと思います。すばらしいとは言えませんが、100%機能します。いつか彼らがこれのための簡単なコマンドを追加することを願っています。
John Little

回答:


1771

次の2つのコマンドを実行できます。

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
'git clean -nd'を実行して変更をプレビューしてからgit cleanを実行することをお勧めします。削除する必要のある追跡されていないファイルやディレクトリがないことを確認してください。
jpw 2013

79
誰かにドキュメントへの旅行を保存します。-fは強制、-dはディレクトリを削除、-nは予行演習(また--dry-run、まだ何もせずに出力を表示)
Aaron Campbell

12
git clean -iインタラクティブモード用。
ガラス

ステージングされていないファイルはリセットされませんでした。最初にステージングする必要がありました。
Aron Lorincz 2016年

4
@IgorGanapolskyあなたはおそらくマージの競合の真っ最中です。実行してみてくださいgit merge --abort
htanata 2016年

555

現在の作業ディレクトリのみの変更を元に戻したい場合は、

git checkout -- .

その前に、実際に何も実行せずに元に戻すファイルを一覧表示し、次のようにして何が発生するかを確認できます。

git checkout --

1
これを試してみると、「エラー:パススペック」が表示されます。gitで認識されているどのファイルとも一致しませんでした
Mike K

34
thisとはgit reset --hardどう違いますか?
フェリペアルメイダ

104
'git reset --hard'は段階的変更と段階的でない変更の両方を元に戻しますが、 'git checkout-。'
ステージングされてい

しかし、チェックアウトを使用してファイルを変更した場合、この変更を元に戻す必要がある場合でも、コマンドを実行するとマージが必要であることを返します
Vinicius Monteiro

7
git checkout-元に戻すファイルを一覧表示します(アクションなし、一覧表示のみ)。これは、git checkoutを実行する前に、どのファイルが影響を受けるかを確認したい場合に役立ちます。
クリシュスリニバサン

107

「git checkout-...」を使用して、作業ディレクトリの変更を破棄します

git checkout -- app/views/posts/index.html.erb

または

git checkout -- *

ステージングされていないファイルに対して行われたすべての変更をgitステータスで削除します。

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *変更されたファイルが配置されているディレクトリにいる場合を除き、私にとっては機能しません。リポジトリ全体にわたるすべてのファイルをチェックアウトするには、しなければならないgit checkout -- :/
waldyrious

ではgit checkout -- *、スターはシェルに置き換えられ、すべてのファイルとディレクトリが現在のディレクトリにあります。したがって、サブディレクトリに移動する必要があります。わたしにはできる。しかし、私の意見ではよりきれいに繋がる構文 ":/"を強調してくれてありがとう。
mcoolive 2016年

53

重要な方法の1つは、次の2つのコマンドを実行することです。

  1. git stash これで変更がスタッシュに移動し、HEADの状態に戻ります
  2. git stash drop これにより、最後のコマンドで作成された最新のスタッシュが削除されます。

3
これは、コミットされていない変更に対しては機能せず、コミットされた変更に対してのみ機能します。
b0xxed1n 2016

4
私はそれをコミットされていない変更に使用しましたが、うまくいきます。
ポールD.エデン

7
@ b0xxed1n Stashingはすべてコミットされていない変更に関するものであり、明らかにそれらには有効です。
TJ

git stashはコミットされていない変更を保存するために作成されたので、コミットせずに保存できます。
Rob

gitのスタッシュ次のエラーでの結果:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

助けにはならなかった、新しいファイルが残った。私がしたことはすべての作業ツリーを完全に削除してから

git reset --hard

クリーニングオプションを追加するためのアドバイスについては、「gitでローカル作業ディレクトリをクリアするにはどうすればよいですか?」を参照してください-x

git clean -fdx

Note -xフラグはGitによって無視されたすべてのファイルを削除するので注意してください(私が参照する回答の説明を参照してください)。


-fdxとは 「力、ディレクトリ、xは?
Adi Prasetyo 2016

@AdiPrasetyo -xフラグは、無視されたすべてのファイルも削除します。それは望ましくない影響かもしれないので、私は私の答えを更新しました。
Fr0sT 2016年

まだリベースできません。エラー:エラー:変更のマージに失敗しました。パッチは0003で失敗しましたコールバックの作成失敗したパッチのコピーは次の場所にあります
IgorGanapolsky

13

次のコマンドを使用できると思います。 git reset --hard


うーん...私はそれをやったが、私のファイルはまだそこにあります 私は後に何かをすべきですか?
MEM

1
git resetは、作業ツリーのコミットされていない変更のみを元に戻します。新しいファイルとフォルダは削除されません。gitでそれを行う方法がわかりません
Josnidhin

1
そのため、新しいファイルとフォルダーを追加してシステムディレクトリを変更し、そのディレクトリを以前の状態(それらのファイルとフォルダーがない状態)に戻したい場合は、git?では、ファイルの状態を元に戻すのが最善でしょうか。しかし、ファイルを作成したら、手動で作成しない限り、そのファイルを削除することはできませんか?
MEM

6

消えないように見えるファイルがまだある可能性があることに注意してください-それらは編集されていない可能性がありますが、gitはCRLF / LFの変更のために編集済みとしてマークしている可能性があります。に変更を加えたかどうかを確認します.gitattributes最近。

私の場合、.gitattributesファイルにCRLF設定を追加しました。これにより、すべてのファイルが「変更されたファイル」リストに残りました。.gitattributesの設定を変更すると、それらが表示されなくなりました。


6

コミットされていない変更(作業コピーのみ)があり、最新のコミットのコピーに戻したい場合は、次のようにします。

git checkout filename

私はコミットされていない後にこれを試していますがgit rm filename、うまくいきません。error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

元に戻すための解決策はgit rmあるgit checkout master -- filename
falsePockets

3

Git 2.23では、git restore作業ツリーファイルを復元するコマンドが導入されました。

https://git-scm.com/docs/git-restore

現在のディレクトリ内のすべてのファイルを復元するには

git restore。

インデックス内のバージョンと一致するようにすべてのCソースファイルを復元する場合は、次のようにすることができます

git restore '* .c'


1
それは2.13ではなくgit 2.23です
phuclv

2

次のgitコマンドを使用するだけで、リポジトリで行われたコミットされていないすべての変更を元に戻すことができます。

git checkout .

例:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

私は通常、うまくいくこの方法を使用します:

mv fold/file /tmp
git checkout fold/file

これは、357の「いいね!」を持つ男が提案したものとまったく同じです。新しくチェックアウトしたファイルのバックアップを作成することさえします。
Matthias

-3

安全で長い道のり:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

使用する:

git reset HEAD filepath

例えば:

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