Я хотел бы полностью опорожнить главную ветвь в Git. На данный момент я также хотел бы сохранить все другие ветки, которые были разветвлены от мастера.
Возможно ли это и как?
Я хотел бы полностью опорожнить главную ветвь в Git. На данный момент я также хотел бы сохранить все другие ветки, которые были разветвлены от мастера.
Возможно ли это и как?
Это фактически называется "удалять старые ветки мастера и создавать новые с нуля"
Это создаст новую главную ветвь, указывающую на начальную фиксацию:
git branch -D master
git checkout -b master <initial commit hash>
Это создаст совершенно новую ведущую ветвь, не связанную с тем, что у вас было:
git branch -D master
git checkout --orphan master
git rm -rf *
Но на самом деле вы можете просто сохранить текущий репозиторий в другое место и создать вместо него новый репозиторий.
Сначала вам нужно переместить или удалить текущую главную ветвь. Лично я предпочитаю отодвигать его в сторону, а не удалять его. После этого вы просто создаете новую ветку без родителей, используя флаг --orphan
. Например:
git branch -m master old_master
git checkout --orphan master
Так как текущая ветвь теперь не имеет истории, некоторые команды могут терпеть неудачу с ошибками, такими как fatal: bad default revision 'HEAD'
, пока вы не сделаете свой первый фиксаж на новой главной ветке. Это нормально, и это то же поведение, которое вы видите в свеже инициализированных репозиториях.
Вот что-то, что, вероятно, плохое, но работает в пробке (на вершине решения арагара)
git branch -D master
git checkout --orphan master
git rm -rf *
После этого, чтобы отправить PR в эту ветку из ветки разработки, которая в настоящее время обрабатывается без проблем, выполните
git checkout development-branch-name
git rebase master
git push -f development-branch-name
Теперь вы можете отправить PR из development-branch-name
в master
, не запуская в проблему There isn't anything to compare. Nothing to compare, branches are entirely different commit histories
на GitHub.
Я использую это при инициализации репо в текущей директории проекта проекта и хочу, чтобы проверка кода выполнялась через интерфейс GitHub по всему коду в каталоге проекта.
Вы можете попытаться выполнить reset основную ветвь до первой фиксации с помощью git checkout master; git reset --hard ${sha-of-first-commit}
, а затем изменить это первое фиксацию, чтобы удалить файл s в нем.
Это должно дать вам девственную ветвь мастера и оставить всех остальных нетронутыми, но поскольку вы переписываете историю, все репозитории, которые клонировали ваши, должны быть исправлены.
как насчет проверки в основной ветке вашего локального репозитория и удалить все. затем нажмите эту ветвь на удаленную ветвь (начало)
Удалить u удалить содержимое главной ветки или самой ветки?
Другие ответы предлагают создать новую ветку master (как это было бы в пустом хранилище). Но иметь мастера без истории не очень хорошая практика. Это затрудняет использование перебазирования, поскольку вы никогда не сможете перебазировать первый коммит. Первый коммит master в любом репозитории должен быть пустым. Для этого есть низкоуровневое решение:
Сначала вы получаете пустой хеш дерева:
$ git hash-object -t tree /dev/null
4b825dc642cb6eb9a060e54bf8d69288fbee4904
Затем вы используете хэш дерева, чтобы создать пустой коммит
$ git commit-tree -m "inital commit" 4b825dc642cb6eb9a060e54bf8d69288fbee4904
a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22
И, наконец, вы сбрасываете мастер на этот коммит
$ git reset --hard a5c0737b92e5e5d4502e15b93d7a46d1e17b2b22