Рассмотрим различные ситуации из жизни разработчика (и не только). К каждой будет прилагаться правильное оптимальное решение.
Git init
Чтобы создать в текущей директории поддиректорию .git , где будут храниться все файлы репозитория, выполните git init . Если поддиректория уже существует, при повторной аналогичной команде будет выведено сообщение Reinitialized existing Git repository in .
Git add
Вам необходимо добавить в проект файлы с определенным расширением. Можно добавить все файлы по одному, но лучше использовать *.< имя_расширения> , чтобы включить все файлы с этим расширением:
Если вы хотите добавить файлы с определенным расширением и следом указать имя каталога, то можно выполнить следующую команду. Она добавит все .py файлы из подкаталогов models/directory:
Git clean
Допустим, вы создали несколько новых файлов или папок в ветке Git, а через время оказалось, что эти файлы больше не нужны. В этом случае нужно очистить свое рабочее дерево от лишних файлов (которые были добавлены с помощью git add) следующей командой:
Чтобы увидеть, какие untracked-файлы будут удалены, используйте команду:
Git rm
Следующая команда в подборке «Git для начинающих» поможет удалить отслеживаемые файлы:
Если удаляемый файл находится в staging-области, нужно применить специальный флаг:
На случай если вы хотите удалить файлы из репозитория, а в своей ФС оставить, выполните эту команду:
Git branch
Вы сделали опечатку в имени ветки или хотите изменить ее имя? Следующая команда вам в помощь:
Если нужно изменить имя текущей ветки:
Для изменения имени запушиной ветки потребуется выполнить несколько дополнительных шагов:
Если имя локальной ветки не совпадает с именем ветки в репозитории, используйте команду:
Git log
Чтобы увидеть историю Git коммит, применяйте команду git log. Вам будет показано много информации, но среди этого вам нужен только commit id и сообщение. Для изменения вывода выполните такую команду:
Она покажет вывод, как на картинке ниже.
Первые семь символов – это сокращенный commit id, а после него идет сообщение. Commit id представлен в сокращенном виде, т. к. «полная версия» состоит из сорока шестнадцатеричных символов, указывающих на 160-разрядный SHA1 хэш.
Head -> master – означает, что мы в ветке master.
Если вы хотите увидеть сообщение конкретного автора, можно выполнить это:
Git stash
Допустим, вы решили проверить код ветки перед внесением изменений. Для этого есть команда stash, которая будет держать рабочее дерево в «чистоте»:
Для отмены изменений делайте так:
А если передумали, делайте откат:
Git checkout
Чтобы переключиться на другую ветку, выполните команду:
Не забывайте сохранять изменения или делать Git коммит в текущей ветке. Если этого не сделать, изменения могут отразиться на других ветках, а вам это не нужно.
Например, есть ветка development, и вы хотите сделать ее копию, чтобы переключаться в нее напрямую. Это можно сделать так:
Git commit
Вы закоммитили изменения, позже поняли, что допустили ошибку, или просто необходимо сделать описание более понятным. Тогда эта команда – то, что нужно:
Если вы добавили новые файлы или исправили ошибку, но не хотите добавлять еще одно commit-сообщение, используйте команду с флагом —no-edit:
Вы запушили свой код в удаленный репозиторий, а затем поняли, что нужно изменить commit-сообщение. Для этого после внесения изменений сделайте принудительный push. Используя имя удаленного репозитория в качестве источника, выполните:
Git reset
Если вам нужно отменить последний коммит, используйте git reset. Существуют три полезных флага сброса:
- soft
- mixed
- hard
Предположим, вы хотите отменить изменения, до момента добавления файла two.txt, имеющего commit id 96b037c.
Теперь давайте выполним команду git reset с флагом —soft:
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 status. Затем git commit -m «commit-message».
Revert отменяет не коммит, а изменения возвращенного commit-id.
Например, необходимо отменить последний коммит. После revert-а статус будет выглядеть так:
Перед последним коммитом файл six.txt не был добавлен, поэтому он удален, а five.txt возвращается в предыдущее состояние. Теперь история будет выглядеть так:
Если вы хотите отменить несколько коммитов в пределах диапазона, выполните следующую команду:
Если нужно отменить несколько коммитов, вне диапазона, следует указывать каждый commit-id:
Git cherry-pick
И последняя команда из рубрики Git для начинающих – cherry-pick. Чтобы сделать коммит (например, исправление ошибки) в ветке «А», работая в ветке «Б», используйте команду 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 действует с точностью до наоборот: локальные изменения пушатся в удаленный репозиторий.
Также можно использовать:
Что означает коммит из локальной ветки master на удаленный репозиторий origin .