1. ホーム
  2. git

[解決済み] ローカルのGitの変更を削除するさまざまな方法

2022-03-15 03:23:11

質問

gitリポジトリをクローンして、ブランチをチェックアウトしたところです。私はそのブランチで作業した後、オリジナルのコピーが欲しかったので、ローカルでの変更をすべて削除することにしました。

要するに、ローカルの変更を削除するために、以下の2つのコマンドを実行する必要がありました。

git checkout .

git clean -f

質問です。

(1)ローカルチェンジを解消する上で、この方法は正しいのでしょうか、他に正しい方法を教えてください。

(2)どのような場合に git reset --hard このコマンドを使わなくても、リセットできるようになりました。

ありがとうございます。

*Solution : Major Edit(s): 03/26 : * 曖昧な用語の多くをgit特有の用語に置き換えた。 [tracked/untracked/staged/unstaged] です。

ローカルに変更を加える場合、3つのカテゴリーしかない可能性があります。

タイプ1.ステージングされた追跡ファイル

タイプ2. アンステージトラックファイル

タイプ3. ステージングされていないUnTrackedファイル、別名UnTrackedファイル

  • ステージングされたもの - ステージング・エリアに移動したもの/インデックスに追加されたもの
  • 追跡 - 修正されたファイル
  • UnTracked - 新しいファイル。常にステージングされていない。ステージングされている場合は、追跡されていることを意味します。

各コマンドが行うこと。

  1. git checkout . - ステージングされていないTrackedファイルのみを削除する[タイプ2]。

  2. git clean -f - ステージングされていないUntrackedファイルのみを削除する[タイプ3]。

  3. git reset --hard - ステージングされたトラッキングファイルおよびステージングされていないトラッキングファイルONLY[タイプ1、タイプ2]を削除します。

  4. git stash -u - すべての変更点[タイプ1、タイプ2、タイプ3]を削除します。

結論

のどちらかを使用できることは明らかです。

(1) combination of `git clean -f` and `git reset --hard` 

または

(2) `git stash -u`

を使用すると、目的の結果を得ることができます。

注)Stashingとは、言葉の通り「(何かを)安全に、こっそりと指定された場所に保管する」という意味です。これはいつでも、次のようにして取り出すことができます。 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 の現在の作業ツリーからローカルの(追跡されていない)ファイルを削除するには?

編集:05/20/15

このブランチのすべてのローカルコミットを破棄 [ローカルコミットを削除する]をクリックします。

このブランチのすべてのローカルコミットを破棄して、ローカルブランチを同一にするには をこのブランチの"upstream" と共に実行するだけです。 git reset --hard @{u}

参考にしてください。 http://sethrobertson.github.io/GitFixUm/fixup.html

または git reset --hard origin/master [ローカルブランチが master ]

備考:2015/12/06 これは ではない は、他のSOの質問と重複しており、重複とマークされています。この質問では、GIT のローカルな変更を削除する方法 [追加されたファイルを削除する、既存のファイルに追加された変更を削除するなど、さまざまなアプローチ] を扱っていますが、他の SO のスレッドではローカルコミットを削除する方法のみを扱っています。もし、あなたがファイルを追加し、それだけを削除したい場合、他のSOスレッドではそれについて議論されていません。したがって、これはもう一つのスレッドと重複していません]。

編集:2015/06/23

リモートリポジトリに既にプッシュされたコミットを元に戻すには?

$ git revert ab12cd15

編集:2015年01月09日

ローカルブランチとリモートブランチから以前のコミットを削除する

ケース: ローカルブランチに変更をコミットし、すぐにリモートブランチにプッシュした場合。 突然、ああ、この変更は必要ないことに気づきました。さて、どうしましょうか?

git reset --hard HEAD~1 [ローカルブランチからそのコミットを削除するため] です。

git push origin HEAD --force [両方のコマンドを実行する必要があります。 リモートブランチから削除する場合]。

ブランチとは何ですか?現在チェックアウトされているブランチです。

2015/08/09編集 - ローカルの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 --hardgit clean -d -f どちらもうまくいきませんでした。

というのは、唯一 動作 は、以下のいずれかになります。

$ git reset --hard origin/master

または

$ git reset --hard HEAD~8

または

$ git reset --hard 9a88396f51e2a068bb7 [sha コミットコード - これはすべてのマージコミットが発生する前に存在していたものです] 。

解決方法は?

何を元に戻すか、何を元に戻すかによって異なります。まずは 宇部さんのリンク先の記事 . しかし、答えを試みるには

ハードリセット

git reset --hard [HEAD]

トラックされたファイルに対するすべてのステージングおよびアンステージされた変更を完全に削除します。

ハードリセットは、リモートから完全に再クローンしたときのように、すべてを取り消したいときによく使用します。あなたの場合、レポを無傷にしたいのであれば、これは有効でしょう。

クリーン

git clean [-f]

追跡されないファイルを削除します。

一時ファイルを削除するが、すでに追跡されているファイルへのステージングされた変更と未ステージ化の変更は維持する場合。例えば、C#プロジェクトのbin/objフォルダは、スペースを節約するために通常レポから除外したいとか、そういうことです。

また、-f (force)オプションは、追跡されていないファイル は、無視ルールにもかかわらず git に無視されています。上の例では、bin/obj フォルダを無視するルールを設定した場合、これらのフォルダは git に無視されていますが、force オプションを使用するとファイルシステムからそれらを削除することができます。例えば、デプロイをスクリプトで行う際に、デプロイやzip圧縮などの前にコードをきれいにしたい場合などに、この使い方を散見することがあります。

Git clean は、すでに追跡されているファイルには手をつけません。

チェックアウト "dot"。

git checkout .

実はこの記法、あなたの投稿を読むまで見たことがなかったんです。これに関するドキュメントを見つけるのに苦労しているのですが(たぶん誰かが助けてくれるでしょう)、少し遊んでみたところ、どうやら意味はあるようです。

作業ツリー内のすべての変更を取り消します"。

つまり、トラックされたファイル内のステージされていない変更を元に戻すことです。どうやらステージングされた変更には触れず、未追跡のファイルだけを残すようです。

保管

いくつかの回答では、スタッシングについて触れています。この文言が示すように、おそらくスタッシングを使うのは、何かの途中(コミットの準備ができていない)で、一時的にブランチを切り替えたり、別の状態のコードで作業をして、後で" messy desk"に戻らなければならない時でしょう。これはあなたの質問には当てはまりませんが、間違いなく便利です。

まとめると

一般に、重要な変更をコミットしてリモートにプッシュした自信がある場合は、単に遊んでいるだけの場合などは git reset --hard HEAD に続いて git clean -f を実行すると、ブランチからクローンしてチェックアウトしたときの状態まで、コードを完全にクリーンアップすることができます。強調しておきたいのは、このリセットはステージされた、しかしコミットされていない変更も削除してしまうということです。 コミットされていないものはすべて消去されます。 (未追跡のファイルを除く、その場合は クリーン ).

他のコマンドは、より複雑なシナリオを容易にするために用意されており、quot;undoing stuff"の粒度が必要です :)

1の質問はカバーされているように感じますが、最後に2について結論から言うと、あなたが git reset --hard は、あなたが何もステージングしていなかったからです。変更の演出をしたことがあれば git checkout .git clean -f はそれを元に戻したのでしょう。

これでカバーできるといいのですが。