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

2009年07月18日に質問されました。  ·  閲覧回数 1.6M回  ·  ソース

Jacques René Mesrine picture
2009年07月18日

git initを実行したプロジェクトがあります。 何度かコミットした後、 git statusを実行しました。これにより、すべてが最新であり、ローカルでの変更はありませんでした。

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

git reset --hard HEAD

回答

1800 INFORMATION picture
2009年07月18日
3587

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

git checkout .

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

git reset

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

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd
Antony Stubbs picture
2009年07月20日
411

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

git clean -fd

なので

git reset --hard

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

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

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

これは、あなたとあなたの友人が両方とも同じ名前の新しいファイルを追加したときに作業コピーを更新するなど、いくつかのことを行うときに発生する可能性がありますが、彼は最初にそれをソース管理にコミットし、追跡されていないコピーを削除する必要はありません。

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

William Entriken picture
2017年03月20日
171

再クローンする

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

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

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

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

掃除

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

リセット

git reset --hard
  • ❌プッシュされていないローカルのコミットを削除します
  • ✅追跡ファイルに加えた変更を元に戻します
  • ✅削除した追跡ファイルを復元します
  • .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上記の
Michael Durrant picture
2015年04月23日
88

すべての変更を元に戻し、現在のリモートマスターを最新の状態にしたい場合(たとえば、マスター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.
William Pursell picture
2009年07月19日
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 [email protected]{0}: HEAD^^: updating HEAD
ae7c2b3 [email protected]{1}: commit: Append e to a
fdf2c5e [email protected]{2}: commit: Append d to a
145c322 [email protected]{3}: commit: Append c to a
363e22a [email protected]{4}: commit: Append b to a
fa26c43 [email protected]{5}: commit: Append foo to a
0a392a5 [email protected]{6}: commit (initial): Add file a
$ git reset --hard [email protected]{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
piyushmandovra picture
2015年04月24日
39

単に実行する-

git stash

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

git stash apply 
Scott Davey picture
2014年06月04日
38

たくさんの答えを読んで試した後、作業コピーを完全にクリーンアップしないことがあることを意味するさまざまなエッジケースを見つけました。

これが私の現在のbashスクリプトで、常に機能します。

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

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

Tobias Gassmann picture
2013年09月11日
36

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

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

git clean -f -d
Patrick picture
2013年08月28日
27

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

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

Manohar Reddy Poreddy picture
2017年02月25日
16

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

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

  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の最初のクローン状態に戻ります。