2012-04-26 12 views
8

"ステージング"状態にファイルを移動するときにGitが実際に格納しているものを理解したいと思います。gitステージング領域はどのようにファイルを格納しますか?

は、次のシーケンスを考えてみましょう:

新しいファイルが追加され、ローカルリポジトリにコミットされています

touch file.txt 
git add file.txt 
git commit 

私は、ファイルに変更を加える:

echo text1 > file.txt 
git add file.txt 

私はその後、ファイルを編集する前に再度編集してください。

echo text2 > file.txt 

gitのステータスは示しています。Gitはされずに FILE.TXT に新しい、2回目の更新をステージング処理することができますどのように

git commit file.txt 

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: file.txt 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: file.txt 
# 

を、私はそのファイルをコミット言った? 「状態」の出力は、最初のリビジョンをチェックインしようとしたように見えますが、未確認の変更はチェックせずに保留します。

この場合、暗黙の段階がありますか?

答えて

7

Gitは、コミット(ファイルのスナップショット)とラベル(とりわけブランチ)の2つのものと考えてください。

ではなく、git add時にGitが実際にコミットを作成します。したがって、変更されたファイルに対してgit addを実行すると、その変更でコミットが作成され、その特定のコミットに「ステージング」ラベルが割り当てられました。あなたがgit commitを実行する前にもう一度ファイルを変更し

は、それが(それは git commitはまだそれを実行しなかった)「コミット上演」、および添加していないにもコミットもされていないファイルに新しい変更になりました。それで、 git statusがあなたに両方を見せることができます。

git commitの場合、実際に現在のブランチラベルをその特定のコミットに移動しているため、コミットはもはや「ステージング」ではなく「マスター」(または、現在進行中です)。

+0

私が上記のテストを実行したときに観察した動作は、ファイル( "text2")のステージングされていない内容をレポにも提出することです。この解釈は正しいのでしょうか?私はそれがファイルの "段階"バージョン( "text1")を提出すると思います。私はこれが "git checkout file.txt"を実行することによってrepotにあることを確認しています。 –

+1

私はちょうどテストをしましたが、結果は得られませんでした。 'mkdir gittest'' cd gittest' 'git init'' echo text 1> test.txt' 'git add .'' git commit -m '初期コミット '' echo text 2> test.txt' 'git add .' 'echo text 3> test.txt'この段階では、段階的な変更(" text 2 ")とunstagedな変更(" text 3 ")があります。今、 'git checkout test.txt'と' cat test.txt'です。私は "テキスト2"を取得します。段階的な変更でローカル変更は破棄されました。 – redhotvengeance

+0

テストシーケンスと同じ結果が得られます。しかし、 'echo text 3> test.txt'ステップの後に' git commit'を実行すると(私の元の投稿と同じように)、それは暗黙のうちに "text 3"コンテンツをステージングして、レポ分かりやすくするために、私がここで行う順序は次のとおりです: 'mkdir gittest'' cd gittest' 'git init'' echo text 1> test.txt' 'git add .'' git commit -m '最初のcommit'' 'echo text 2 > test.txt '' git add .' 'echo text 3> test.txt'' git commit -m 'new'' 'git checkout test.txt'' cat test.txt'、結果として "text 3 " –

4

git commit <somefiles>は、git add <somefiles>に続いてgit commitに相当します。 git commitを実行すると、gitはすべての段階的な変更をコミットしますが、問題のファイルを最後に作成してから編集をコミットしません。

関連する問題