31

何らかの理由で、Git は、「コミットされる」ファイルと「コミットのためにステージングされない」ファイルがあると言っていますか? これは意味がありません:

% git status 
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   Dir1/Dir2/filename.cpp
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   Dir1/Dir2/filename.cpp

Dir1Dir2そしてfilename.cpp間違いなくすべて同じファイルです。コミットされる変更として表示されるようにするには、再度追加するfilename.cpp必要がありました(最初にリポジトリにあった後)。問題を引き起こした可能性のある唯一のことは、私が を隠してから?pull --rebaseをポップしたことでした。、またはどこにもリストされておらず、パターンはこのファイルをキャッチすることを示唆していませんか?stash.gitignoreDir1Dir2filename.cpp

4

3 に答える 3

37

これは、 に変更をfilename.cpp加え、その変更を ( でgit add) 追加してから、まだ追加されていない別の変更を行ったことを意味します。

「コミットされる変更」の部分は、Git がそのインデックスを変更で更新したことを意味します。を実行git commitすると、インデックスへの変更が新しいコミット オブジェクトの作成に使用されます。

「ステージングされていない変更」の部分は、インデックスと作業コピーの違いを示しています。

見ているものを次のように再現できます。

  • filename.cpp を編集
  • 実行しますgit status。「ステージングされていない変更」が表示されます。
  • 走るgit add filename.cpp
  • 実行しますgit status。「コミットする変更」が表示されます。
  • filename.cpp をもう一度編集します
  • 実行しますgit status。「ステージングされていない変更」と「コミットされる変更」の両方が表示されます。

それは理にかなっていますか?Git がどのように機能するかを説明するのは、いつも少し難しいです。

于 2012-05-20T19:00:19.800 に答える
12

CVS、SVN、BZR、そして間違いなく他の多数のツールでは、ファイルが追加されると、それは次のコミットに含まれることを意味します。

それほどGITではありません。

git では、「ファイルを追加」するのではなく、「変更を追加」します (「変更のステージング」と呼ばれることもあります)。

ファイルを 2 回変更する場合は、2 回「追加」する必要があります。

于 2012-05-25T13:32:00.850 に答える
5

ファイルを変更して追加し、ファイルを再変更すると、この動作が発生します。git add を実行すると、その時点までの変更が追加され、その後再追加せずにコミットすると、追加された変更の最初のセットのみがコミットされます。

$ git status
# On branch master
nothing to commit (working directory clean)

matthewfarwell (master)
$ vi foo.txt <-- add lines 1,2,3 here

matthewfarwell (master)
$ git add foo.txt

matthewfarwell (master)
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.txt
#

matthewfarwell (master)
$ vi foo.txt <-- add lines 4,5,6, here

matthewfarwell (master)
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.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:   foo.txt
#

したがって、今コミットすると、行 1、2、3 のみがコミットされます。

于 2012-05-20T18:56:48.343 に答える