Я хочу, чтобы моя новая ветвь имела только commit0, который является кодом последнего состояния (commit3), без предыдущей истории.
Вы можете получить это довольно легко:
git checkout commit3 # get index and work-tree set up
git status # make sure you're on commit3 and things are otherwise clean
затем:
git checkout --orphan new-branch
git commit
и у вас есть этот новый commit0
в новой ветке, без истории: commit0
- это новый root коммит .
Затем я легко объединю вещи, например, если я выполняю commit4 в своей локальной ветке, я sh хочу иметь только изменения commit0 и commit4 в удаленной ветви. .
Вы не можете получить это вообще. Вы можете настроить все так, чтобы у вас был commit0, а затем commit5, где снимок commit5 совпадает со снимком commit4 и имеет commit0 в качестве родителя. Но commit4 - коммит с , который ha sh ID - имеет commit3 в качестве родителя навсегда. Ха sh идентификаторы являются универсальными для всех Git репозиториев, и ни одна часть какого-либо коммита не может быть изменена, включая родительскую связь.
Важно понимать, что слово ветвь в Git неоднозначна: см. Что именно мы подразумеваем под «ветвью»? Иногда ветвь означает цепочку коммитов, оканчивающихся на один конкретный c коммит . Иногда это означает название филиала . Все репозитории Git имеют свои собственные имена частных веток, поэтому нет никакой причины, что master
в репозитории Git, доступном по URL $url1
, должен называть тот же коммит, что и master
в репозитории Git в $url2
имена.
Истории, однако, являются коммитами. Слияние произведений с использованием истории. Если две цепочки коммитов не соединяются, объединять нечего.
Git действительно позволяет создавать собственные решения: это набор инструментов, а не решение само по себе. Вы можете написать свои собственные Git команды, которые позволят вам добавить новый снимок к названию ветки по вашему выбору, без использования каких-либо существующих коммитов в ваших реальных рабочих ветвях. Это может позволить вам создать нужное устройство:
git my-private-copy-to new-branch <commit-specifier>
запустит вашу команду git-my-private-copy-to
, которая добавит новый коммит с использованием дерева (из аргумента 2) в указанную ветку (аргумент 1). Обратите внимание, что в представленной мной команде, которая не существует, а будет просто небольшой сценарий оболочки, слияние не используется.
Поскольку команда не существует, и вы должны напишите это, если вы хотите слияния, вы можете поместить это в команду, которую вы пишете, но стандартное слияние использует и добавляет историю, записанную в графе фиксации или подграфе, и вы сознательно убедились, что ваша основная работа и этот new-branch
подграф является непересекающимся подграфом.