Git管理プロジェクトのすべてのローカル変更を以前の状態に戻すにはどうすればよいですか?


1914

私が実行したプロジェクトがありgit initます。何度かコミットしgit statusたところ、すべてが最新であり、ローカルでの変更はないことがわかりました。

その後、私はいくつかの連続した変更を行い、すべてを破棄して元の状態に戻したいと思ったことに気付きました。このコマンドは私のためにそれをしますか?

git reset --hard HEAD

回答:


3389

作業コピーに加えた変更を元に戻す場合は、次のようにします。

git checkout .

インデックスに加えた変更(つまり、追加した変更)を元に戻す場合は、これを実行します。警告すると、プッシュされていないすべてのコミットがマスターにリセットされます!

git reset

コミットした変更を元に戻す場合は、次のようにします。

git revert <commit 1> <commit 2>

追跡されていないファイル(新しいファイル、生成されたファイルなど)を削除する場合:

git clean -f

または追跡されていないディレクトリ(たとえば、新しいディレクトリまたは自動的に生成されたディレクトリ):

git clean -fd

133
fwiwは長い間、git checkout path/to/fileローカルの変更のみを元に戻しますpath/to/file
Matijs

29
以下の回答に+1して、git clean -f(追跡されていない変更を削除する)および-fd(追跡されていないディレクトリも削除する)についても言及している
ptdev

3
追跡されていないファイルもクリーンアップしたい場合は、このstackoverflow.com/questions/61212/…をお
Surasin Tancharoen

9
git checkout .動作しgit reset [--hard HEAD]なかったgit clean -fdため、変更を元に戻すためにa を実行する必要がありました。
BrainSlugs83

7
git reset変更はリセットされませんが、リセットされますgit reset --hard
Cerin 2016

388

注:実行することもできます

git clean -fd

なので

git reset --hard

追跡されてないファイル削除されません。git-cleanは、追跡されたルートディレクトリからgitの追跡下にないファイルを削除します。警告-これに注意してください!最初にgit-cleanを使用してドライランを実行し、何が削除されるかを確認すると便利です。

これは、エラーメッセージが表示された場合にも特に役立ちます。

~"performing this command will cause an un-tracked file to be overwritten"

これは、いくつかのことを行うときに発生する可能性があります。1つは、あなたとあなたの友人が両方とも同じ名前の新しいファイルを追加したときに作業コピーを更新することです。 。

この状況では、予行演習を行うと、上書きされるファイルのリストを表示するのにも役立ちます。


13
ファイルクリーンコマンドは「git clean -f」です。追跡されていないディレクトリは「git clean -d」で削除されます
Jonathan Mitchell

35
git clean -fd(-dには強制が必要です)
electblake '

14
-nまたは--dry-runは、予行演習のフラグです。
スティーブンベス2014

2
gitリポジトリに別のgitリポジトリがある場合は、git clean -ffd。ダブルfがなければ削除されません。
Trismegistos

148

再クローン

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • localローカルのプッシュされていないコミットを削除します
  • track追跡されたファイルに加えた変更を元に戻します
  • you削除した追跡ファイルを復元します
  • in .gitignore(ビルドファイルと同様に)にリストされているファイル/ディレクトリを削除します
  • track追跡されていないファイル/ディレクトリを削除します .gitignore
  • thisこのアプローチを忘れない
  • bandwidth帯域幅を浪費する

以下は、私が毎日忘れている他のコマンドです。

クリーニングしてリセット

git clean --force -d -x
git reset --hard
  • localローカルのプッシュされていないコミットを削除します
  • track追跡されたファイルに加えた変更を元に戻します
  • you削除した追跡ファイルを復元します
  • in .gitignore(ビルドファイルと同様に)にリストされているファイル/ディレクトリを削除します
  • track追跡されていないファイル/ディレクトリを削除します .gitignore

掃除

git clean --force -d -x
  • localローカルのプッシュされていないコミットを削除します
  • track追跡されたファイルに加えた変更を元に戻します
  • you削除した追跡ファイルを復元します
  • in .gitignore(ビルドファイルと同様に)にリストされているファイル/ディレクトリを削除します
  • track追跡されていないファイル/ディレクトリを削除します .gitignore

