web-dev-qa-db-ja.com

Git:削除されたすべてのファイルをどのようにチェックアウトしますか?

Gitでは、git checkout -- [<paths>...]構文を使用して削除された個々のファイルをチェックアウトする方法に精通しています(これは、git statusを実行するときに推奨されます。

すべてのファイルを取得するには、リストを作成し、上記のコマンドの引数としてリストを指定します。

ただし、削除されたすべてのファイルが必要な場合(つまり、cwd内のrm -rfで、すべてのファイルを復元したい場合)、そのリストの生成はエレガントではありません。

削除されたすべてのファイルをどのようにチェックアウトしますか?

13

リストの生成はthat hardではありません:

git diff --no-renames --name-only --diff-filter=D

git checkoutに適したものにするには、-zxargs -0を使用します。

git diff --no-renames --name-only --diff-filter=D -z |
    xargs -0 git checkout --

git checkout -f -- .の使用は、上記とはまったく異なることに注意してください。git checkout -f -- .は、変更されているがまだインデックスに追加されていないファイルを上書きしますが、上記はのみ抽出します。インデックス、まだインデックスであるが、ワークツリーに存在しないファイル。

(そのような変更されたファイルがない場合、git checkout -f -- .は機能しますが、git checkout -- .も機能します。)

12
torek

削除されたすべてのファイルが必要な場合(つまり、cwdにrm -rfがあり、すべてのファイルを復元したい場合)

あなたが欲しい

git checkout-index -a
3
jthill

私は通常します

1. $ git checkout .

変更をチェックアウトしてから

2. $ git clean -fd

これにより、追跡されていないファイルが削除されます。ファイルの場合はf、ディレクトリの場合はd

2番目のステップの前にドライランを実行することもできます

git clean -fdn

これにより、削除するファイルとディレクトリが一覧表示されます。

詳細については、 変更の取り消し を参照してください。

2
Gayan

ファイル削除の変更がコミットされていない場合は、git checkout -- .を使用できます。

削除ファイルの変更がコミットされている場合は、git reset --hard HEAD~を使用できます。

1
Marina Liu

コマンドgit checkout --forceがうまくいくようです。 --forceオプションのマニュアルページには、「[-forceオプション]はローカルの変更を破棄するために使用されます」と記載されています。

git-checkoutのマニュアルページから:

   -f, --force
       When switching branches, proceed even if the index or the
       working tree differs from HEAD. This is used to throw away 
       local changes.

       When checking out paths from the index, do not fail upon 
       unmerged entries; instead, unmerged entries are ignored.
0

私はそれを行うことができました:

for f in $(git diff --no-renames --name-only --diff-filter=D);do git checkout -- $f ;done
0
dafnahaktana