ver tag remota rama modificados example crear cambiar archivos git branch

tag - En git, ¿hay una forma sencilla de introducir una rama no relacionada a un repositorio?



git push tag (8)

Mientras ayudaba a un amigo con un problema de git hoy, tuve que presentar una rama que necesitaba estar totalmente separada de la rama master . El contenido de esta rama realmente tenía un origen diferente del que se había desarrollado en la rama master , pero se iban a fusionar en la rama master más adelante.

Recordé al leer el Git de John Wiegley de abajo hacia arriba cómo las ramas son esencialmente una etiqueta para un compromiso que sigue una convención determinada y cómo un compromiso se ata a un árbol de archivos y, opcionalmente, a los compromisos principales. Fuimos a crear un compromiso sin padres para el repositorio existente utilizando la plomería de git:

Así que nos deshicimos de todos los archivos en el índice ...

$ git rm -rf .

... extrajo directorios y archivos de un archivo comprimido, los agregó al índice ...

$ git add .

... y creó un objeto de árbol ...

$ git write-tree

( git-write-tree nos dijo la suma del objeto de árbol creado.)

Entonces, cometimos el árbol, sin especificar los compromisos de los padres ...

$ echo "Imported project foo" | git commit-tree $TREE

( git-commit-tree nos dijo la suma del objeto de confirmación creado).

... y creó una nueva rama que apunta a nuestro compromiso recién creado.

$ git update-ref refs/heads/other-branch $COMMIT

Finalmente, volvimos a la rama master para continuar trabajando allí.

$ git checkout -f master

Esto parece haber funcionado como estaba previsto. Pero claramente este no es el tipo de procedimiento que recomendaría a alguien que recién está comenzando a usar git, por decirlo suavemente. ¿Existe una forma más fácil de crear una nueva rama que no tenga ninguna relación con todo lo que ha sucedido en el repositorio hasta ahora?


A veces, solo quiero crear una rama vacía en el proyecto al instante y luego comenzar a trabajar, simplemente ejecuto el siguiente comando:

git checkout --orphan unrelated.branch.name git rm --cached -r . echo "init unrelated branch" > README.md git add README.md git commit -m "init unrelated branch"


Aunque la solución con git symbolic-ref y la eliminación del índice funciona, podría ser conceptualmente más limpio para crear un nuevo repositorio

$ cd /path/to/unrelated $ git init [edit and add files] $ git add . $ git commit -m "Initial commit of unrelated" [master (root-commit) 2a665f6] Initial commit of unrelated 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo

luego buscarlo

$ cd /path/to/repo $ git fetch /path/to/unrelated master:unrelated-branch warning: no common commits remote: Counting objects: 3, done. Unpacking objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) From /path/to/unrelated * [new branch] master -> unrelated-branch

Ahora puedes borrar / ruta / a / no relacionado


De Git Community Book :

git symbolic-ref HEAD refs/heads/newbranch rm .git/index git clean -fdx <do work> git add your files git commit -m ''Initial commit''


Encontré este guión en http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches y funciona muy bien!

#!/bin/bash set -e if test -z "$2" -o -n "$3"; then echo "usage: $0 REPO BRANCHNAME" >&2 exit 1 fi repo=$1 branch=$2 git fetch "$repo" "$branch" head=$(git rev-parse HEAD) fetched=$(git rev-parse FETCH_HEAD) headref=$(git rev-parse --symbolic-full-name HEAD) git checkout $fetched . tree=$(git write-tree) newhead=$(echo "merged in branch ''$branch'' from $repo" | git commit-tree $tree -p $head -p $fetched) git update-ref $headref $newhead $head git reset --hard $headref


Hay una nueva característica (desde V1.7.2) que hace que esta tarea sea un poco más de alto nivel que en cualquier otra respuesta.

git checkout ahora soporta la opción --orphan . De la página del manual :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

Cree una nueva rama huérfana , llamada <new_branch>, iniciada desde <start_point> y cámbiela. El primer compromiso realizado en esta nueva sucursal no tendrá padres y será la raíz de una nueva historia totalmente desconectada de todas las demás sucursales y confirmaciones.

Esto no hace exactamente lo que quería el autor de la pregunta, ya que llena el índice y el árbol de trabajo desde <start_point> (ya que esto es, después de todo, un comando de pago). La única otra acción necesaria es eliminar los elementos no deseados del árbol de trabajo y el índice. Desafortunadamente, git reset --hard no funciona, pero git rm -rf . se puede usar en su lugar (creo que esto es equivalente a rm .git/index; git clean -fdx dado en otras respuestas).

En resumen:

git checkout --orphan newbranch git rm -rf . <do work> git add your files git commit -m ''Initial commit''

Dejé <start_point> especificar porque su valor predeterminado es HEAD, y de todos modos no nos importa. Esta secuencia hace esencialmente lo mismo que la secuencia de comandos en la respuesta de Artem , solo sin recurrir a comandos de plomería de miedo.


La respuesta seleccionada actualmente es correcta, solo agregaría que casualmente ...

De hecho, esto 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 pasos bonitos se dan y explican aquí:

https://help.github.com/articles/creating-project-pages-manually

Básicamente, los comandos git para configurar esto son los siguientes:

  1. git checkout --orphan gh-pages (crea una rama sin padres llamada gh-pages en tu repositorio)
  2. git rm -rf . (elimina cualquier archivo del árbol de trabajo de la rama)
  3. rm ''.gitignore'' (incluso el gitignore)
  4. Ahora agregue el contenido del sitio web (agregue index.html, etc.) y confirme y presione.
  5. Lucro.

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!


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 compromiso en otro lugar .

Consulte commit 8fa6eea , commit 9c85a1c , commit ebddf39 , commit 21d0764 , commit d87d48b , commit ba97aea (03 de mayo de 2018) de Johannes Schindelin ( dscho ) .
(Combinado por Junio ​​C Hamano - gitster - in commit c5aa4bc , 30 de mayo de 2018)

secuenciador: permite introducir nuevas confirmaciones de root

En el contexto del nuevo modo --rebase-merges , que fue diseñado específicamente para permitir el cambio de la topología de la rama existente de manera liberal, el usuario puede querer extraer confirmaciones en una rama completamente nueva que comience con una confirmación de raíz recién creada .

Ahora esto es posible insertando el comando reset [new root] antes de pick la confirmación que desea convertirse en una confirmación raíz. Ejemplo:

reset [new root] pick 012345 a commit that is about to become a root commit pick 234567 this commit will have the previous one as parent

Esto no entra en conflicto con otros usos del comando de reset porque [new root] no es (parte de) un nombre de referencia válido: tanto el corchete de apertura como el espacio son ilegales en los nombres de referencia.


Github tiene una función llamada Páginas de proyecto donde puede crear una rama con nombre en particular en su proyecto para proporcionar archivos que serán servidos por Github. Sus instrucciones son las siguientes:

$ cd /path/to/fancypants $ git symbolic-ref HEAD refs/heads/gh-pages $ rm .git/index $ git clean -fdx

Desde allí tiene un repositorio vacío al que puede agregar su nuevo contenido.