2011-07-12 5 views
3

私は作業ディレクトリの内容全体を削除する場合は、git checkoutを使用して、それをバック復元しようと、私は私が提供するコマンドライン引数に応じて、2つの異なる動作を受け取っ:git checkoutが一貫して動作しないのはなぜですか?

git checkout master 

私はちょうどすべてのリストを受け取ります削除されたファイルやディレクトリはありませんが、は実際にはがチェックアウトされています。

しかし、私はない:

git checkout <directory 1 in master> 
git checkout <directory 2 in master> 
git checkout <directory 3 in master> 
git checkout <directory 4 in master> 
git checkout <directory 5 in master> 
git checkout <directory 6 in master> 
git checkout <directory 7 in master> 

だけにしてGitは何が不足しているか、復元するために管理しません。

なぜですか?

なぜ「チェックアウト」にの2つのの意味がありますか?

+0

http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html – KingCrunch

答えて

6

それは、しかし、あなたはそれを二つの異なるコマンド与えているしません:あなたが第二を行うと

git checkout <branch> 

または

git checkout <directory> 

を、Gitはデフォルトのブランチを前提とし(あなたの場合には、それが表示されます"master"にする)、最初に行うときには、変更前にそのブランチにコミットする必要があるローカルの変更(すべて消去したファイル)があるので、チェックアウトしません。

あなたはすべてをチェックアウト(およびローカルの変更を吹き飛ばす)にしたい場合は、あなたが行うことができますチェックアウトを強制

git checkout -f 

。これは何が不足しているか、復元する

+0

これは私が期待していた最高の答えです。この適応行動の背後にある哲学を実際に説明しています。ありがとう! – WinWin

1

迅速化の方法は、Gitのリセットを行うことであるのに役立ちます

希望は、あなたがそれを指示しない限り

Gitのチェックアウトは、あなたが作業ツリーに加えた変更は上書きされません--hard。

パスを指定すると、そのパスの作業ツリーを更新するように指示しています。

パスを指定しないと、ワーキングツリーをまったく更新せずにインデックスを指定したブランチに変更するよう指示されます。失われたファイルはすべて、作業ツリーに加えた変更がインデックス内に作成してからコミットすることを前提としています。 manual page of git-checkoutから

+0

この説明を+1してくれてありがとうございます。リマインダを自分自身に追加すると、 'cvs co 'のように、ブランチ名やパスを指定せずに 'git checkout -f'を実行すると、実際には作業ディレクトリのすべてが復元されます。 :) – WinWin

1

:作業ツリーで

アップデートファイルは、インデックスまたは指定されたツリー内のバージョンと一致します。パスが指定されない場合、git checkoutはHEADを更新して、指定されたブランチを現在のブランチとして設定します。

< paths>または--patchが指定された場合、git checkoutはブランチを切り替えません。これは、作業中のツリー内の名前付きパスをインデックスファイルから更新するか、名前が<であるtree-ish>(たいていはコミット)から更新します。 ...

関連する問題