git reset --hard サブディレクトリを実行する方法 質問する

git reset --hard サブディレクトリを実行する方法 質問する

更新²git restore : Git 2.23 (2019年8月)では、これを実行する新しいコマンドがあります。受け入れられた回答

更新: Git 1.8.3以降ではより直感的に動作します。私の答え

次のようなユースケースを想像してください。Git 作業ツリーの特定のサブディレクトリ内のすべての変更を削除し、他のすべてのサブディレクトリはそのままにしたいとします。

この操作に適した Git コマンドは何ですか?

以下のスクリプトは、この問題を示しています。コメントの下に適切なコマンドを挿入します。現在のコマンドは、スパース チェックアウトによって除外されるはずのHow to make filesファイルを復元します。とを明示的に復元したいわけではなく、以下のすべてを「知っていて」復元したいだけであることに注意してください。編集: また、 、または と同じレベルに存在する他のディレクトリも「知りません」。a/c/aca/aa/baba

#!/bin/sh

rm -rf repo; git init repo; cd repo
for f in a b; do
  for g in a b c; do
    mkdir -p $f/$g
    touch $f/$g/$f$g
    git add $f/$g
    git commit -m "added $f/$g"
  done
done
git config core.sparsecheckout true
echo a/a > .git/info/sparse-checkout
echo a/b >> .git/info/sparse-checkout
echo b/a >> .git/info/sparse-checkout
git read-tree -m -u HEAD
echo "After read-tree:"
find * -type f

rm a/a/aa
rm a/b/ab
echo >> b/a/ba
echo "After modifying:"
find * -type f
git status

# How to make files a/* reappear without changing b and without recreating a/c?
git checkout -- a

echo "After checkout:"
git status
find * -type f

ベストアンサー1

Git 2.23(2019年8月)では、新しいコマンドgit restore(またここで紹介

git restore --source=HEAD --staged --worktree -- aDirectory
# or, shorter
git restore -s@ -SW -- aDirectory

これにより、特定のパスに対して、インデックスと作業ツリーの両方がHEADコンテンツに置き換えられます。reset --hard


元の回答 (2013)

注記(コメントしたによるダン・ファブリッチ) それ:

  • git checkout -- <path>ハードリセットは実行されません。作業ツリーの内容をステージングされた内容に置き換えます。
  • git checkout HEAD -- <path>パスのハードリセットを実行し、インデックスと作業ツリーの両方をコミットのバージョンに置き換えますHEAD

として答えたによるアジェディ32両方のチェックアウト フォームでは、ターゲット リビジョンで削除されたファイルは削除されません
作業ツリーに HEAD に存在しない余分なファイルがある場合、git checkout HEAD -- <path>それらは削除されません。

注:git checkout --overlay HEAD -- <path>(Git 2.22、2019年第1四半期)、インデックスと作業ツリーに表示されるが、 には表示されないファイルは<tree-ish>、完全に一致するように削除されます<tree-ish>

しかし、そのチェックアウトは、git update-index --skip-worktree(無視したいディレクトリに対して)を尊重することができます。除外されたファイルが git sparse チェックアウトで再び表示され続けるのはなぜですか?「」。

おすすめ記事