Git リポジトリをクローンしてブランチをチェックアウトしました。作業した後、元のコピーが欲しかったので、ローカルの変更をすべて削除することにしました。
つまり、ローカルの変更を削除するには、次の2つのコマンドを実行する必要がありました。
git checkout .
git clean -f
私の質問は、
(1)これはローカル変更を取り除くための正しいアプローチですか、それとも正しいアプローチを教えてください。
(2)git reset --hard
このコマンドがなくてもリセットできるので、いつ使うのでしょうか?
ありがとう
*解決策: 主要な編集: 03/26: *あいまいな用語の多くを Git 固有の用語に置き換えました [追跡済み/未追跡/ステージング済み/未ステージング]
ローカルで変更を行う場合、ファイルのカテゴリは次の 3 つだけになります。
タイプ 1. ステージングされた追跡ファイル
タイプ 2. ステージングされていない追跡ファイル
タイプ 3. ステージングされていない追跡されていないファイル (別名追跡されていないファイル)
- ステージング済み - ステージング領域に移動されたもの/インデックスに追加されたもの
- 追跡された変更されたファイル
- 追跡されていない - 新しいファイル。常にステージングされていません。ステージングされている場合は、追跡されていることを意味します。
各コマンドの機能:
git checkout .
- ステージングされていない追跡ファイルのみを削除します [タイプ 2]git clean -f
- ステージングされていない追跡されていないファイルのみを削除します [タイプ 3]git reset --hard
- ステージングされた追跡ファイルとステージングされていない追跡ファイルのみを削除します[タイプ 1、タイプ 2]git stash -u
- すべての変更を削除します [タイプ 1、タイプ 2、タイプ 3]
結論:
どちらでも使えるのは明らかだ
(1) combination of `git clean -f` and `git reset --hard`
または
(2) `git stash -u`
望ましい結果を達成するために。
注: スタッシングとは、「(何かを)指定された場所に安全かつ秘密裏に保管する」という意味です。これは、 を使用していつでも取得できますgit stash pop
。したがって、上記の 2 つのオプションのどちらを選択するかは開発者の判断に委ねられます。
ChristophとFrederik Schøningに感謝します。
編集: 03/27
「注意」のメモを貼っておく価値があると思ったgit clean -f
git clean -f
後戻りはできません。-n
または を使用して--dry-run
、与えるダメージをプレビューします。
ディレクトリも削除したい場合は、git clean -f -d
無視されたファイルだけを削除したい場合は、git clean -f -X
無視されたファイルと無視されていないファイルの両方を削除する場合は、以下を実行します。git clean -f -x
参照: 詳細git clean
:現在の Git 作業ツリーからローカル (追跡されていない) ファイルを削除するにはどうすればよいですか?
編集: 2015年5月20日
このブランチのすべてのローカルコミットを破棄しています[ローカルコミットを削除しています]
このブランチ上のすべてのローカルコミットを破棄し、ローカルブランチをこのブランチの「上流」と同一にするには、単に次のコマンドを実行します。git reset --hard @{u}
参照:http://sethrobertson.github.io/GitFixUm/fixup.html
またはgit reset --hard origin/master
[ローカルブランチの場合master
]
注: 2015 年 6 月 12 日これは、重複としてマークされている他の SO の質問の重複ではありません。この質問は、ローカル GIT の変更を削除する方法 (追加されたファイルの削除、既存のファイルに追加された変更の削除など、さまざまなアプローチ) について説明しています。他の SO スレッドでは、ローカル コミットを削除する方法についてのみ説明しています。ファイルを追加し、そのファイルだけを削除したい場合は、他の SO スレッドではそのことについて説明されていません。したがって、これは他の質問の重複ではありません。
編集: 2015/06/23
すでにリモートリポジトリにプッシュされたコミットを元に戻すにはどうすればいいですか?
$ git revert ab12cd15
編集: 2015/09/01
ローカルブランチとリモートブランチから以前のコミットを削除する
ケース: ローカル ブランチに変更をコミットし、すぐにリモート ブランチにプッシュしたところ、突然、「ああ、この変更は必要ない」と気づきました。では、どうすればいいでしょうか?
git reset --hard HEAD~1
[ローカルブランチからそのコミットを削除する場合]
git push origin HEAD --force
[両方のコマンドを実行する必要があります。リモートブランチから削除する場合]
ブランチは何ですか? 現在チェックアウトされているブランチです。
編集 09/08/2015 - ローカル gitマージを削除:
私はmaster
ブランチにいて、master
新しく作業中のブランチとマージしたブランチですphase2
$ git status
# On branch master
$ git merge phase2
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.
Q: このマージを解除するにはどうすればいいですか? 試しましたgit reset --hard
が、git clean -d -f
どちらも機能しませんでした。
機能したのは以下のものだけです。
$ git reset --hard origin/master
または
$ git reset --hard HEAD~8
または
$ git reset --hard 9a88396f51e2a068bb7
[sha コミット コード - これは、すべてのマージ コミットが発生する前に存在していたものです]
ベストアンサー1
何を元に戻したいかによってすべてが変わります。まずは以下を読んでください。宇部のリンクの投稿しかし、答えを試みるには:
ハードリセット
git reset --hard [HEAD]
追跡されたファイルへのステージングされた変更とステージングされていない変更をすべて完全に削除します。
私は、「リモートから完全に再クローンした場合のように、すべてを元に戻したい」というときに、ハードリセットを頻繁に使用しています。リポジトリを元の状態に戻したいだけの場合は、これが機能します。
クリーン
git clean [-f]
追跡されていないファイルを削除します。
一時ファイルを削除しますが、既に追跡されているファイルへのステージングされた変更とステージングされていない変更は保持します。ほとんどの場合、繰り返しクリーンアップする代わりに、無視ルールを作成することになるでしょう。たとえば、C# プロジェクトの bin/obj フォルダーの場合、通常はスペースを節約するためにリポジトリから除外するなどです。
-f (強制) オプションは、追跡されていないファイルや、無視ルールによって git によって無視されているファイルも削除します。上記のケースでは、bin/obj フォルダーを追跡しない無視ルールでは、これらのフォルダーは git によって無視されていますが、強制オプションを使用すると、ファイル システムから削除されます。これは、たとえば、デプロイメントのスクリプトを作成するときに、デプロイ、圧縮、またはその他の操作の前にコードをクリーンアップしたい場合などに、散発的に使用されています。
Git clean は、すでに追跡されているファイルには触れません。
チェックアウト「ドット」
git checkout .
実は、あなたの投稿を読むまで、この表記法を見たことがありませんでした。これに関するドキュメントを見つけるのに苦労していますが (誰か助けてくれるかもしれません)、少し調べてみたところ、次の意味のようです。
「作業ツリー内のすべての変更を元に戻す」。
つまり、追跡されたファイル内のステージングされていない変更を元に戻します。ステージングされた変更には影響せず、追跡されていないファイルはそのまま残されるようです。
スタッシング
いくつかの回答ではスタッシングについて言及しています。文言が示すように、何かの途中で (コミットする準備ができていない状態で)、一時的にブランチを切り替えるか、コードの別の状態で何らかの方法で作業し、後で「散らかったデスク」に戻る必要がある場合にスタッシングを使用する可能性があります。これはあなたの質問には当てはまりませんが、間違いなく便利です。
総括する
一般的に、重要な変更をコミットしてリモートにプッシュしたと確信している場合、または単に遊んでいるだけの場合など、git reset --hard HEAD
に続いて を使用するgit clean -f
と、ブランチからクローンしてチェックアウトしたばかりの状態にコードが確実にクリーンアップされます。リセットすると、ステージングされているがコミットされていない変更も削除されることを強調しておくことが非常に重要です。コミットされていないものはすべて消去されます(追跡されていないファイルは除きます。追跡されていないファイルの場合はcleanを使用します)。
他のすべてのコマンドは、細かい「元に戻す」処理が必要な、より複雑なシナリオを容易にするためにあります :)
質問 1 はカバーされていると思いますが、最後に質問 2 について結論を述べます。使用する必要性を感じなかった理由は、git reset --hard
何もステージングしたことがなかったからです。変更をステージングしていたら、それを元に戻すことも、元に戻すことgit checkout .
もgit clean -f
できなかったでしょう。
これでカバーできれば幸いです。