Git не работает таким образом. В Git ветка - это просто указатель, указывающий на последний коммит в серии. Когда вы находитесь в этой ветке и делаете новый коммит, указатель перемещается к новому коммиту.
Из-за этого, когда вы создаете новую ветку из существующей ветви, у вас теперь просто есть два указателя на один и тот же коммит. Обе ветви имеют одинаковую историю.
Сценарий, о котором вы говорите, будет выглядеть в Git следующим образом:
A
↓
a1 ← a2 ← a3 B
↖ ↓
a4 C
↖ ↓
a5
В Git у вас просто есть серия коммитов, но некоторые из них имеют метки веток, указывающие на них. A указывает на a3 (который знает, что a2 является его родителем); B указывает на a4, который имеет a3 в качестве родителя, и так далее. Таким образом, по умолчанию, если вы слили C в A, Git произвел бы «ускоренную пересылку» слияния (что означает, что у A нет изменений), и вы получите это:
B A, C
↓ ↓
a1 ← a2 ← a3 ← a4 ← a5
Теперь вы можете избавиться от изменений B, если хотите. Одним из способов является интерактивная перебазировка:
git rebase -i
Здесь показан список коммитов, и вы просто удаляете коммит B из этого списка. Git воспроизводит ваши коммиты без этого. Другой способ - начать с A, затем использовать
git cherry-pick a5
, чтобы поместить изменения a5 в качестве следующего набора изменений после a3. Но обе эти вещи должны быть особенными. По умолчанию B будет включен в слияние.