リセット

git reset --hard
  • localローカルのプッシュされていないコミットを削除します
  • track追跡されたファイルに加えた変更を元に戻します
  • you削除した追跡ファイルを復元します
  • in .gitignore(ビルドファイルと同様に)にリストされているファイル/ディレクトリを削除します
  • track追跡されていないファイル/ディレクトリを削除します .gitignore

ノート

上記すべてを確認するためのテストケース(bashまたはshを使用):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

こちらもご覧ください

  • git revert 以前のコミットを取り消す新しいコミットを作成する
  • git checkout 以前のコミットに時間を戻す(最初に上記のコマンドを実行する必要がある場合があります)
  • git stashgit reset上記と同じですが、元に戻すことができます

上記の答えを盗んで申し訳ありません。私はこのリファレンスを常に使用しており、ほとんどの場合私に投稿しています。
William Entriken 2017年

1
最初のオプション(Re-clone)が実際に「ローカルのプッシュされていないコミットを削除する」ことを確信しています:)
Marandil

1
@styfle✅は機能するもの、❌は機能しないもの
William Entriken

3
@FullDecent読みにくいです。「❌ローカルのプッシュされていないコミットは削除しません」。つまり、削除されません。ダブルネガティブは削除することを意味しますか?
スタイル

1
の-xフラグについてgit clean -f -d -x:-xオプションが指定されている場合、無視されたファイルも削除されます。この缶は、例えば、GITのドキュメントからすべてのビルドproducts.-を削除することが有用である
アレックス

82

すべての変更を元に戻し、現在のリモートマスターで最新の状態にしたい場合(たとえば、マスターHEADが分岐してからプッシュが「拒否」されたため、マスターHEADが前に移動したことがわかった場合)

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

(機能する)で指定することが重要であるように見えますorigingit reset --hard origin/masterこれがないと(つまりgit reset --hard)、何も変更されていないようです。
ジェイク、

私はいくつかのローカルの変更があり、git reset --hard origin / masterを実行したどのコマンドでもそれらを取り除くことができず、マスターの変更もプルすることができました
abhishek ringia '30

50

git-reflogを調べてください。それはそれが覚えているすべての状態をリストします(デフォルトは30日です)そしてあなたはあなたが望むものを単にチェックアウトすることができます。例えば:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

git reflogのton Williamに感謝します。ツリーを古いバージョンにリセットしましたが、最近のバージョンに戻す方法がわかりません。あなたのgit reflogは私を救いました。もう一度ありがとう。
パラニラジャ

1
私も救った!私の場合、私の冒険はgit rebase -iうまくいきませんでした(編集ミスのために、一部のコミットが消去されてしまいました)。このヒントのおかげで、良い状態に戻ってきました!
paneer_tikka 2013年

デフォルトの30日間とはどういう意味ですか?
Mohe TheDreamy

@MoheTheDreamy時間制限があることを意味します。最終的には、ガベージコレクターは、その制限を超えると到達できない参照を削除します。以前のデフォルトは30日でした(多分まだです)。したがって、古い参照は利用できない場合があります。
William Pursell 16年

36

危険な先:(コメントをお読みください。私の回答で提案されているコマンドを実行すると、必要以上に削除される可能性があります)

実行する必要があったディレクトリを含むすべてのファイルを完全に削除する

git clean -f -d

13
誰かを救うために私がたった今経験した苦痛を救うために:これは.gitignore-dファイルも削除します!
ランドン

ご迷惑をおかけして申し訳ありません。当時、私はそのフォルダ内のすべてを元に戻して削除しようとしました。正確な状況は思い出せませんが、 "-d"が唯一の働きでした。私はあなたにあまり苦痛を与えなかったと思います:-)
Tobias Gassmann '27

1
大丈夫です。私はバックアップを持っていましたが、これはおそらく免責事項を保証します;)
ランドオンズ

35

たくさんの答えを読んで試してみたところ、作業コピーを完全にクリーンアップできないことがあるという、さまざまなエッジケースが見つかりました。

これは、実行するための現在のbashスクリプトで、常に機能します。

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

作業コピーのルートディレクトリから実行します。


