Для огромного количества компаний GIT является инструментом номер один для версионирования, но зачастую, многие используют его только для того, чтобы удаленно хранить код и удобным способом обмениваться им между коллегами. Однако гит предоставляет большой функционал для управления кодом: отмена состояния, переключение между ветками, восстановление старых файлов и т.д. В этой статье не будет слов о том как настраивать git при помощи команды git config, о том как создавать коммит, пушить и получать изменения с удаленного сервера или же просто переключаться между ветками. Сегодня попробуем обратить внимание на возможности гита, которые зачастую опускаются при знакомстве с этой мощной утилитой.
Восстановление файлов из старых коммитов
Команда git checkout позволяет не только переключаться между различными состояниями проекта, но так же позволяет восстанавливать файлы из любого коммита, который был когда-либо сделан. Сделать это очень просто. Достаточно воспользоваться командой git checkout с нужными значениями:
$ git checkout [идентификатор_коммита] [путь_до_файла]
Вместо [путь_до_файла] так же можно указать папку и рекурсивно забрать оттуда все файлы. Несколько наглядных примеров:
$ git checkout 5d2c85 js/script.js
таким образом мы восстановим файл script.js из коммита 5d2c85. То есть, вы не переключитесь на коммит, а только лишь достанете указанный файл.
$ git checkout -- pictures
данная команда позволяет отменить текущие изменения в файле и вернуть то состояние, в котором он находился во время последнего коммита.
Случайные коммиты в чужую ветку
Представим ситуацию: вам поступила задача на разработку новой фичи и целесообразно было бы уйти разрабатывать на другую ветку. Но бывают ситуации, когда вы просто отвлеклись или же просто забыли и не создали для себя новую ветку, а сделали уже несколько коммитов, к примеру в master. Казалось бы ситуация не самая приятная, но из нее есть вполне простой выход:
Предположим вы находитесь на ветке master. Коммитим последние изменения и не переключаясь на другую ветку создаем новую, в которой в дальнейшем будем работать:
$ git checkout -b ‘feature-1587/search’
После этого обратно переключаемся на ветку master и используем команду
$ git reset --hard <идентификатор_коммита>
которая позволит откатить ветку master на указанный коммит.
К примеру:
$ git reset --hard @~3
откатит ветку master на 3 коммита назад.
Или другой вариант:
$ git reset --hard 3a87e
откатит ветку master на коммит 3a87e.
Также ветку можно откатить на другое место положение, не уходя с новой ветки feature. Сделать это также очень просто при помощи команды:
$ git branch master master~3 –force
Указанная команда откатит ветку master на три коммита назад от самой себя, а ключ --force здесь нужен для того, чтобы гит проигнорировал то, что ветка мастер уже существует и перезаписал ее.
Как можно увидеть, нет никаких проблем, если вы по какой-либо причине случайно добавили коммиты не в ту ветку. Стоит отметить, что в данном случае предполагается, что комиты, по ошибке попавшие в master еще не отправлены на удаленный сервер.
Редактирование последнего коммита
Бывают случаи, когда в коммите допущена ошибка в сообщении: либо грамматическая, либо сообщение не точно описывает содержимое коммита, может вы обнаружили, что не добавили какие-либо файлы в коммит и вы хотели бы это как то исправить. Используя команду git commit с ключом --amend позволит вам сделать это. Но для большего понимания опишем ситуацию:
После очередного коммита вы обнаружили, что забыли добавить файл style.css. В таком случае нам необходимо добавить его в индекс (!) при помощи команды
$ git add style.css
А затем уже вызвать знакомую нам команду
$ git commit --amend
после чего откроется редактор для возможности изменить предыдущее сообщение.
Таким образом нам удалось одновременно и добавить новый файл в предыдущий коммит, а также изменить сообщение.
Если вы хотите изменить только сообщение, то можно без проблем использовать только команду
$ git commit --amend
Да, данная команда позволяет изменить только предыдущий коммит. Если же вам необходимо изменить несколько предыдущих коммитов, то для этого необходимо использовать команду git rebase, но ее использование выходит за рамки этой статьи.
Удаление веток
После продолжительной работы может накопиться множество веток, которые по сути уже не нужны, так как работа над ними может быть закончена. Естественно, такие ветки необходимо удалить. Причем как локально, так и на удаленном сервере. Для того чтобы удалить ветку локально, можно использовать команду git branch с ключом --delete:
$ git branch --delete <имя_ветки> [<имя_ветки>] …
Такая команда удалит две ветки feature-145/footer и feature-122/header
$ git branch --delete feature-145/footer feature-122/header
Как можно увидеть, команда может принимать как одну ветку, так и несколько, поэтому, если накопилось достаточно много старых веток, это очень удобно.
Команда, приведенная выше, удаляет ветку только локально. Для того, чтобы удалить ветку, находящуюся в удаленном репозитории, необходимо воспользоваться командой git push с ключом --delete.
$ git push --delete origin feature-14/header
Эта команда принимает несколько веток.
Также существует еще одна команда для удаления:
$ git push origin :<имя_ветки> [:<имя_ветки>]
Команда удалит ветку feature-13/footer и feature-14/header
$ git push origin :/feature-13/footer :feature-14/header
Обе команды работают аналогично, поэтому можете использовать ту, которая вам больше нравится
Вторая команда одновременно позволяет как запушить ветку (ветки), так и удалить ветку (ветки).
Следующая команда удалит ветку feature-12/sidebar и запушит feature-14/header
$ git push origin :feature-12/sidebar feature-14/header
Вместо заключения
Git имеет мощный функционал для разработки кода и распределенного контроля версий. Для базовых вещей хватит минимальных знаний, но чем сложнее проект, чем больше людей в нем задействовано – тем глубже следует погрузиться в возможности git. Чем больше вы знаете функционал, тем больше потенциальных проблем может быть не допущено, тем больше ошибок решено.