私が実行したプロジェクトがありgit init
ます。何度かコミットしgit status
たところ、すべてが最新であり、ローカルでの変更はないことがわかりました。
その後、私はいくつかの連続した変更を行い、すべてを破棄して元の状態に戻したいと思ったことに気付きました。このコマンドは私のためにそれをしますか?
git reset --hard HEAD
私が実行したプロジェクトがありgit init
ます。何度かコミットしgit status
たところ、すべてが最新であり、ローカルでの変更はないことがわかりました。
その後、私はいくつかの連続した変更を行い、すべてを破棄して元の状態に戻したいと思ったことに気付きました。このコマンドは私のためにそれをしますか?
git reset --hard HEAD
回答:
作業コピーに加えた変更を元に戻す場合は、次のようにします。
git checkout .
インデックスに加えた変更(つまり、追加した変更)を元に戻す場合は、これを実行します。警告すると、プッシュされていないすべてのコミットがマスターにリセットされます!:
git reset
コミットした変更を元に戻す場合は、次のようにします。
git revert <commit 1> <commit 2>
追跡されていないファイル(新しいファイル、生成されたファイルなど)を削除する場合:
git clean -f
または追跡されていないディレクトリ(たとえば、新しいディレクトリまたは自動的に生成されたディレクトリ):
git clean -fd
git checkout .
動作しgit reset [--hard HEAD]
なかったgit clean -fd
ため、変更を元に戻すためにa を実行する必要がありました。
git reset
変更はリセットされませんが、リセットされますgit reset --hard
。
注:実行することもできます
git clean -fd
なので
git reset --hard
追跡されていないファイルは削除されません。git-cleanは、追跡されたルートディレクトリからgitの追跡下にないファイルを削除します。警告-これに注意してください!最初にgit-cleanを使用してドライランを実行し、何が削除されるかを確認すると便利です。
これは、エラーメッセージが表示された場合にも特に役立ちます。
~"performing this command will cause an un-tracked file to be overwritten"
これは、いくつかのことを行うときに発生する可能性があります。1つは、あなたとあなたの友人が両方とも同じ名前の新しいファイルを追加したときに作業コピーを更新することです。 。
この状況では、予行演習を行うと、上書きされるファイルのリストを表示するのにも役立ちます。
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
上記と同じですが、元に戻すことができますgit clean -f -d -x
:-xオプションが指定されている場合、無視されたファイルも削除されます。この缶は、例えば、GITのドキュメントからすべてのビルドproducts.-を削除することが有用である
すべての変更を元に戻し、現在のリモートマスターで最新の状態にしたい場合(たとえば、マスター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.
origin
。git reset --hard origin/master
これがないと(つまりgit reset --hard
)、何も変更されていないようです。
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 rebase -i
うまくいきませんでした(編集ミスのために、一部のコミットが消去されてしまいました)。このヒントのおかげで、良い状態に戻ってきました!
危険な先:(コメントをお読みください。私の回答で提案されているコマンドを実行すると、必要以上に削除される可能性があります)
実行する必要があったディレクトリを含むすべてのファイルを完全に削除する
git clean -f -d
たくさんの答えを読んで試してみたところ、作業コピーを完全にクリーンアップできないことがあるという、さまざまなエッジケースが見つかりました。
これは、実行するための現在のbashスクリプトで、常に機能します。
#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD
作業コピーのルートディレクトリから実行します。
error: pathspec 'HEAD' did not match any file(s) known to git.
git checkout HEAD
git reset --hard
追跡されたファイルを元に戻し(ステージングされているかどうかにかかわらず)、追跡されていgit clean -f -d
ないファイルを削除します。git checkout -- HEAD
なぜこれが必要なのですか?
単に実行する-
git stash
ローカルの変更がすべて削除されます。後で実行することでも使用できます-
git stash apply
git stash pop
と、隠された変更の一番上が自動的に削除されます
git stash drop
作業コピーに適用せずに最新の隠された状態を削除します。
私は同様の問題を検索しました、
ローカルコミットを破棄したかった:
以下もそうしました:
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の最初のクローン状態に戻ります。
作業ディレクトリに作業/ファイルを隠しておく必要は必ずしもないかもしれませんが、代わりにそれらを完全に削除してください。コマンド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`
ローカルブランチでコミットされていないすべての変更を元に戻すには、これを試してください
$ 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
この質問は、より広範なリポジトリのリセット/元に戻すことに関するものですが、個別の変更を元に戻すことに興味がある場合は、ここに同様の答えを追加しました:
https://stackoverflow.com/a/60890371/2338477
質問への回答:
変更をGit履歴に保存するかどうかにかかわらず、個々の変更を元に戻す方法
同じバージョンから再起動するために古いバージョンに戻す方法
git checkout path/to/file
ローカルの変更のみを元に戻しますpath/to/file