Git для начинающих: основы рабочего процесса и базовые команды
Статья "Git для начинающих" направлена на усовершенствование навыка его использования и исправление распространенных ошибок.
Рассмотрим различные ситуации из жизни разработчика (и не только). К каждой будет прилагаться правильное оптимальное решение.
Git для начинающих: основные команды
Git init
Чтобы создать в текущей директории поддиректорию .git
, где будут храниться все файлы репозитория, выполните git init
. Если поддиректория уже существует, при повторной аналогичной команде будет выведено сообщение Reinitialized existing Git repository in
.
Git add
Вам необходимо добавить в проект файлы с определенным расширением. Можно добавить все файлы по одному, но лучше использовать *.< имя_расширения>
, чтобы включить все файлы с этим расширением:
git add *.py
Если вы хотите добавить файлы с определенным расширением и следом указать имя каталога, то можно выполнить следующую команду. Она добавит все .py файлы из подкаталогов models/directory:
git add models/\*.py
Git clean
Допустим, вы создали несколько новых файлов или папок в ветке Git, а через время оказалось, что эти файлы больше не нужны. В этом случае нужно очистить свое рабочее дерево от лишних файлов (которые были добавлены с помощью git add) следующей командой:
git clean -df
Чтобы увидеть, какие untracked-файлы будут удалены, используйте команду:
git clean -dn
Git rm
Следующая команда в подборке "Git для начинающих" поможет удалить отслеживаемые файлы:
git rm <путь к файлу>
Если удаляемый файл находится в staging-области, нужно применить специальный флаг:
git rm <путь к файлу> -f
На случай если вы хотите удалить файлы из репозитория, а в своей ФС оставить, выполните эту команду:
git rm --cached <путь к файлу>
Git branch
Вы сделали опечатку в имени ветки или хотите изменить ее имя? Следующая команда вам в помощь:
git branch -m <старое имя ветки> <новое имя ветки>
Если нужно изменить имя текущей ветки:
git branch -m <новое имя ветки>
Для изменения имени запушиной ветки потребуется выполнить несколько дополнительных шагов:
git push <имя удаленной ветки> --delete <старое имя ветки> git push <имя удаленной ветки> <новое имя ветки>
Если имя локальной ветки не совпадает с именем ветки в репозитории, используйте команду:
git push <имя удаленной ветки> <локальное имя ветки>:<имя удаленной ветки>
Git log
Чтобы увидеть историю Git коммит, применяйте команду git log. Вам будет показано много информации, но среди этого вам нужен только commit id и сообщение. Для изменения вывода выполните такую команду:
git log --oneline
Она покажет вывод, как на картинке ниже.
Первые семь символов – это сокращенный commit id, а после него идет сообщение. Commit id представлен в сокращенном виде, т. к. "полная версия" состоит из сорока шестнадцатеричных символов, указывающих на 160-разрядный SHA1 хэш.
Head -> master – означает, что мы в ветке master.
Если вы хотите увидеть сообщение конкретного автора, можно выполнить это:
git log --author="John Doe"
Git stash
Допустим, вы решили проверить код ветки перед внесением изменений. Для этого есть команда stash, которая будет держать рабочее дерево в "чистоте":
git stash
Для отмены изменений делайте так:
git stash pop
А если передумали, делайте откат:
git stash drop
Git checkout
Чтобы переключиться на другую ветку, выполните команду:
git checkout <имя ветки>
Не забывайте сохранять изменения или делать Git коммит в текущей ветке. Если этого не сделать, изменения могут отразиться на других ветках, а вам это не нужно.
Например, есть ветка development, и вы хотите сделать ее копию, чтобы переключаться в нее напрямую. Это можно сделать так:
(development)$ git checkout -b <новое имя ветки>
Git commit
Вы закоммитили изменения, позже поняли, что допустили ошибку, или просто необходимо сделать описание более понятным. Тогда эта команда – то, что нужно:
git commit --amend -m "сообщение"
Если вы добавили новые файлы или исправили ошибку, но не хотите добавлять еще одно commit-сообщение, используйте команду с флагом --no-edit:
git commit --amend --no-edit
Вы запушили свой код в удаленный репозиторий, а затем поняли, что нужно изменить commit-сообщение. Для этого после внесения изменений сделайте принудительный push. Используя имя удаленного репозитория в качестве источника, выполните:
git push origin <имя ветки> -f
Git reset
Если вам нужно отменить последний коммит, используйте git reset. Существуют три полезных флага сброса:
- soft
- mixed
- hard
Предположим, вы хотите отменить изменения, до момента добавления файла two.txt, имеющего commit id 96b037c.
Теперь давайте выполним команду git reset с флагом --soft:
git reset --soft 96b037c
git reset --soft "потеряет" все коммиты после этого идентификатора (например, 96b037c), но файлы не будут удалены, они будут находиться в промежуточной области.
Потерянные коммиты не имеют прямой ссылки для доступа к ним. Такие коммиты обычно можно найти и восстановить с помощью git reflog. Git навсегда удалит "потеряшки", когда запустится сборщик мусора (запуск производится каждые 30 дней).
При запуске git status вы увидите:
Если вы запустите git log --oneline, то увидите, что предыдущие коммиты были удалены:
Если выполнить команду reset с флагом --mixed, коммиты станут "потерянными", файлы не будут находиться в промежуточной области, но их можно будет найти в ФС. Если вы вообще не укажете флаг в команде reset, флаг --mixed будет использоваться по умолчанию.
При запуске git status увидим следующее:
Если необходимо окончательно удалить файлы, запустите команду reset с флагом --hard.
Рекомендуется сначала выполнить reset --soft, чтобы проверить затрагиваемые файлы. Если все хорошо, запускайте reset --hard.
Никогда не используйте git reset <commit-id> после того, как все запушено в общедоступный репозиторий. Удаление коммита, с которым продолжают работать другие члены команды, создает серьезные проблемы.
Git revert
Еще один способ отменить Git коммит:
git revert <commit-id> --no-commit
Проверить затронутые файлы с помощью git status. Затем git commit -m "commit-message".
Revert отменяет не коммит, а изменения возвращенного commit-id.
Например, необходимо отменить последний коммит. После revert-а статус будет выглядеть так:
Перед последним коммитом файл six.txt не был добавлен, поэтому он удален, а five.txt возвращается в предыдущее состояние. Теперь история будет выглядеть так:
Если вы хотите отменить несколько коммитов в пределах диапазона, выполните следующую команду:
git revert <старый commit-id>..<недавний commit-id> --no-commit
Если нужно отменить несколько коммитов, вне диапазона, следует указывать каждый commit-id:
git revert <commit-id-1> <commit-id-2> --no-commit
Git cherry-pick
И последняя команда из рубрики Git для начинающих – cherry-pick. Чтобы сделать коммит (например, исправление ошибки) в ветке "А", работая в ветке "Б", используйте команду cherry-pick.
Сначала необходимо переключиться на ветку с коммитом, скопировать commit-id, а потом перейти обратно в свою ветку. Затем выполните следующую команду, чтобы получить коммит в рабочей ветке:
git cherry-pick <commit-id>
Git fetch
Команда для случаев, когда необходимо собрать все существующие коммиты из нужной ветки (удаленный репозиторий) и сохранить их в local repository. После выполнения git fetch
вы получаете ссылки на ветки удаленного проекта. Суть и главное преимущество команды в том, что с ее помощью вы не сливаете все коммиты в основную ветку.
Git merge
А вот git merge
как раз для этого и нужен.
Git pull
Данная команда – симбиоз git fetch
и git merge
. Шорткод хорош, но только в том случае, если вам действительно нужно слить коммиты сразу после их сбора.
Git push
Если git pull
предназначен для мержа изменений в локальный репозиторий из удаленного, то git push
действует с точностью до наоборот: локальные изменения пушатся в удаленный репозиторий.
Также можно использовать:
git push origin master
Что означает коммит из локальной ветки master
на удаленный репозиторий origin
.
А какие еще команды вы бы посоветовали изучить новичкам?