Гайда по Git у меня никогда не было.
🔧 У механиков есть гаечные ключи.
👨 💻 У нас, разработчиков, есть Git.
Мы не зарабатываем на Вас. Просто подпишитесь на наш канал ТГ и получайте эксклюзивную информацию о нодах и технологиях web3 и не только, раньше всех! Вокруг Крипты и Youtube👍
Вы заметили, что Git настолько неотъемлем от работы с кодом, что люди почти никогда не включают его в свой технологический стек или в резюме? Предполагается, что вы уже знаете это или, по крайней мере, достаточно, чтобы свести концы с концами, но так ли это?
Git — это система контроля версий (VCS). Вездесущая технология, которая позволяет нам хранить, изменять и совместно работать над кодом с другими пользователями.
🚨 В качестве дисклеймера, я хотел бы отметить, что Git — это огромная тема. Были написаны книги по Git, а также посты в блогах, которые можно принять за академические статьи. Это не то, к чему я здесь стремлюсь. Я не эксперт по Git. Моя цель здесь — написать пост об основах Git, который я хотел бы иметь при изучении Git.
Наша повседневная рутина как разработчиков вращается вокруг чтения, написания и проверки кода. Git, пожалуй, один из самых важных инструментов, которые мы используем. Освоение функций и функционала, которые предлагает Git, — одна из лучших инвестиций, которые вы можете сделать в себя как разработчика.
Если вы считаете, что я пропустил или вам следует более подробно остановиться на конкретной команде, дайте мне знать в комментариях ниже. И я обновлю этот пост соответствующим образом. 🙏
Давайте заложим основы
Помогает ли вам Git когда-нибудь почувствовать себя Питером Гриффином?
Если вы не изучите Git должным образом, вы рискуете постоянно чесать голову, застревать на одних и тех же проблемах или сожалеть о том дне, когда в вашем терминале появится еще один конфликт слияния. Давайте убедимся, что этого не произойдет, определив некоторые основополагающие концепции Git.
Branches
В репозитории Git вы найдете основную ветвь разработки, обычно называемую "main" или "master" (deprecated), от которой отходят несколько ветвей. Эти ветви представляют собой одновременные потоки работы, что позволяет разработчикам одновременно работать над несколькими функциями или исправлениями в рамках одного проекта.
Commits
Коммиты Git представляют собой пакеты обновленного кода, в которых делается снимок кода проекта в определенный момент времени. В каждом коммите фиксируются изменения, внесенные с момента записи последнего коммита, что в совокупности создает всестороннюю историю развития проекта.
При ссылке на коммиты вы, как правило, будете использовать их уникально идентифицированный криптографический хэш.
git show abc123def456789
Здесь отображается подробная информация о коммите с этим хешем.
Теги
Теги Git служат ориентирами в истории Git, обычно отмечая важные вехи в развитии проекта, такие как , , или . Эти теги бесценны для обозначения конкретных моментов времени, часто представляя собой отправные точки или основные достижения на пути проекта.releasesversionsstandout commits
HEAD
Самый последний коммит в текущей извлеченной ветке обозначается значком , служащим указателем на любую ссылку в репозитории. Когда вы находитесь на определенной ветке, указывает на последний коммит в этой ветке. Иногда, вместо того, чтобы указывать на кончик ветки, может напрямую указывать на конкретный коммит (состояние).HEADHEADHEADdetached HEAD
Stages
Понимание этапов Git имеет решающее значение для навигации по рабочему процессу Git. Они представляют собой логические переходы, в которых происходят изменения в файлах до того, как они будут зафиксированы в репозитории. Давайте углубимся в концепцию этапов Git:
Рабочий каталог 👷
Здесь вы редактируете, модифицируете и создаете файлы для своего проекта. Представление текущего состояния файлов на локальном компьютере.working directory
Промежуточная площадка 🚉
Эта область похожа на область удержания или зону предварительной фиксации, где вы подготавливаете изменения перед их фиксацией в репозитории.staging
Полезная команда здесь: Также может быть использована для отмены измененийgit addgit rm
Локальный репозиторий 🗄️
Локальный репозиторий — это место, где Git постоянно хранит зафиксированные изменения. Это позволяет просматривать историю проекта, возвращаться к предыдущим состояниям и сотрудничать с другими пользователями на той же кодовой базе.
Вы можете зафиксировать изменения, которые готовы в промежуточной области, с помощью: git commit
Удаленный репозиторий 🛫
Удаленный репозиторий — это централизованное расположение, обычно размещенное на сервере (например, GitHub, GitLab или Bitbucket), где вы можете делиться информацией и сотрудничать с другими пользователями в своем проекте.
Вы можете использовать такие команды, как и для отправки/извлечения зафиксированных изменений из локального репозитория в удаленный репозиторий.git pushgit pull
Начало работы с Git
Что ж, вы должны с чего-то начать, и в Git это ваш домен . Вы можете создать существующий репозиторий и иметь копию этого рабочего пространства, или, если вы начинаете полностью заново в новой локальной папке на своем компьютере, вам нужно превратить его в репозиторий Git с помощью . Следующий шаг, который не стоит упускать из виду, — это настройка учетных данных.workspaceforkclonegit init
Учетные данные настроены
При выполнении отправки и вытягивания в удаленный репозиторий вам не нужно каждый раз вводить имя пользователя и пароль, избегайте этого, просто выполнив следующую команду:
git config --global credential.helper store
При первом взаимодействии с удаленным репозиторием Git попросит вас ввести имя пользователя и пароль. И после этого вам больше не будут подсказывать
Важно отметить, что учетные данные хранятся в файле в формате обычного текста..git-credentials
Чтобы проверить настроенные учетные данные, вы можете использовать следующую команду:
git config --global credential.helper
Работа с ветками
При работе на местном уровне очень важно знать, в каком отделении вы сейчас находитесь. Эти команды полезны:
# Will show the changes in the local repositorygit branch # Or create a branch directly withgit branch feature-branch-name
Для перехода между ветвями используйте:
git switch
Помимо переходов между ними, также можно использовать:
git checkout # A shortcut to switch to a branch that is yet to be created with the -b flag git checkout -b feature-branch-name
Чтобы проверить состояние репозитория, используйте:
git status
Отличный способ всегда иметь четкое представление о вашем текущем филиале — видеть его прямо в терминале. В этом могут помочь многие дополнения к терминалу. Вот один из них.
Работа с коммитами
При работе с коммитами используйте git commit -m для записи изменений, git amend для изменения последнего коммита и старайтесь изо всех сил придерживаться соглашений о сообщениях коммитов.
# Make sure to add a message to each commitgit commit -m "meaningful message"
Если у вас есть изменения в последнем коммите, вам не нужно создавать еще один коммит, вы можете использовать флаг - — amend для внесения изменений в самый последний коммит с помощью проиндексированных изменений
# make your changesgit add .git commit --amend# This will open your default text editor to modify the commit message if needed.git push origin your_branch --force
⚠️ Будьте осторожны при использовании , так как это может привести к перезаписи истории целевой ветви. В целом следует избегать его применения на ветке main/master.--force
Как правило, лучше делать коммиты чаще, чем нет, чтобы не потерять прогресс или случайно не сбросить непроиндексированные изменения. После этого можно переписать историю, удалив несколько коммитов или выполнив интерактивное перебазирование.
Используется для отображения хронологического списка коммитов, начиная с самого последнего коммита и двигаясь назад во времениgit log
Манипулирование историей
Манипулирование историей включает в себя несколько мощных команд. Переписывает историю коммитов, объединяет несколько коммитов в один и выбирает конкретные коммиты.RebaseSquashingCherry-picking
Перебазирование и слияние
Имеет смысл сравнивать перебазирование со слиянием, так как цель у них одна, но достигается по-разному. Решающее отличие заключается в том, что перебазирование переписывает историю проекта. Желанный выбор для проектов, которые ценят четкую и понятную историю проекта. С другой стороны, слияние поддерживает историю обеих ветвей путем создания нового коммита слияния.
Во время перебазирования история коммитов функциональной ветки реструктурируется по мере ее перемещения в основную веткуHEAD
Рабочий процесс здесь довольно прост.
Убедитесь, что вы находитесь на ветке, которую хотите переместить, и получите последние изменения из удаленного репозитория:
git checkout your_branchgit fetch
Теперь выберите ветку, на которую вы хотите перебазироваться, и выполните следующую команду:
git rebase upstream_branch
После перебазирования вам может потребоваться принудительная отправка изменений, если ветка уже была отправлена в удаленный репозиторий:
git push origin your_branch --force
⚠️ Будьте осторожны при использовании , так как это может привести к перезаписи истории целевой ветви. В целом следует избегать его применения на ветке main/master.--force
Squashing
Склеивание Git используется для сжатия нескольких коммитов в один связный коммит.
Концепция проста для понимания и особенно полезна, если используемый метод унификации кода заключается в перебазировании, поскольку история будет изменена, важно помнить о влиянии на историю проекта. Были времена, когда мне было трудно выполнить сквош, особенно с использованием интерактивного перебазирования, к счастью, у нас есть некоторые инструменты, которые могут нам помочь. Это мой любимый метод сжатия, который включает в себя перемещение указателя HEAD назад на X количество коммитов с сохранением проиндексированных изменений.
# Change to the number after HEAD~ depending on the commits you want to squashgit reset --soft HEAD~Xgit commit -m "Your squashed commit message"git push origin your_branch --force
⚠️ Будьте осторожны при использовании , так как это может привести к перезаписи истории целевой ветви. В целом следует избегать его применения на ветке main/master.--force
Cherry-picking
Выборочный отбор полезен для выборочного включения изменений из одной ветви в другую, особенно когда слияние целых ветвей нежелательно или нецелесообразно. Тем не менее, важно использовать выборочный отбор с умом, так как при неправильном применении он может привести к дублированию коммитов и расходящимся историям
Чтобы выполнить это, сначала вам нужно определить хэш коммита коммита, который вы хотели бы выбрать, вы можете сделать это с помощью . После того, как вы определили хэш коммита, вы можете выполнить:git log
git checkout target_branchgit cherry-pick <commit-hash> # Do this multiple times if multiple commits are wantedgit push origin target_branch
Расширенные команды Git
Подписание коммитов
Подписание коммитов — это способ проверить подлинность и целостность коммитов в Git. Он позволяет вам криптографически подписывать свои коммиты с помощью ключа GPG (GNU Privacy Guard), гарантируя Git, что вы действительно являетесь автором коммита. Вы можете сделать это, создав ключ GPG и настроив Git на использование ключа при коммите. Вот шаги:
# Generate a GPG keygpg --gen-key# Configure Git to Use Your GPG Keygit config --global user.signingkey <your-gpg-key-id># Add the public key to your GitHub account# Signing your commits with the -S flaggit commit -S -m "Your commit message"# View signed commitsgit log --show-signature
Журнал ссылок Git
Тема, которую мы не исследовали, — это ссылки на Git, они указывают на различные объекты в репозитории, в первую очередь коммиты, но также теги и ветки. Они служат именованными точками в истории Git, позволяя пользователям перемещаться по временной шкале репозитория и получать доступ к конкретным снимкам проекта. Знание того, как перемещаться по ссылкам git, может быть очень полезным, и для этого они могут использовать git reflog. Вот некоторые из преимуществ:
Интерактивное перебазирование
Интерактивное перебазирование — это мощная функция Git, которая позволяет переписывать историю коммитов в интерактивном режиме. Он позволяет изменять, переупорядочивать, объединять или удалять коммиты перед их применением к ветви.
Для того, чтобы им воспользоваться, необходимо ознакомиться с возможными действиями, такими как:
Вот полезное видео, чтобы узнать, как выполнить интерактивное перебазирование в терминале, я также дал ссылку на полезный инструмент внизу блога.
Сотрудничество с Git
Origin против Upstream
Origin — это удаленный репозиторий по умолчанию, связанный с локальным репозиторием Git на момент его клонирования. Если вы создали форк репозитория, то этот форк становится вашим "исходным" репозиторием по умолчанию.
Upstream, с другой стороны, относится к исходному репозиторию, из которого был создан ваш репозиторий.
Чтобы поддерживать ваш форк-репозиторий в актуальном состоянии с последними изменениями из исходного проекта, вы можете выполнить git fetch changes из "upstream" репозитория и объединить или переместить их в ваш локальный репозиторий.
Чтобы просмотреть удаленные репозитории, связанные с вашим локальным репозиторием Git, выполните:
git remote -v
Конфликты
Не паникуйте, когда вы пытаетесь объединить или переместить ветку и обнаруживаете конфликты, это означает только то, что есть конфликтующие изменения между разными версиями одного и того же файла или файлов в вашем репозитории, и они могут быть легко разрешены (в большинстве случаев).
Обычно они указываются в затронутых файлах, где Git вставляет маркеры конфликтов , а также для выделения конфликтующих разделов. Решите, какие изменения следует сохранить, изменить или удалить, убедившись, что полученный код имеет смысл и сохраняет предполагаемую функциональность.<<<<<<<=======>>>>>>>
После ручного разрешения конфликтов в конфликтующих файлах удалите маркеры конфликтов , и при необходимости настройте код.<<<<<<<=======>>>>>>>
Сохраните изменения в конфликтующих файлах, как только будете удовлетворены решением.
Если у вас возникли проблемы с разрешением конфликтов, это видео поможет вам объяснить это.
Популярные рабочие процессы Git
Существуют различные рабочие процессы Git, однако важно отметить, что не существует универсально «лучшего» рабочего процесса Git. Вместо этого каждый подход имеет свой набор плюсов и минусов. Давайте рассмотрим эти различные рабочие процессы, чтобы понять их сильные и слабые стороны.
Рабочий процесс 🌱 в функциональных ветках
Каждая новая функция или исправление ошибки разрабатывается в отдельной ветке, а затем сливается обратно в основную ветвь после завершения.
- Сила: Изоляция изменений и уменьшение конфликтов.
- Слабость: Может стать сложным и потребовать тщательного управления филиалом.
Рабочий процесс 🌊 Gitflow
Gitflow определяет модель строгого ветвления с предопределенными ветвями для различных типов задач разработки.
Он включает в себя долгоживущие ветви, такие как main, develop, feature branches, release branches и hotfix branches.
- Сила: Подходит для проектов с плановыми релизами и длительным обслуживанием.
- Слабость: Может быть слишком сложным для небольших команд
Рабочий процесс 🍴 форка
В этом рабочем процессе каждый разработчик клонирует основной репозиторий, но вместо того, чтобы отправлять изменения непосредственно в него, они отправляют изменения в свою собственную ветвь репозитория. Затем разработчики создают запросы на вытягивание, чтобы предложить изменения в основном репозитории, что позволяет проверить код и совместно работать перед слиянием.
Это рабочий процесс, который мы используем для совместной работы над репозиториями Glasskube с открытым исходным кодом.
- Сила: Поощряет совместную работу внешних участников без предоставления прямого доступа на запись в основной репозиторий.
- Слабость: Поддержание синхронизации между форками и основным репозиторием может быть сложной задачей.
Рабочий процесс ⏩ запроса на вытягивание
Похоже на рабочий процесс форка, но вместо форка разработчики создают функциональные ветки прямо в основном репозитории.
- Сила: Упрощает проверку кода, совместную работу и обмен знаниями между членами команды.
- Слабость: Зависимость от рецензентов кода может привести к задержкам в процессе разработки.
Разработка 🪵 на основе ствола
Если вы работаете в команде, ориентированной на быструю итерацию и непрерывную доставку, вы можете использовать разработку на основе ствола, в которой разработчики работают непосредственно в главной ветке, фиксируя небольшие и частые изменения.
- Сила: Способствует быстрой итерации, непрерывной интеграции и сосредоточению внимания на внесении небольших, но частых изменений в рабочую среду.
- Слабость: Требует надежных конвейеров автоматизированного тестирования и развертывания для обеспечения стабильности основной ветви, может не подходить для проектов со строгими графиками выпуска или разработки сложных функций.
Что за вилка?
Форк настоятельно рекомендуется для совместной работы над проектами с открытым исходным кодом, поскольку у вас есть полный контроль над собственной копией репозитория. Вы можете вносить изменения, экспериментировать с новыми функциями или исправлять ошибки, не затрагивая исходный проект.
💡 Мне потребовалось много времени, чтобы понять, что, хотя разветвленные репозитории начинаются как отдельные сущности, они сохраняют связь с исходным репозиторием. Такое подключение позволяет отслеживать изменения в исходном проекте и синхронизировать свой форк с обновлениями, внесенными другими.
Вот почему даже когда вы отправляете данные в свой исходный репозиторий. Ваши изменения также отобразятся на пульте дистанционного управления.
Шпаргалка Git
# Clone a Repositorygit clone <repository_url># Stage Changes for Commitgit add <file(s)># Commit Changesgit commit -m "Commit message"# Push Changes to the Remote Repositorygit push# Force Push Changes (use with caution)git push --force# Reset Working Directory to Last Commitgit reset --hard# Create a New Branchgit branch <branch_name># Switch to a Different Branchgit checkout <branch_name># Merge Changes from Another Branchgit merge <branch_name># Rebase Changes onto Another Branch (use with caution)git rebase <base_branch># View Status of Working Directorygit status# View Commit Historygit log# Undo Last Commit (use with caution)git reset --soft HEAD^# Discard Changes in Working Directorygit restore <file(s)># Retrieve Lost Commit Referencesgit reflog# Interactive Rebase to Rearrange Commitsgit rebase --interactive HEAD~3
Премия! Некоторые инструменты и ресурсы Git, которые сделают вашу жизнь проще.
- Инструмент для интерактивного перебазирования.
- Cdiff для просмотра красочных, инкрементных различий.
- Интерактивная игровая площадка с ветвлением Git
Спасибо за прочтение! Пожалуйста, поделитесь своим отзывом в комментариях и подпишитесь на меня в социальных сетях, если вам понравилась статья. Я также создал сообщество Telegram, где мы можем собираться и обсуждать интересные темы, связанные с криптовалютой. Вы можете присоединиться к нам и принять участие в обсуждении → Telegram: Contact @razgules