Как фиксировать только измененные (а не новые или удаленные) файлы?
git status
показывает кучу файлов, которые были изменены, и некоторые из них были удалены. Я хочу сначала перенести измененные файлы, а затем удаленные. Я не вижу никакой опции в git add
, которая позволяет мне это делать. Как я могу это сделать?
EDIT. Как указано, git add
в любом случае не удалил бы удаленные файлы, поэтому git add .
. Но это имеет побочный эффект от включения файлов, которые не отслеживались, что я также хотел бы избежать. Я соответствующим образом изменил название вопроса.
Ответы
Ответ 1
Следующая команда должна выполнить трюк:
git commit -a
или
git commit -am "commit message"
Из Pro Git:
Предоставление опции -a для команды git commit делает git автоматически обрабатывать каждый файл, который уже отслеживается, перед выполнением commit
Ответ 2
git diff --name-only --diff-filter=M | xargs git add
(на основе Чарльз Бейли ответит на соответствующий вопрос)
Ответ 3
Вы можете использовать:
git add -u
для создания уже отслеживаемых файлов, которые были изменены с момента последнего фиксации.
Из git-add man-страница:
-u
--update
Совпадение только с уже отслеживаемыми файлами в индексе, а не с рабочим деревом. Это означает, что он никогда не будет создавать новые файлы, но будет обрабатывать измененное новое содержимое отслеживаемых файлов и что он удалит файлы из индекса, если соответствующие файлы в рабочем дереве были удалены. Если нет, по умолчанию используется значение "."; другими словами, обновить все отслеживаемые файлы в текущем каталоге и его подкаталогах.
Не уверен, когда эта функция была добавлена.
Ответ 4
Мне может быть что-то не хватает, но git add не включает удаленные файлы, вы должны использовать git rm, чтобы удалить их:
mkdir git-test
cd git-test
git init
touch a
touch b
touch c
git add .
git commit -m "Initial"
echo "a" > a
echo "b" > b
rm c
git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: a
# modified: b
# deleted: c
#
git add .
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a
# modified: b
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: c
#
git commit -m "Changed"
git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: c
#
git rm c
git commit -m "Deleted"
И git журнал показывает три фиксации.
Ответ 5
Я был бы осторожен с использованием git commit -a - если вы не удостоверились, что ваш файл .gitignore имеет ВСЕ файлы, которые вы НЕ хотите добавлять там
Я использовал git commit -a много раз в тех областях, где это было не так, и мне пришлось очищать/удалять временные файлы и т.д. из репозитория git