Git для начинающих: основы рабочего процесса и базовые команды

Статья "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

Она покажет вывод, как на картинке ниже.

Git для начинающих: основы рабочего процесса и базовые команды

Первые семь символов – это сокращенный 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

Git для начинающих: основы рабочего процесса и базовые команды

Предположим, вы хотите отменить изменения, до момента добавления файла two.txt, имеющего commit id 96b037c.

Теперь давайте выполним команду git reset с флагом --soft:

git reset --soft 96b037c

git reset --soft "потеряет" все коммиты после этого идентификатора (например, 96b037c), но файлы не будут удалены, они будут находиться в промежуточной области.

Потерянные коммиты не имеют прямой ссылки для доступа к ним. Такие коммиты обычно можно найти и восстановить с помощью git reflog. Git навсегда удалит "потеряшки", когда запустится сборщик мусора (запуск производится каждые 30 дней).

При запуске git status вы увидите:

Git для начинающих: основы рабочего процесса и базовые команды

Если вы запустите git log --oneline, то увидите, что предыдущие коммиты были удалены:

Git для начинающих: основы рабочего процесса и базовые команды

Если выполнить команду reset с флагом --mixed, коммиты станут "потерянными", файлы не будут находиться в промежуточной области, но их можно будет найти в ФС. Если вы вообще не укажете флаг в команде reset, флаг --mixed будет использоваться по умолчанию.

При запуске git status увидим следующее:

Git для начинающих: основы рабочего процесса и базовые команды

Если необходимо окончательно удалить файлы, запустите команду 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.

Git для начинающих: основы рабочего процесса и базовые команды

Например, необходимо отменить последний коммит. После revert-а статус будет выглядеть так:

Git для начинающих: основы рабочего процесса и базовые команды

Перед последним коммитом файл six.txt не был добавлен, поэтому он удален, а five.txt возвращается в предыдущее состояние. Теперь история будет выглядеть так:

Git для начинающих: основы рабочего процесса и базовые команды

Если вы хотите отменить несколько коммитов в пределах диапазона, выполните следующую команду:

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.

А какие еще команды вы бы посоветовали изучить новичкам?

Оригинал

Другие материалы по теме:

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