Как правильно мержить ветки в git?
Зачем разные части одного проекта помещать в отдельные ветки? Кажется, у вас неправильное представление смысла веток, которые используется в Git'е. Ветка в этой DCVS -- это всего лишь указатель на состояние рабочего каталога. И реализовать Work Flow, описанный вами на ветках Git'а не то чтобы сложновато, но зачем и для чего мучить бедный Git, который при каждом git checkout
будет вам разворачивать поддерево то одного проекта в ваш рабочий каталог, то другого. Это во-первых, жутко неоптимально с точки зрения той же производительности, а во-вторых вы так совсем запутаетесь, тем более раз вы ещё включили в рабочий процесс слияния между этими ветками. Конфликтов слияния и трудностей таким образом можно достигнуть множество. Пожалуйста, обратите внимание на работающие подходы, используемые для разработки с использованием Git:
Если в ваших частях проекта выражена очень разная функциональность, то можно создать два отдельных репозитория (к примеру, fronted и backend), а затем, при необходимости, соединить их в один Git-суперрепозиторий в качестве его подмодулей.
Если одна часть -- зависимость от другой, то следует подключить эту зависимость submodule'ем или вообще поддеревом (см. главу 6.7. из книги Скотта Чакона - Pro Git).
Если это всё же монолитный проект, имеющий две части, например, первая часть содержит реализацию логики приложения в "./src/core", а вторая -- пользовательский интерфейс в "./src/ui", то их и вовсе не нужно разделять.
Снова вы :)
Запомните - единица, с которой работает git - это коммит. Любое изменение в репозитории либо закомиченно, либо висит в активных изменениях. Поэтому git не мог удалить у вас файл, не сделав коммит :) Поищите по истории в каком из коммитов (в том числе и merge-коммитах) он мог удалиться.
А вообще вы явно что-то путаете, потому что checkout приводит вашу рабочую папку в состояние этой ветки, поэтому как вы могли понять что файл удалился из ветки test1, когда находитесь в ветке development - непонятно. После git co dev && git merge test1 сделайте git co test1 и скажите что происходит.
Да, и merge не удаляет изменения, а просто применяет все коммиты из одной ветки в другую.