Я хотел бы определить новую «корневую» ветку в этом репозитории git. Под «корневой» веткой я подразумеваю ветвь, которая полностью независима от всех других ветвей в репозитории 1 .
К сожалению, даже коммит (назовем его A
) в самом основании дерева коммитов репо содержит множество файлов (это был репозиторий, который был инициализирован в уже достаточно зрелом проекте).
Это означает, что даже если бы я дал A
новую ветку <start-point>
, эта новая ветка не начиналась бы с «чистого листа», а скорее содержала бы все файлы, которые были зафиксированы A
.
Есть ли способ создать полностью голую ветку в этом репозитории, <start-point>
максимально приближенную к ней A
?
1 BTW, это не эквивалентно созданию нового репо. Отдельные репозитории менее удобны по многим причинам.
РЕДАКТИРОВАТЬ : ОК, это то, что я сделал, основываясь на ответе vcsjones :
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
Хотя эта процедура немного сложна, конечный результат - пустая базовая фиксация, которая может служить в качестве <start-point>
новой для любой новой «ветки с чистого листа»; все, что мне нужно сделать, это
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
В будущем я всегда буду создавать такие новые репозитории:
git init
git commit --allow-empty -m 'base commit (empty)'
... так что первая фиксация пуста и всегда доступна для запуска новой независимой ветки. (Я знаю, что это может быть очень редко необходимое средство, но сделать его легко доступным.)
git rebase --onto
, см stackoverflow.com/questions/645450/...Ответы:
Используйте
--orphan
при создании ветки:Это создаст новую ветку с нулевым количеством коммитов, однако все ваши файлы будут поставлены. На этом этапе вы можете просто удалить их.
(«удалить их»: A
git reset --hard
очистит индекс, оставив вам пустое рабочее дерево)Взгляните на страницу руководства для получения дополнительной информации о --orphan.
источник
Чтобы добавить к принятому ответу - лучшая практика для возврата к чистому состоянию - это создать начальную пустую фиксацию, чтобы вы могли легко перебазировать при настройке своих веток для потомков. Кроме того, поскольку вам нужно чистое состояние, у вас, вероятно, есть зафиксированные файлы, которые вам не следует, поэтому вам нужно удалить их из индекса. Имея это в виду, вам следует:
источник
Если вы используете Git 2.23 или выше , вы можете использовать , чтобы
git switch
иgit restore
вместоgit checkout
. Если да, то флаг такой же, как указано в этом ответе .источник
Фактическая команда, которую нужно использовать (с Git 2.28+):
git switch
доступен с Git 2.23 (август 2019 г.) и заменяет старую запутаннуюgit checkout
команду .Но я бы порекомендовал Git 2.28 (Q3 2020), потому что
git switch --discard-changes --orphan
он был оптимизирован в этой версии.См. Commit 8d3e33d , commit 8186128 (21 мая 2020 г.) Брайан М. Карлсон (
bk2204
) .(Объединено Junio C Hamano -
gitster
- в коммите ded44af , 9 июня 2020 г.)Тест:
источник