Введение в фиксацию изменений
После создания Git-репозитория и получения рабочей копии файлов вашего проекта наступает время вносить изменения и сохранять их в виде «снимков» (коммитов). Каждый коммит фиксирует состояние проекта, которое вы хотите сохранить. В этой статье мы разберём, как отслеживать файлы, индексировать изменения, создавать коммиты, игнорировать ненужные файлы и управлять структурой репозитория.
Состояния файлов в Git
Файлы в вашем рабочем каталоге могут быть либо отслеживаемыми (находятся под контролем Git), либо неотслеживаемыми (Git о них не знает). Отслеживаемые файлы — это те, что были в последнем коммите; они могут быть неизменёнными, изменёнными или проиндексированными для следующего коммита. Неотслеживаемые файлы — это всё остальное, например, новые файлы, не добавленные в Git. Когда вы клонируете репозиторий, все файлы изначально отслеживаемые и неизменённые. После редактирования файлов Git помечает их как изменённые, и вы можете индексировать и фиксировать эти изменения.
Проверка состояния файлов
Чтобы узнать, какие файлы в каком состоянии находятся, используйте команду git status. После клонирования репозитория вы можете увидеть что-то вроде:
git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean Это означает, что рабочий каталог чист, и нет изменённых или неотслеживаемых файлов. Git также показывает текущую ветку (обычно master или main, в зависимости от платформы). Если добавить новый файл, например, README, выполнив:
echo 'My Project' > README
git status Вы увидите:
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add ..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track) Файл README отображается как неотслеживаемый, так как он новый и не добавлен в Git.
Добавление новых файлов под контроль версий
Чтобы начать отслеживать новый файл, используйте команду git add. Например:
git add README После этого git status покажет, что файл проиндексирован:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged ..." to unstage)
new file: README Файл теперь находится в индексе и готов к коммиту. Команда git add универсальна: она добавляет новые файлы, индексирует изменения в отслеживаемых файлах и решает конфликты слияния.
Индексация изменённых файлов
Если вы изменили отслеживаемый файл, например, CONTRIBUTING.md, git status покажет:
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: README
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: CONTRIBUTING.md Чтобы проиндексировать изменения, выполните:
git add CONTRIBUTING.md Теперь оба файла (README и CONTRIBUTING.md) проиндексированы и готовы к коммиту. Если вы снова измените CONTRIBUTING.md после индексации, git status покажет его одновременно в проиндексированном и непроиндексированном состоянии:
vim CONTRIBUTING.md
git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: README
modified: CONTRIBUTING.md
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: CONTRIBUTING.md Чтобы включить последние изменения, снова выполните git add CONTRIBUTING.md.
Сокращённый вывод статуса
Для более компактного отображения используйте git status -s или git status --short:
git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt Здесь ?? обозначает неотслеживаемые файлы, A — новые добавленные, M — изменённые. Два столбца показывают статус: левый — индексированные изменения, правый — изменения в рабочем каталоге.
Игнорирование файлов
Чтобы исключить файлы из отслеживания (например, логи или временные файлы), создайте файл .gitignore. Пример:
*.[oa]
*~ Это игнорирует файлы с расширениями .o, .a и временные файлы с ~. Более сложный пример:
# Игнорировать файлы .a
*.a
# Но отслеживать lib.a
!lib.a
# Игнорировать TODO в корне
/TODO
# Игнорировать каталог build/
build/
# Игнорировать .txt в doc/
doc/*.txt
# Игнорировать все .txt в подкаталогах doc/
doc/**/*.txt Правила .gitignore поддерживают шаблоны, такие как * (любой символ), ? (один символ), [0-9] (диапазон символов) и ** (вложенные каталоги).
Просмотр изменений
Для детального просмотра изменений используйте git diff. Без аргументов она показывает непроиндексированные изменения:
git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if you patch is
+longer than a dozen lines. Для проиндексированных изменений используйте git diff --staged или git diff --cached:
git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project Фиксация изменений
Когда индекс готов, фиксируйте изменения с помощью git commit:
git commit Это откроет текстовый редактор для ввода сообщения коммита. Альтернативно, укажите сообщение через -m:
git commit -m "Добавлены новые тесты производительности" Для автоматической индексации всех отслеживаемых файлов используйте git commit -a:
git commit -a -m "Добавлены новые тесты" Но будьте осторожны: -a может включить нежелательные изменения.
Удаление файлов
Чтобы удалить файл из Git и рабочего каталога, используйте git rm:
git rm PROJECTS.md Для удаления только из индекса, сохранив файл на диске, используйте --cached:
git rm --cached README Перемещение файлов
Для переименования файла используйте git mv:
git mv README.md README Это эквивалентно ручному переименованию, удалению старого файла (git rm) и добавлению нового (git add). Git автоматически распознаёт переименование.
Отзывы