Me gustaría definir una nueva rama "raíz" en este repositorio de git. Por rama "raíz" me refiero a una rama que es completamente independiente de todas las otras ramas en el repositorio 1 .
Desafortunadamente, incluso el commit (llamémoslo A
) en la base del árbol de commit del repositorio contiene muchos archivos (este fue un repositorio que se inicializó en un proyecto ya bastante maduro).
Esto significa que incluso si di A
como la nueva rama <start-point>
, esta nueva rama no comenzaría desde una "pizarra limpia", sino que contendría todos los archivos que se confirmaron A
.
¿Hay alguna forma de que pueda crear una rama completamente desnuda en este repositorio, con la <start-point>
mayor precisión A
posible?
1 Por cierto, esto no es equivalente a crear un nuevo repositorio. Los repositorios separados serían menos convenientes por muchas razones.
EDITAR : OK, esto es lo que hice, basado en la respuesta de 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
Aunque este procedimiento es un poco complicado, el resultado final es una confirmación de base vacía que puede servir <start-point>
para cualquier nueva "rama de pizarra limpia"; todo lo que necesito hacer es
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
En el futuro siempre crearé nuevos repositorios como este:
git init
git commit --allow-empty -m 'base commit (empty)'
... para que la primera confirmación esté vacía y siempre disponible para iniciar una nueva rama independiente. (Esta sería, lo sé, una instalación que rara vez se necesita, pero es bastante fácil ponerla a disposición).
git rebase --onto
, consulte stackoverflow.com/questions/645450/…Respuestas:
Use el
--orphan
al crear la rama:Esto creará una nueva rama con cero confirmaciones, sin embargo, todos sus archivos serán organizados. En ese punto, simplemente podría eliminarlos.
("eliminarlos": A
git reset --hard
vaciará el índice, dejándolo con un árbol de trabajo vacío)Eche un vistazo a la página de manual para finalizar la compra para obtener más información sobre --orphan.
fuente
Para agregar a la respuesta aceptada, la mejor práctica para volver al estado limpio es crear una confirmación vacía inicial para que pueda volver a redactar fácilmente mientras configura sus ramas para la posteridad. Además, dado que desea un estado limpio, probablemente haya confirmado archivos que no debería, por lo que debe eliminarlos del índice. Con los que tienes en mente deberías:
fuente
Si usa git 2.23 o superior, puede estar acostumbrado
git switch
y engit restore
lugar degit checkout
. Si es así, la bandera es la misma que se menciona en esta respuesta .fuente
El comando real para usar (con Git 2.28+) es:
git switch
está disponible en Git 2.23 (agosto de 2019) y reemplaza el antiguogit checkout
comando confuso .Pero recomendaría Git 2.28 (Q3 2020), porque
git switch --discard-changes --orphan
se ha optimizado en esa versión.Ver commit 8d3e33d , commit 8186128 (21 de mayo de 2020) por brian m. carlson (
bk2204
) .(Fusionada por Junio C Hamano -
gitster
- en commit ded44af , 09 jun 2020)Prueba:
fuente