Большинство Rubyists обнаруживают, что используют Git на ежедневной основе. Мы используем его для организации наших проектов, защиты от ошибок и внесения изменений с уверенностью в безопасности нашего кода. Его простой интерфейс командной строки противоречит его гибкости и глубине. Из-за этой силы, это определенно заслуживает глубокого изучения и практики.
Сегодня я хочу обсудить несколько методов, которые я использую для облегчения обмена ветвями, в частности, команду git-stash
.
git-stash
— это прекрасный способ временно скрыть изменения в грязной рабочей директории. Это позволяет нам работать над функциональной веткой и быстро переключаться на другие ветви, не беспокоясь о постановке / принятии наших изменений в первую очередь.
[Типичный рабочий процесс кражи]
Если вы похожи на большинство разработчиков, то ваш опыт работы с git-stash
не ограничивается следующими двумя командами:
git stash
и
git stash pop
Часто этого достаточно для того, что нам нужно, но git-stash
может предложить гораздо больше. Давайте рассмотрим некоторые из его многочисленных возможностей.
Сохранение с описанием
Упрощенный подход к сбору — это git stash
и аналогичен (в основном) git stash save
. Последний принимает несколько аргументов, наиболее важным из которых является описание. Если вы собираетесь использовать stash как часть вашего обычного рабочего процесса, вы должны использовать эти описания, чтобы лучше контролировать каждый stash. Давайте посмотрим, как это будет работать:
touch gum_drop_mountains.rb # New feature git add . # git-stash only works on tracked files # unless you pass the --include-untracked flag # to stash save git stash save "Initial pass on Gum Drop Mountains." git stash list stash@{0}: On master: Initial pass on Gum Drop Mountains.
Теперь, когда мы просматриваем текущий список тайников, мы видим значимые сообщения вместо описания по умолчанию WIP on <branch> <last commit message>
.
Копить в патчах
Иногда вы хотите сохранить определенное подмножество изменений, для этого мы можем использовать --patch
( -p
). Это позволяет нам в интерактивном режиме указать, какие изменения будут включены в этот тайник.
# edit gum_drop_mountain.rb git stash save -p "Added GDM tests"
Что приведет вас к приглашению, как показано ниже:
Как только вы начали интерактивный процесс, вы можете нажать ?
чтобы увидеть список доступных команд. По завершении вы сможете увидеть свой новый тайник со git stash list
. Изменения, которые остались незафиксированными (в тайник), все равно будут в вашем текущем каталоге.
Листинг Тайники
Самый распространенный способ просмотра ваших текущих сохраненных изменений — это ввести git stash list
как мы уже говорили ранее. Это напечатает:
# Unless you are cool and passed a description stash@{0}: WIP on submit: 6ebd0e2... Initial Commit. stash@{1}: On master: 9cc0589... Add git-stash
Здесь тайники указаны как stash@{<revision>}
. Многие из команд git-stash
позволяют явно установить этот идентификатор stash, что делает его важной частью информации. git stash list
принимает любые параметры, доступные в git log
что позволяет выполнить некоторые настройки.
git stash list --pretty=format:'%Cblue%h %Cred* %C(yellow)%s'
Который будет выводить что-то вроде:
Вы можете использовать псевдоним git-log
с вышеуказанным форматированием, что является обычным делом. Выполнение этого с помощью списка git stash является главным кандидатом для этого стиля оптимизации, поскольку возможность быстрого расшифровки этих описаний может сэкономить ваше время.
Показаны отдельные тайники
Отображение тайников можно выполнить с помощью команды git stash show
. Он принимает аргумент для идентификатора stash и по умолчанию использует stash@{0}
(самый последний). По умолчанию будет отображаться diffstat.
Применение тайников
Давайте предположим, что мы работаем в течение нескольких часов. За это время нас несколько раз отводили для работы над другими ветками проекта. Когда нас отстранили, мы спрятали наши грязные рабочие каталоги и дали им все приятные сообщения, чтобы потом мы могли собрать их все вместе. Теперь, когда ошибки исправлены, мы возвращаемся к нашим функциям. Наш список тайников выглядит так:
git stash list stash@{0}: On gum_drop_mountain: Touching up gum drop mountain peaks. stash@{1}: On candy_cane_lane: Adding some tinsel to candy cane lane stash@{2}: On master: First pass on gum drop mountains.
Мы хотим вернуться к candy_cane_lane
функций candy_cane_lane
и применить там наши спрятанные изменения. Для этого мы будем использовать команду git stash apply
.
git checkout candy_cane_lane git stash apply stash@{1} # Specified stash or most recent (stash@{0})
Как только мы это сделаем, наши изменения вернутся на свои места, и мы сможем возобновить работу.
Git умен в том смысле, что вы можете применить эти изменения к веткам, отличным от ветви, из которой они были спрятаны. Кроме того, ветка, к которой вы применяете изменения, не обязательно должна быть чистой! Git создаст конфликт слияния, который будет разрешен вручную, если тайник больше не применяется чисто [1].
Удаление тайников
Просто для забавы, давайте проверим список тайников, прежде чем двигаться дальше.
git stash list stash@{0}: On gum_drop_mountain: Touching up gum drop mountain peaks. stash@{1}: On candy_cane_lane: Adding some tinsel to candy cane lane stash@{2}: On master: First pass on gum drop mountains.
Какая? Наш тайник все еще присутствует в нашем списке даже после его применения. Это связано с тем, что apply
не выполняет автоматическую очистку после себя, поэтому для удаления тайника необходимо использовать следующую команду
git stash drop stash@{1}
Который уронит только тайник, который мы применили. Если бы мы не дали ему идентификатор тайника, он бы предположил, что намеревался сбросить stash@{0}
(самый последний). Если мы хотим избавиться от всех спрятанных изменений, мы можем запустить git stash clear
. Остерегайтесь очистить тайники (с помощью дропа или очистить), так как их невозможно восстановить.
О-о так удобно поп
После применения хранилища изменений к ветке довольно часто хорошей идеей является удаление этого хранилища из списка (как описано выше). К счастью, Git предоставляет нам удобный метод, который оборачивает этот рабочий процесс. Предположим, мы хотим применить stash@{1}
и удалить его из списка. Мы можем запустить следующую команду:
git stash pop stash@{1}
Если мы не предоставим идентификатор stash, он будет принят самым последним (как и большинство команд git-stash
). Страница руководства git-stash
предоставляет хороший способ обдумать эту команду. Что он делает обратное git stash save
.
Разветвление тайника
Иногда вы попадаете в ситуацию, когда вы начали вносить изменения не в ту ветку (например, master), и хотите перенести ваш текущий грязный каталог в свою собственную ветку. Ну, тебе повезло! Обычно вы должны сделать что-то вроде этого:
git stash git checkout -b new_feature git stash pop
Но у git-stash
есть удобный способ сделать это. Просто:
git stash git stash branch new_feature
Это создаст и new_feature
новую ветку new_feature
и применит к ней stash@{0}
.
Копить или не копить
Определение, когда прятаться, а не когда совершать и раздавить позже — дело вкуса. Пока вы пишете описательные сообщения о тайнике и обязательно сохраняете свой список тайников в чистоте, копирование — отличный способ быстро добраться до чистого каталога. Если, с другой стороны, вы не позаботитесь, вы будете мучительно тратить время на выяснение, какой тайник какой.
Предупреждения в стороне, сохранение — это мощная способность, которую предоставляет Git, и, немного потренировавшись, она может помочь вам быстрее и безопаснее перемещаться по коду. Счастливого взлома!