web-dev-qa-db-ja.com

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

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

それから私はいくつかの連続的な変更を行い、私はすべてを捨てて私の元の状態に戻ることを望んでいることに気づきました。このコマンドは私のためにそれをしますか?

git reset --hard HEAD
1724

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

git checkout .

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

git reset

コミットした変更を元に戻すには、次の操作を行います。

git revert <commit 1> <commit 2>

追跡されていないファイル(新しいファイル、生成されたファイルなど)を削除する場合は、次の手順を実行します。

git clean -f

追跡されていないディレクトリ(新規または自動的に生成されたディレクトリなど):

git clean -fd
3093

注:あなたも実行することができます

git clean -fd

として

git reset --hard

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

これはエラーメッセージが出たときにも特に便利です。

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

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

このような状況で、空の状態で実行すると、上書きされる可能性のあるファイルの一覧を表示するのにも役立ちます。

363
Antony Stubbs

再クローン

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ローカルでプッシュされていないコミットを削除します。
  • track追跡したファイルに加えた変更を元に戻す
  • deleted削除した追跡ファイルを復元します
  • .gitignoreにリストされたファイル/ディレクトリを削除します(ビルドファイルのように)
  • __追跡されておらず.gitignoreにないファイル/ディレクトリを削除します。
  • ????あなたはこのアプローチを忘れないでしょう
  • ????帯域幅を無駄にする

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

清掃とリセット

git clean -f -d -x
git reset --hard
  • ローカルでプッシュされていないコミットを削除します。
  • track追跡したファイルに加えた変更を元に戻す
  • deleted削除した追跡ファイルを復元します
  • .gitignoreにリストされたファイル/ディレクトリを削除します(ビルドファイルのように)
  • __追跡されておらず.gitignoreにないファイル/ディレクトリを削除します。

クリーン

git clean -f -d -x
  • ローカルでプッシュされていないコミットを削除します。
  • track追跡したファイルに加えた変更を元に戻す
  • deleted削除した追跡ファイルを復元します
  • .gitignoreにリストされたファイル/ディレクトリを削除します(ビルドファイルのように)
  • __追跡されておらず.gitignoreにないファイル/ディレクトリを削除します。

リセット

git reset --hard
  • ローカルでプッシュされていないコミットを削除します。
  • track追跡したファイルに加えた変更を元に戻す
  • deleted削除した追跡ファイルを復元します
  • .gitignoreにリストされたファイル/ディレクトリを削除します(ビルドファイルのように)
  • __追跡されておらず.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 stash 上記のgit resetと同じですが、元に戻すことができます
96

すべての変更を元に戻して、現在のリモートマスターに最新の状態にしたい場合(たとえば、マスター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.
73
Michael Durrant

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
48
William Pursell

たくさんの答えを読んでそれらを試した後、私は様々なEdgeのケースを見つけました。

これが私の現在のbashスクリプトです。

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

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

34
Scott Davey

危険がある:(コメントを読んでください。私の答えで提案されたコマンドを実行すると、あなたが望む以上に削除されるかもしれません)

実行しなければならなかったディレクトリを含むすべてのファイルを完全に削除する

git clean -f -d
34
Tobias Gassmann

単に言う

git stash

それはあなたのすべての地元の敵を取り除きます。と言うことで、後で使うこともできます

git stash apply 
31
piyushmandovra

私は同じような問題に出会った。解決策はgit logを使ってどのバージョンのローカルコミットがリモートと異なるのかを調べることです。 (例えば、バージョンは3c74a11530697214cbcc4b7b98bf7a65952a34ecです)。

それからgit reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecを使って変更を元に戻します。

26
Patrick

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

ローカルコミットを捨てたいと思っていました。

  1. リポジトリをクローンしました(git clone)
  2. devブランチに切り替えました(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に戻ります。

10

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

$ 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
6
Janderson Silva

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

これを行うための一般的な使用例としては、 cruftを削除する マージや外部ツールによって生成された、または他のファイルを削除してクリーンビルドを実行できるようにすることが挙げられます。

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

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
joey