Eu gostaria de definir um novo ramo "raiz" neste repositório git. Por ramo "raiz", quero dizer um ramo que é totalmente independente de todos os outros ramos no repositório 1 .
Infelizmente, mesmo o commit (vamos chamá-lo A
) na base da árvore de commit do repositório contém muitos arquivos (este foi um repositório que foi inicializado em um projeto já bastante maduro).
Isso significa que, mesmo que eu A
desse como o novo ramo <start-point>
, esse novo ramo não seria iniciado a partir de uma "lista limpa", mas conteria todos os arquivos que foram confirmados A
.
Existe alguma maneira de criar uma ramificação completamente vazia neste repositório, o <start-point>
mais próximo A
possível?
1 BTW, isso não é equivalente a criar um novo repositório. Os repositórios separados seriam menos convenientes por várias razões.
EDIT : OK, foi o que fiz, com base na resposta do 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
Embora esse procedimento esteja um pouco envolvido, o resultado final é uma confirmação de base vazia que pode servir como <start-point>
para qualquer nova "ramificação limpa"; tudo o que eu preciso fazer então é
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
No futuro, sempre criarei novos repositórios como este:
git init
git commit --allow-empty -m 'base commit (empty)'
... para que o primeiro commit esteja vazio e sempre disponível para iniciar uma nova ramificação independente. (Sei que seria uma instalação muito raramente necessária, mas é muito fácil torná-la disponível.)
git rebase --onto
, veja stackoverflow.com/questions/645450/…Respostas:
Use
--orphan
ao criar a ramificação:Isso criará uma nova ramificação com zero confirmações, no entanto, todos os seus arquivos serão testados. Nesse ponto, você pode apenas removê-los.
("remova-os": A
git reset --hard
esvaziará o índice, deixando você com uma árvore de trabalho vazia)Dê uma olhada na página de manual do checkout para obter mais informações sobre --orphan.
fonte
Para adicionar à resposta aceita - a melhor prática para reverter para o estado limpo é criar um commit vazio inicial, para que você possa refazer facilmente enquanto configura suas ramificações para a posteridade. Além disso, como você deseja um estado limpo, é provável que você tenha confirmado arquivos que não deveria, então você deve removê-los do índice. Com isso em mente, você deve:
fonte
Se você usa o git 2.23 ou superior, pode estar acostumado
git switch
egit restore
ao invés degit checkout
. Nesse caso, o sinalizador é o mesmo que mencionado nesta resposta .fonte
O comando real a ser usado (com o Git 2.28+) é:
git switch
está disponível no Git 2.23 (agosto de 2019) e substitui o antigogit checkout
comando confuso .Mas eu recomendaria o Git 2.28 (terceiro trimestre de 2020), porque
git switch --discard-changes --orphan
foi otimizado nessa versão.Consulte commit 8d3e33d , commit 8186128 (21 de maio de 2020) por brian m. Carlson (
bk2204
) .(Mesclado por Junio C Hamano -
gitster
- em commit ded44af , 09 jun 2020)Teste:
fonte