Задать вопрос

Как правильно мержить ветки в git?

Напоролся на такую ситуация, у меня есть проект к примеру он состоит из 2 частей. Я создал 3 ветки, в результате получилось так:
test1- для примера эта ветка работает с 1 частью
test2 - а эта ветка работает со 2 частью приложения
development - это общая ветка, в которую мы мерджим все изменения и устраняем конфликты
master - основная ветка.

Теперь ситуация, к примеру я работаю с веткой test1 вношу изменения, добавляю фитчи и тп. Потом так же делаю с веткой test2. Вот настало время когда мне нужно обновить проект. Я хочу слить ветку test1 и test2 в ветку development , убедиться, что все действительно работает и обновить мастер.

Когда я сделал это, я наткнулся на ряд неприятных моментов с которыми не смог разобраться. Итак конкретный пример:
- в test1 я создал файл index.php
- дальше я перешел (git checkout development) в ветку разработки
- и попытался смержить: git merge test1

Теперь этот подлый index.php пропал из test1 и появился в development. Это так и должно быть?
Теперь я хочу продолжить разработку в test1, а у меня нет моего inde.php что делать?

Объясните пожалуйста как правильно мерджить ветки. Вот это дело вычитал в доках, но не понял почему так вышло.
  • Вопрос задан
  • 20133 просмотра
Подписаться 6 Оценить Комментировать
Решения вопроса 2
EXL
@EXL
Энтузиаст
Зачем разные части одного проекта помещать в отдельные ветки? Кажется, у вас неправильное представление смысла веток, которые используется в Git'е. Ветка в этой DCVS -- это всего лишь указатель на состояние рабочего каталога. И реализовать Work Flow, описанный вами на ветках Git'а не то чтобы сложновато, но зачем и для чего мучить бедный Git, который при каждом

git checkout
будет вам разворачивать поддерево то одного проекта в ваш рабочий каталог, то другого. Это во-первых, жутко неоптимально с точки зрения той же производительности, а во-вторых вы так совсем запутаетесь, тем более раз вы ещё включили в рабочий процесс слияния между этими ветками. Конфликтов слияния и трудностей таким образом можно достигнуть множество. Пожалуйста, обратите внимание на работающие подходы, используемые для разработки с использованием Git:

Если в ваших частях проекта выражена очень разная функциональность, то можно создать два отдельных репозитория (к примеру, fronted и backend), а затем, при необходимости, соединить их в один Git-суперрепозиторий в качестве его подмодулей.

Если одна часть -- зависимость от другой, то следует подключить эту зависимость submodule'ем или вообще поддеревом (см. главу 6.7. из книги Скотта Чакона - Pro Git).

Если это всё же монолитный проект, имеющий две части, например, первая часть содержит реализацию логики приложения в "./src/core", а вторая -- пользовательский интерфейс в "./src/ui", то их и вовсе не нужно разделять.
Ответ написан
Комментировать
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Снова вы :)
Запомните - единица, с которой работает git - это коммит. Любое изменение в репозитории либо закомиченно, либо висит в активных изменениях. Поэтому git не мог удалить у вас файл, не сделав коммит :) Поищите по истории в каком из коммитов (в том числе и merge-коммитах) он мог удалиться.

А вообще вы явно что-то путаете, потому что checkout приводит вашу рабочую папку в состояние этой ветки, поэтому как вы могли понять что файл удалился из ветки test1, когда находитесь в ветке development - непонятно. После git co dev && git merge test1 сделайте git co test1 и скажите что происходит.

Да, и merge не удаляет изменения, а просто применяет все коммиты из одной ветки в другую.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы