Когда я нахожусь в командной строке git, довольно сложно выборочно фиксировать некоторые файлы и сохранять остальные для другого коммита. Как мне сделать это легко?
По иронии судьбы, это одна из вещей, которую git делает очень простой, но вы должны изучить концепцию, которой просто нет у других систем контроля версий. Эта идея - «промежуточная область» (технически известная как «индекс»), которая по существу отслеживает контент, который будет в вашем следующем коммите. Когда вы говорите git add somefile
, что не означает «начать отслеживание файла с этим именем», это означает «подготовить содержимое файла, как оно есть сейчас». Вы можете сделать это только для файлов, которые вы выбираете в своем рабочем дереве - тогда простой git commit
просто превращает содержимое промежуточной области в ваш следующий коммит.
Использование параметра -a
для git commit
в основном говорит: «Мне нет дела до этой области подготовки / индексации, просто ставьте все, что отслеживается, перед фиксацией». Так что, пока вы не будете довольны идеей размещения отдельных файлов, я просто буду делать "git commit".
Стоит часто запускать git status
, когда вы добавляете файлы, чтобы привыкнуть к этой идее - она показывает файлы в трех разделах, хотя не все будут присутствовать, если в этом разделе нечего сообщать:
Изменения, которые необходимо совершить:
В этом списке перечислены изменения, которые были поставлены, так что будет в следующем коммите. Сюда входят новые файлы, файлы, удаление которых было подготовлено, и любые файлы с поэтапными изменениями.
Изменено, но не обновлено:
В этом списке перечислены файлы с изменениями, которые еще не были подготовлены.
неотслеживаемые файлы:
Это файлы, о которых git ничего не знает - обычно вам нужно либо игнорировать их, добавляя шаблоны в ваш файл .gitignore
, либо добавлять их с помощью git add
.
Обратите внимание, что файлы могут появляться в обоих первых двух разделах. Например, вы можете изменить Makefile
, а затем добавить его в индекс с помощью git add Makefile
. Затем, если вы продолжите вносить дополнительные изменения в Makefile
, сохраните его, а затем запустите git status
, вы увидите, что он указан как в «Изменениях, которые должны быть зафиксированы», так и «Изменено, но не обновлено» - потому что ( как упомянуто выше) git add Makefile
просто устанавливает точное содержимое файла при запуске команды. Если вы снова запустите git add Makefile
, сценическая версия будет перезаписана версией в вашем рабочем дереве, так что все изменения, которые вы внесли в нее, будут поэтапными.
Может быть стоит добавить еще пару советов о полезной паре команд git diff
и git diff --cached
- по сути, их значения:
git diff
: «Какие изменения я еще не ставил?»
git diff --cached
: «Какие изменения я уже поставил?»
Как вы, вероятно, сможете понять из вышесказанного, это потому, что git diff
показывает разницу между областью подготовки и вашим рабочим деревом, а git diff --cached
показывает разницу между вашим последним коммитом и областью подготовки.