Git перечисляет тот же файл, измененный и не поставленный для фиксации?
По какой-то причине 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
Dir1
, Dir2
и filename.cpp
- это, безусловно, все тот же файл. Мне пришлось добавить filename.cpp
назад, чтобы он отображался как изменение, которое должно быть зафиксировано (после того, как оно было первоначально в репозитории). О единственном, что могло вызвать проблему, было то, что я спрятал, pull --rebase
, а затем вытащил stash
? .gitignore
не перечисляет Dir1
, Dir2
или filename.cpp
в любом месте, и шаблоны не предполагают, что они поймают этот файл?
Ответы
Ответ 1
Это означает, что вы внесли изменения в filename.cpp
, добавили это изменение (с помощью git add
), а затем внесли еще одно изменение, которое еще не было добавлено.
Часть "изменения, которые необходимо совершить" означает, что Git обновил свой индекс с изменением. Когда вы запустите git commit
, изменения в индексе будут использованы для создания нового объекта фиксации.
В разделе "Изменения не поставлены" показана разница между индексом и вашей рабочей копией.
Вы можете воспроизвести то, что вы видите так:
- Изменить имя_файла .cpp
- Запустите
git status
. Вы увидите, что "изменения не поставлены".
- Запустить
git add filename.cpp
- Запустите
git status
. Вы увидите, что "изменения будут совершены".
- Изменить файл filename.cpp снова
- Запустите
git status
. Вы увидите как "изменения не поставлены", так и "изменения, которые необходимо совершить".
Это имеет смысл? Это всегда немного сложно объяснить, как работает Git.
Ответ 2
В CVS, SVN, BZR и, без сомнения, еще десяток других инструментов, после добавления файла, что означает, что он будет включен в следующий коммит.
Не так GIT.
В git вы не добавляете файл, вы "добавляете изменение" (иногда это называется "сценическое изменение" ).
Если вы дважды меняете файл, вам нужно дважды добавить его.
Ответ 3
Если вы измените файл, добавьте его и переконфигурируйте файл, вы получите это поведение. Когда вы делаете 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.
Ответ 4
Вот как я в итоге получил файл в обоих Changes to be committed:
Changes not staged for commit:
и Changes not staged for commit:
Я сделал git add
который ответил с warning: LF will be replaced by CRLF in Projects/AFE/MultiprocessWindTurbines/model_to_detections.py. The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in Projects/AFE/MultiprocessWindTurbines/model_to_detections.py. The file will have its original line endings in your working directory
.
Тогда я сделал git status
.
Похоже, git
изменил файл и поместил этот измененный файл в индекс. Тем не менее, он оставил оригинальный файл в рабочей области.