更新²
git restore
: Git 2.23 (2019年8月)では、これを実行する新しいコマンドがあります。受け入れられた回答。
更新: Git 1.8.3以降ではより直感的に動作します。私の答え。
次のようなユースケースを想像してください。Git 作業ツリーの特定のサブディレクトリ内のすべての変更を削除し、他のすべてのサブディレクトリはそのままにしたいとします。
できます
git checkout .
が、git checkout . スパースチェックアウトで除外されたディレクトリを追加しますはあります
git reset --hard
が、サブディレクトリに対しては実行できません。> git reset --hard . fatal: Cannot do hard reset with paths.
を使用して現在の状態をリバースパッチすることはできます
git diff subdir | patch -p1 -R
が、これはかなり奇妙な方法です。
この操作に適した Git コマンドは何ですか?
以下のスクリプトは、この問題を示しています。コメントの下に適切なコマンドを挿入します。現在のコマンドは、スパース チェックアウトによって除外されるはずのHow to make files
ファイルを復元します。とを明示的に復元したいわけではなく、以下のすべてを「知っていて」復元したいだけであることに注意してください。編集: また、 、または と同じレベルに存在する他のディレクトリも「知りません」。a/c/ac
a/a
a/b
a
b
a
#!/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 チェックアウトで再び表示され続けるのはなぜですか?「」。