2012-10-31 8 views
5

git checkout <commit>は、作業ツリーとインデックスの両方を<commit>バージョンにフラッシュすると思います。ただし、場合によっては、作業ツリーと索引の両方に現在の変更が保持されます。たとえば、次のようにきれいなメッセージを与えることはありませんgit statusbr2のよう Git:作業ツリーとインデックスを変更したgit checkout

git branch br1 
git branch br2 
git checkout br1 
<make change M1 to file foo> 
git add foo 
<make change M2 to file foo> 
git checkout br2 

は今、分岐 br1で行われたすべての作業ツリー/インデックスの変更は、ブランチ br2に保存されています。私は br1br2の頭部はもともと同じファイルの fooを持っており、Gitはこれを自動的に検出できるからです。

質問:

  • Gitは作業ツリーとインデックスをフラッシュしないことを決定しますか?他のコーナーケースはありますか?
+1

これはコーナーケースではなく、新しいブランチをコミットすることをコミットする前に決定することが考えられます。あるブランチから別のブランチへの切り替えが、変更されたファイルを上書きしない限り、インデックスgitの問題はブランチに切り替えるだけです。 –

+0

@ X-Istenceしかし、gitはどうやって決定するのですか?問題は発生しません**。 – Cyker

答えて

5

git checkoutコマンドには、実際には2つの異なる(共通の)動作モードがあります。

  1. あなたがgit checkout <branch>を実行する場合は、ブランチ<branch>に切り替わります。作業ツリーに対するすべての変更は保持されます。これは、コミットされていない変更をターゲットブランチにマージすることで機能し、失敗する可能性があります。インデックスの変更は隠されます。

  2. git checkout <path>を実行した場合、gitはインデックスと作業コピーの両方の変更を現在のコミットから取り除きます(<path>)。

のでgit checkout <branch>の目的は、あなたが実際に作っているの変化が別のブランチに属していると判断した場合にはあります。

関連する問題