Mientras ayudaba a un amigo con un problema de git hoy, tuve que introducir una rama que necesitaba estar totalmente separada de la master
rama. El contenido de esta rama realmente tenía un origen diferente del que se había desarrollado en la master
rama, pero iban a fusionarse en la master
rama más adelante.
Recordé al leer Git de John Wiegley de abajo hacia arriba cómo las ramas son esencialmente una etiqueta para una confirmación que sigue una determinada convención y cómo una confirmación está vinculada a un árbol de archivos y, opcionalmente, a las confirmaciones principales. Fuimos a crear una confirmación sin padres para el repositorio existente usando la fontanería de git:
Así que nos deshicimos de todos los archivos en el índice ...
$ git rm -rf .
... extrajo directorios y archivos de un tarball, los agregó al índice ...
$ git add .
... y creó un objeto de árbol ...
$ git write-tree
( git-write-tree
nos contó el sha1sum del objeto de árbol creado).
Luego, confirmamos el árbol, sin especificar las confirmaciones principales ...
$ echo "Imported project foo" | git commit-tree $TREE
( git-commit-tree
nos dijo el sha1sum del objeto commit creado).
... y creó una nueva rama que apunta a nuestro commit recién creado.
$ git update-ref refs/heads/other-branch $COMMIT
Finalmente, volvimos a la master
sucursal para continuar trabajando allí.
$ git checkout -f master
Esto parece haber funcionado según lo planeado. Pero claramente este no es el tipo de procedimiento que recomendaría a alguien que recién comienza a usar git, por decirlo suavemente. ¿Existe una manera más fácil de crear una nueva rama que no esté relacionada con todo lo que ha sucedido en el repositorio hasta ahora?
( git checkout master && git merge --no-commit "orphan-branch" )
Algunos trucos similares funcionarán usando git-reset o jugando con el índice. Pero depende de su flujo de trabajo deseado.--no-commit
ongit merge
logrará esto. Es posible que deba realizar un seguimientogit reset origin/master
para que su próxima confirmación vaya donde lo desee, pero luego los archivos de su rama huérfana se mostrarán como "archivos no rastreados" a menos que también los incluya en su archivo .gitignore.Del libro de la comunidad de Git :
fuente
rm .git/index
es feo :-)Aunque la solución con
git symbolic-ref
y eliminando el índice funciona, podría ser conceptualmente más limpio crear un nuevo repositorioluego ir a buscarlo
Ahora puede eliminar / ruta / a / no relacionado
fuente
git branch
ogit checkout
. Me alegra que git haga posible este tipo de cosas, pero ¿por qué no debería ser más fácil?git branch
y cambiar entre ellas a través degit checkout BRANCH_NAME
.Github tiene una característica llamada Páginas del proyecto donde puede crear una rama con nombre en particular en su proyecto para proporcionar archivos que serán atendidos por Github. Sus instrucciones son las siguientes:
Desde allí, tiene un repositorio vacío al que puede agregar su nuevo contenido.
fuente
La respuesta seleccionada actualmente es correcta, solo agregaría eso por coincidencia ...
Así es exactamente cómo github.com permite a los usuarios crear páginas de Github para sus repositorios, a través de una rama huérfana llamada
gh-pages
. Los bonitos pasos se dan y explican aquí:https://help.github.com/articles/creating-project-pages-manually
Básicamente, los comandos de git para configurar esto son los siguientes:
git checkout --orphan gh-pages
(cree una rama sin padres llamada gh-pages en su repositorio)git rm -rf .
(elimina cualquier archivo del árbol de trabajo de la rama)rm '.gitignore'
(incluso el gitignore)Tenga en cuenta que también puede designar una carpeta / docs en su repositorio para que sea la fuente del "Sitio del proyecto" que Github usa para construir el sitio web.
¡Espero que esto ayude!
fuente
A veces solo quiero crear una rama vacía en el proyecto al instante y luego comenzar a trabajar, simplemente ejecutaré el siguiente comando:
fuente
Si su contenido existente ya estaba comprometido, ahora (Git 2.18 Q2 2018) puede extraerlo en su propia nueva rama huérfana, ya que la implementación de "
git rebase -i --root
" se ha actualizado para usar más la maquinaria del secuenciador.Ese secuenciador es el que ahora permite trasplantar la topología completa del gráfico de confirmación en otro lugar .
Ver commit 8fa6eea , commit 9c85a1c , commit ebddf39 , commit 21d0764 , commit d87d48b , commit ba97aea (03 de mayo de 2018) por Johannes Schindelin (
dscho
) .(Fusionada por Junio C Hamano -
gitster
- en commit c5aa4bc , 30 de mayo de 2018)fuente
¡Encontré este script en http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches y funciona muy bien!
fuente
git fetch $REMOTE $REMOTE_BRANCH:$LOCAL_BRANCH
. ¿Me estoy perdiendo de algo?En versiones recientes de Git, 2.27 al menos, esto se puede lograr con el
switch
comando:Documentación oficial: https://www.git-scm.com/docs/git-switch
fuente