10
最後のコマンドが私に与えるerror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
「-」を外したとき、それは私のために働いた。 git checkout HEAD
Jester、2015

4
git reset --hard追跡されたファイルを元に戻し(ステージングされているかどうかにかかわらず)、追跡されていgit clean -f -dないファイルを削除します。git checkout -- HEADなぜこれが必要なのですか?
v.shashenko 2015年

二重ハイフンは必要ありません。タイプミスである必要があります。
Farax、2016

35

単に実行する-

git stash

ローカルの変更がすべて削除されます。後で実行することでも使用できます-

git stash apply 

3
使用するgit stash popと、隠された変更の一番上が自動的に削除されます
Arrow Cen

8
git stash drop作業コピーに適用せずに最新の隠された状態を削除します。
deerchao 2016年

git stash applyが新しく作成されたファイルを追加しない
Ravistm

27

同様の問題に遭遇しました。解決策はgit log、ローカルコミットのどのバージョンがリモートと異なるかを調べるために使用することです。(たとえば、バージョンはです3c74a11530697214cbcc4b7b98bf7a65952a34ec)。

次に、を使用git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecして変更を元に戻します。


16

私は同様の問題を検索しました、

ローカルコミットを破棄したかった:

  1. リポジトリのクローンを作成(git clone)
  2. 開発ブランチに切り替えました(git checkout dev)
  3. いくつかのコミットを行いました(git commit -m "commit 1")
  4. しかし、これらのローカルコミットを破棄してリモート(origin / dev)に戻ることにしました

以下もそうしました:

git reset --hard origin/dev

小切手:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

これで、ローカルコミットが失われ、上記のポイント1の最初のクローン状態に戻ります。


1
おかげで、それが私にとってうまくいった唯一のことです-"git reset --hard origin"
Naim

それが役に立ったと知ってうれしい。
Manohar Reddy Poreddy

7

作業ディレクトリに作業/ファイルを隠しておく必要は必ずしもないかもしれませんが、代わりにそれらを完全に削除してください。コマンドgit cleanがこれを行います。

これを行うためのいくつかの一般的な使用例は、クリーンビルドを実行できるように、マージまたは外部ツールによって生成された残骸削除するか、他のファイルを削除することです。

このコマンドはローカルの作業ディレクトリから追跡されないファイルを削除するように設計されているため、このコマンドには非常に注意する必要があることに注意してください。このコマンドを実行した後で突然気が変わった場合、削除されたファイルの内容を確認することはできません。より安全な代替策は実行することです

git stash --all

すべてを削除しますが、すべてを隠し場所に保存します。このスタッシュは後で使用できます。

ただし、本当にすべてのファイルを削除して作業ディレクトリをクリーンアップする場合は、次を実行する必要があります。

git clean -f -d

これにより、コマンドの結果として、ファイルがなく、アイテムがないサブディレクトリも削除されます。git clean -f -dコマンドを実行する前に実行する賢いことは実行することです

git clean -f -d -n

実行後に削除される内容のプレビューが表示されます git clean -f -d

だからここに最も積極的なものから最も積極的でないものまでのあなたのオプションの要約があります


オプション1:すべてのファイルをローカルで削除します(最も積極的)

git clean -f -d

オプション2:上記の影響をプレビューする(最も積極的なプレビュー)

git clean -f -d -n

オプション3:すべてのファイルを隠しておく(あまり積極的ではない)

`git stash --all` 

6

ローカルブランチでコミットされていないすべての変更を元に戻すには、これを試してください

$ git reset --hard HEAD

ただし、次のようなエラーが表示された場合:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

「.git」フォルダに移動して、index.lockファイルを削除できます。

$ cd /directory/for/your/project/.git/
$ rm index.lock

最後に、もう一度コマンドを実行します。

$ git reset --hard HEAD

0

この質問は、より広範なリポジトリのリセット/元に戻すことに関するものですが、個別の変更を元に戻すことに興味がある場合は、ここに同様の答えを追加しました:

https://stackoverflow.com/a/60890371/2338477

質問への回答:

  • 変更をGit履歴に保存するかどうかにかかわらず、個々の変更を元に戻す方法

  • 同じバージョンから再起動するために古いバージョンに戻す方法

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