Привет! Рад, что вам интересно узнать, что заставляет git работать, а не просто запомнить команды и функции.
Один из ключевых выводов из этой серии заключается в том, что команды будут иметь для вас большое значение, и вы будете чувствовать себя уверенно в любом проекте, частью которого будете.
Сказав это, давайте продолжим и посмотрим, что нас ждет сегодня. 😋
Содержание
- Означает ли ветвь расхождение?
- Зачем нам вообще нужен филиал?
- Как реализовать ветку?
- Давайте пить бирьяни вместе?
- Что такое «Объединить»?
- Ситуация слияния 1: Ускоренное слияние
- Ситуация слияния 2: Рекурсивное слияние
Означает ли ветвь расхождение?
Ветвь не означает расхождение (как дерево).
Ветка Git не означает такое расхождение
Ветка — это просто указатель, указывающий на последнюю фиксацию.
Что-то вроде этого:
Зачем нам вообще нужен филиал? 🤔
Давайте разберемся на примере
Предположим, в вашей команде есть 2 разработчика, которые работают над файлом «loginUser». Им обоим нужно работать над разными перспективами этой функции, но с одним и тем же файлом «loginUser».
Разработчик1 работает с определенным разделом файла. Разработчик2 знает, что последующий код будет написан после того, как Разработчик1 закончит работу, и поэтому он/она пишет этот код. Оба они, по сути, работают над разными версиями одного и того же файла, и когда они будут завершены, нам нужно объединить их работу в окончательный файл «loginUser».
Ветви позволяют нам работать над разными версиями одних и тех же файлов параллельно. Наши правки в одной ветке могут быть независимыми от работы в других ветках. Затем мы можем решить включить или объединить наши изменения в другие ветки. Ветви приводят к разделению версий одних и тех же файлов. Таким образом, у нас могут быть ветки для разных целей.
Итак, из приведенного выше примера Developer1 будет работать, скажем, с Branch1, а Developer2 будет работать с Branch2. После того, как оба они будут выполнены, мы объединим Branch1 и Branch2, чтобы получить окончательный файл «loginUser».
Как реализовать ветку?
Реализация ветки
git branch <name_of_branch> //creates a branch with the given name git checkout <name_of_branch> //switches to the branch
Вы можете создать и проверить одновременно с помощью следующей команды:
git checkout -b <name_of_branch>
Давайте пить бирьяни вместе?
Что бы вы хотели иметь с бирьяни? газировка или холодный напиток? хорошо. Давайте сначала добавим бирьяни в наш список. Если вы не вегетарианец, давайте отдадим предпочтение курице.
Ветка «BiryaniBranch» выполнила вашу работу с 2 коммитами (добавлен biryani, получите часть ноги)
Ветка «coldDrink» выполнила свою работу за 1 коммит (получить холодный напиток)
Теперь, когда заказ бирьяни сделан и мы ждем его прибытия, давайте подытожим то, что мы узнали:
Как вы можете видеть на двух рисунках выше, ветвь не означает расхождения, поскольку каждая ветвь указывает на недавнюю фиксацию, и с ней не связано понятие расхождения.
Что такое Голова?
Поскольку указатель ветки указывает на последнюю фиксацию в этой конкретной ветке, Head указывает на последнюю фиксацию в последней ветке, т. е. ветке, извлеченной в данный момент.
«auth» и «sdn» — это две ветки, которые произошли от master. «auth» — это проверенная в данный момент ветка. Следовательно, «HEAD» указывает на последнюю фиксацию (c435356) текущей извлеченной ветки, т. е. «auth»
Что такое «Объединить»?
Все, что мы обсуждали до сих пор в этой серии, может быть реализовано на вашем компьютере локально. Но слияние — это концепция, которая требует как минимум двух веток, и эти две ветки могут быть созданы вами или другими разработчиками, работающими над одним и тем же репозиторием, но удаленно. В обоих случаях вам нужно знать, как «Объединить»
Мы поговорим о двух ситуациях слияния, а именно:
- Ускоренное слияние
- Рекурсивное слияние
Ситуация слияния 1: Ускоренное слияние
Когда есть прямой путь между двумя фиксациями в двух ветках (которые мы хотели бы объединить), мы можем выполнить быстрое слияние.
Допустим, у нас есть ветка под названием Спринтер и ветка под названием Марафонец. Допустим, "Спринтер" составляет 3 км (т. е. 3 фиксации) впереди ветви "Марафонец" и "Марафонец" должен догнать "Спринтер", т.е. нужно сделать слияние.
Если они оба работают на одной и той же дорожке, то есть если между двумя ветвями есть прямой путь, мы можем выполнить быстрое слияние вперед. В этом случае ветка «Марафонец» (как мы знаем, ветка — это просто указатель) просто переместится, чтобы указать на последний коммит в ветке «Спринтер».
Давайте разберемся на примере:
Когда есть прямой путь?
Когда 2-я ветвь создается из 1-й ветки, а 2-я ветвь находится на «n» впереди, говорят, что существует прямой путь.
Как сделать быстрое слияние вперед сейчас?
Проверьте ветку, которая отстает в коммитах.
git checkout Marathon_Runner
Теперь вы можете выполнить операцию «Объединить».
git merge Sprinter
приведет к
«Fast-Forward» здесь указывает тип выполненного слияния. После слияния график выглядит так
Ситуация слияния 2: рекурсивное или трехстороннее слияние
Когда прямого пути нет, git просматривает 3 коммита, чтобы выполнить операцию слияния.
- Коммит, из которого произошли две ветки
- Последний коммит ветки1
- Последний коммит ветки 2
Если вы хотите объединить master и Sprinter-Marathon_Runner, прямого пути нет. Здесь нам нужно сделать 3-стороннее слияние.
Что произойдет, если мы попытаемся выполнить слияние, используя стратегию Fast Forward Merge?
Помните, мы объединились, используя следующие 2 команды в Fast Forward Merge?
git checkout master git merge Sprinter
Запустим и проверим, что происходит
Как вы можете видеть на графике, я пытаюсь объединить основную ветку (с сообщением фиксации «рекурсивное слияние») со Sprinter (где сообщение фиксации «спринтер пробежал 3 км»), но она не объединяется. В нем говорится, что существует КОНФЛИКТ СЛИЯНИЯ, и мой файл readme.md меняется на что-то вроде этого
Давайте разберемся, что только что произошло (Конфликт слияния)
Конфликт слияния возникает, когда у вас есть разные версии одного и того же файла в разных ветках. В этом случае git не может решить, какое изменение принять.
Давайте посмотрим, как избавиться от знаков.
- ‹‹‹‹‹‹‹‹ HEAD обозначает «голову» ветки1
- ========= Знак равенства разделяет состояние файла на 2 ветки
- ›››››››› Sprinter обозначает филиал Sprinter, т. е. наш филиал2.
что означает, что в ветке 1 (HEAD) файл readme.md читается
Гонка началась снова, но марафонец бежит по неверному пути и должен компенсировать это.
а в ветке2(Sprinter) файл readme.md читается
Марафонец пробежал 1 км
Марафонец пробежал 2 км
Спринтер пробежал 1 км
Спринтер пробежал 3 км
Допустим, я решил принять изменения, сделанные в ветке 1. В этом случае я удалю маркеры git (равно и стрелки) и текст, который я не хочу принимать. Итак, мой файл readme.md будет выглядеть примерно так:
Теперь внесите изменения и зафиксируйте
git add readme.md git commit
После объединения это выглядит так
Это обертка! Следите за следующей частью.
В следующей части мы поговорим об «Удаленном» и других важных понятиях, которые вам понадобятся в вашей профессиональной жизни.