Привет! Рад, что вам интересно узнать, что заставляет git работать, а не просто запомнить команды и функции.

Один из ключевых выводов из этой серии заключается в том, что команды будут иметь для вас большое значение, и вы будете чувствовать себя уверенно в любом проекте, частью которого будете.

Сказав это, давайте продолжим и посмотрим, что нас ждет сегодня. 😋

Содержание

  1. Означает ли ветвь расхождение?
  2. Зачем нам вообще нужен филиал?
  3. Как реализовать ветку?
  4. Давайте пить бирьяни вместе?
  5. Что такое «Объединить»?
  6. Ситуация слияния 1: Ускоренное слияние
  7. Ситуация слияния 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. Ускоренное слияние
  2. Рекурсивное слияние

Ситуация слияния 1: Ускоренное слияние

Когда есть прямой путь между двумя фиксациями в двух ветках (которые мы хотели бы объединить), мы можем выполнить быстрое слияние.

Допустим, у нас есть ветка под названием Спринтер и ветка под названием Марафонец. Допустим, "Спринтер" составляет 3 км (т. е. 3 фиксации) впереди ветви "Марафонец" и "Марафонец" должен догнать "Спринтер", т.е. нужно сделать слияние.

Если они оба работают на одной и той же дорожке, то есть если между двумя ветвями есть прямой путь, мы можем выполнить быстрое слияние вперед. В этом случае ветка «Марафонец» (как мы знаем, ветка — это просто указатель) просто переместится, чтобы указать на последний коммит в ветке «Спринтер».

Давайте разберемся на примере:

Когда есть прямой путь?

Когда 2-я ветвь создается из 1-й ветки, а 2-я ветвь находится на «n» впереди, говорят, что существует прямой путь.

Как сделать быстрое слияние вперед сейчас?

Проверьте ветку, которая отстает в коммитах.

git checkout Marathon_Runner

Теперь вы можете выполнить операцию «Объединить».

git merge Sprinter

приведет к

«Fast-Forward» здесь указывает тип выполненного слияния. После слияния график выглядит так

Ситуация слияния 2: рекурсивное или трехстороннее слияние

Когда прямого пути нет, git просматривает 3 коммита, чтобы выполнить операцию слияния.

  1. Коммит, из которого произошли две ветки
  2. Последний коммит ветки1
  3. Последний коммит ветки 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

После объединения это выглядит так

Это обертка! Следите за следующей частью.

В следующей части мы поговорим об «Удаленном» и других важных понятиях, которые вам понадобятся в вашей профессиональной жизни.