Создание удаленной ветки без (предыдущей) локальной истории - PullRequest
1 голос
/ 21 апреля 2020

У меня есть локальная ветвь на моем компьютере, но я хотел бы создать новую ветвь без истории вообще (сначала только один коммит) и использовать эту новую ветку на удаленной стороне. Как я могу это сделать?

Например, локальная ветвь имеет:

commit1 , commit2 , commit3

Но я хочу, чтобы моя новая ветвь имела только commit0 , то есть код последнего состояния ( commit3 ) без предыдущей истории. Затем я sh смогу легко объединить вещи, например, если я сделаю commit4 в своей локальной ветке, я sh получу только commit0 и commit4 Изменения в удаленной ветке.

Как лучше всего добиться этого? Я хочу в основном «сжать» материал в удаленной ветке и не обязательно стирать историю в моей локальной, чтобы иметь возможность работать с локальной.

1 Ответ

2 голосов
/ 21 апреля 2020

Я хочу, чтобы моя новая ветвь имела только 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 подграф является непересекающимся подграфом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...