1. ホーム
  2. ギット

[解決済み] [Solved] サブディレクトリをgit reset --hardする方法は?

2022-04-02 06:19:46

質問

<ブロッククオート

UPDATE² (アップデイト : Git 2.23(2019年8月)では、新しいコマンドである git restore を参照してください。 受付回答 .

アップデイト : Git 1.8.3 からはより直感的に動作するようになりました。 私なりの答え .

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

この操作のための適切なGitコマンドは何ですか?

以下のスクリプトは、問題を説明するものです。の下に適切なコマンドを挿入してください。 How to make files のコメント -- 現在のコマンドはファイルを復元します a/c/ac スパースチェックアウトで除外されるはずのもの。なお、私は しない を明示的にリストアしたい。 a/aa/b というのも、私はquot;know"しか知らないからです。 a で、以下をすべて復元したい。 EDIT : あと、"know"もわからない。 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

解決方法は?

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 コミットします。

として 回答済み によって Ajedi32 両方のチェックアウトフォーム ターゲットリビジョンで削除されたファイルを削除しない .

作業ツリーに 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 チェックアウトで除外されたファイルが何度も現れるのはなぜですか? "。