Подтвердить что ты не робот

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 в любом месте, и шаблоны не предполагают, что они поймают этот файл?

4b9b3361

Ответ 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 изменил файл и поместил этот измененный файл в индекс. Тем не менее, он оставил оригинальный файл в рабочей области.