Вам знакомы с GIT основами рабочего процесса, вы знаете такие простые команды, как add, commit, pull, push? Тогда эта статья вам будет полезна. В данном посте речь пойдет об улучшении практик применения GIT на повседневной основе, об исправлении некоторых распространенных ошибок. Кроме того, вы будете на шаг ближе к тому, чтобы стать продвинутым пользователем GIT.
#использование add
Вы хотите добавить файлы с определенным расширением. Конечно, вы можете загружать файлы по одному. А можно применить *.<extension_name>
, чтобы включить все файлы с этим расширением. Следующая команда позволит добавить все файлы Python.
git add *.py
Вы хотите добавить файлы с определенным расширением, а также вам нужно это сделать для определенной директории. В таком случае вы можете использовать такую команду. В примере она добавит все файлы Python из подкаталога models/
.
git add models/\*.py
#использование clean
Вы создали несколько новых файлов или папок в своей ветке. Через какое-то время вы поняли, что они вам не нужны. Вы хотите очистить свое рабочее «дерево». В GIT это не отслеживаемые файлы.
Hе отслеживаемые файлы – это такие файлы, которые вы не добавляли с помощью git add.
Чтобы очистить свое рабочее «дерево», вам понадобится использовать следующую команду. Она удалит все файлы и каталоги, которые не отслеживаются GIT.
git clean -df
Если вы сначала хотите увидеть, какие не отслеживаемые файлы будут удалены, то можете воспользоваться такой командой.
git clean -dn
#использование rm
Теперь вы хотите удалить отслеживаемые файлы. Эта команда позволяет удалить отслеживаемый файл.
git rm <file-path>
Если ваш файл находится под контролем версий, вы можете добавить дополнительный флаг «force».
git rm <file-path> -f
Если вам нужно удалить файл из каталогов GIT, но не из вашей файловой системы, то примените такую команду.
git rm --cached <file-path>
#использование branch
Если вы опечатались в названии ветки или хотите изменить ее название, то в этом поможет следующая команда.
git branch -m <old-branch-name> <new-branch-name>
Если вы хотите изменить текущее название ветки, тогда можно просто применить такую команду.
git branch -m <new-branch-name>
Если вы уже использовали push для ветки с неправильным названием, то понадобится провести еще пару дополнительных действий. Вам нужно будет удалить старую ветку с сервера и добавить новую.
git push <remote-name> --delete <old-branch-name>
git push <remote-name> <new-branch-name>
Если вы хотите использовать push для кода локальной ветки, но ее название не совпадает с названием ветки на сервере, то поможет следующая команда.
git push <remote-name> <local-branch-name>:<remote-branch-name>
#использование log
Если вам нужно увидеть свою историю коммитов, то можно воспользоваться командой git log
. Она может показать много полезной информации, но вам для этого понадобятся id коммита. Далее можно применить такую команду.
git log --oneline
В результате выполнения этой команды мы увидим:
Первые 7 символов в выводе, показанном выше, — это сокращенный id коммита. Далее следует сообщение коммита. Идентификатор коммита является сокращенным, так как его полная версия состоит из 40 шестнадцатеричных чисел, которые определяют 160-битовый хеш SHA-1. Обратите внимание на HEAD -> master
. Это значит, что сейчас мы находимся в основной ветви разработки (master).
Если вы хотите увидеть сообщения коммита, принадлежащее определенному автору, то можно воспользоваться такой командой. Я предположил, что имя автора – «Джон Доу».
git log --author="John Doe"
#использование stash
Вы работаете в ветви и сделали несколько изменений. Теперь вы хотите увидеть вывод или код из этой ветви, который был до изменений. Тогда можно запустить команду stash
. Она очистит ваше рабочее «дерево».
git stash
Если вы хотите вернуть свои изменения, то воспользуйтесь этой командой.
git stash pop
Если вам не нужны ваши изменения, подойдет следующая команда.
git stash drop
Вы изменили несколько файлов не в той ветви. Тогда можно «спрятать» изменения, затем применить команду checkout
к нужной ветви и запустить там git stash pop
. В таком случае ваши изменения будут проведены в нужной ветви.
#использование checkout
Вы хотите переключится в другую ветку. Тогда воспользуйтесь следующей командой.
git checkout <branch-name>
Если вы уже изменили какой-то файл в текущей ветви, обязательно примените команду stash или commit к своим изменениям. Если вы этого не сделаете, то это также отразится на смененной вами ветви, а такие перемены вам могут быть ни к чему.
У вас есть ветка с названием development
. Вы хотите сделать из нее ветвь и переместиться прямо в свою новую ветку. Вам поможет такая команда.
(development)$ git checkout -b <your-new-branch-name>
Вы также можете воспользоваться checkout с помощью идентификатора коммита. Можно без опаски пользоваться сокращенным id, если ваш проект небольшого размера.
git checkout <commit-id>
Согласно закономерностям, задающим GIT основы, наступит состояние detached head. Head — это просто отсылка к текущему (последнему) коммиту текущей ветви. Обычно head в GIT указывает на ветвь или коммит. Когда head указывает на ветвь, GIT не жалуется. Когда же head указывает на коммит, а не на ветку, то он переходит в состояние detached head.
Если вы продолжить разработку из этой detached head, то из этого состояния вам понадобится создать ветвь и начать разработку.
git checkout -b <your-new-branch-name>
#использование commit
Вы только что добавили сообщение в коммите и поняли, что в вашем коммите есть опечатка или же вам просто нужно сделать свое сообщение более экспрессивным и понятным. Тогда можно воспользоваться следующей командой для GIT.
git commit --amend -m "your-new-commit-message"
Если вы только что добавили несколько файлов или исправили баг, но не хотите добавлять новое сообщение в коммите, то примените такую команду для GIT с отметкой --no-edit
.
git commit --amend --no-edit
Здесь важно запомнить, что изменение последней версии переписывает историю коммитов. Это значит, что id коммита будет заменен при проведении изменений в коммитов.
Если вы уже отправили с помощью push свой код на удалённый репозиторий, а затем поняли, что вам нужно изменить свое сообщение коммита, то после изменения вам нужно будет сделать force push. Допустив, что название удаленной точки – origin, вы можете провести такую команду.
git push origin <branch-name> -f
#использование reset
Хотите удалить свои последние коммиты? Используйте git reset
для этого. Вам нужно знать 3 флага для этой команды:
Предположим, вы хотите избавиться от изменений до added two.txt с идентификатором коммита 96b037c.
Давайте воспользуемся командой reset с отметкой --soft
.
git reset --soft 96b037c
После этой команды все коммиты после этого id (то есть после 96b037c) станут orphan, но не будут удалены. Файлы будут находиться под системой контроля версий.
Orphaned commit – это такой коммит, для которого не существует прямого пути от ref для получения доступа к нему. Такие коммиты обычно можно найти и восстановить при помощи git reflog
. GIT навсегда удалит все orphan коммиты, после того как запустит внутренний «сборщик мусора». По умолчанию GIT делает это каждые 30 дней.
Если вы выполните команду git status
, то увидите это:
Если же вы воспользуетесь git log --oneline
, то заметите, что предыдущие коммиты были удалены.
Если вы используете команду удаления с отметкой --mixed
, то ваши коммиты станут orphaned, а файлы будут находиться не под контролем GIT, а в вашей файловой системе. Если вы не указали никакой отметки в reset, то GIT по умолчанию воспользуется --mixed
.
Если вы повторите команду git status
, то увидите это:
Если вы хотите навсегда удалить файлы, то можете запустить команду reset с отметкой --hard
.
Хорошей практикой является сначала провести команду reset с отметкой --soft
и увидеть затронутые файлы. Если вы уверены, что эти изменения вам не нужны, то можно перейти на отметку --hard
.
Никогда не стоит использовать git reset <commit-id>
, если какие-либо коммиты после <commit-id>
были отправлены в удаленный репозиторий. Если вы удалите коммит, разработку которой продолжили другие члены команды, то для продолжения работы появятся некоторые серьезные проблемы.
#использование revert
Вы работаете в публичном репозитории и хотите отменить коммит. Тогда примените следующую команду.
git revert <commit-id> --no-commit
После этого можно проверить, какие файлы были затронуты, с помощью git status
. Далее вам нужно будет сделать коммит с помощью git commit -m "commit-message"
.
git revert
не сделает коммит ввида orphan. Эта команда просто отменит изменения в коммите.
Предположим, что вы хотите применить revert к последнему коммиту. После этого ваш статус будет выглядеть также, как на изображении ниже:
Перед последним коммитом не был добавлен файл six.txt, так что он был удален. Файл five.txt был изменен до своего предыдущего состояния. После этого процесса ваша история коммитов будет выглядеть следующим образом:
Если вы хотите отменить несколько коммитов в определенном диапазоне, то запустите такую команду.
git revert <oldest-commit-id>..<recent-commit-id> --no-commit
Если вы хотите отменить несколько коммитов, которые не находятся в определенном диапазоне, то вам придется ввести идентификаторы всех нужных коммитов.
git revert <commit-id-1> <commit-id-2> --no-commit
#использование cherry-pick
Вы работаете в ветви и вам нужен коммит (например, для исправления багов) из другой ветви, при этом он должен работать в текущей ветке. В таком случае можно воспользоваться командой cherry-pick
, чтобы заполучить этот коммит в свою ветвь. Эта команда также будет полезна, если вы добавили коммиты не в ту ветку и хотите переместить ее в другую.
Для начала нужно переключиться на ветвь, в которой содержится коммит. Скопируйте идентификатор коммита и перейдите в текущую ветвь. Затем запустите следующую команду, чтобы переместить коммит в рабочую ветвь.
git cherry-pick – это как копировать что-то из папки и вставлять в другую папку. Коммит не будет удален из источника, а в ветви назначения идентификатор изменится.
git cherry-pick <commit-id>