Crear una nueva rama vacía para un nuevo proyecto

351

Estamos utilizando un repositorio git para almacenar nuestro proyecto. Tenemos nuestras sucursales que parten de la sucursal original. Pero ahora queremos crear un nuevo proyecto pequeño para rastrear cierta documentación. Para eso, querríamos crear una nueva rama vacía para comenzar a almacenar nuestros archivos, y quisiera que otros usuarios de la red clonen esa rama.

¿Cómo podemos hacer eso?

Intenté algunas cosas, pero no funcionaron.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Parece empujar bien la rama, pero cuando hago una extracción o extracción, descarga información de otras ramas, y luego también obtengo algunos archivos adicionales de otros proyectos. ¿Cuál es la mejor solución?

fazineroso
fuente
11
¿Por qué necesitas almacenar esto en una sucursal? Las ramas son generalmente para algunas desviaciones de la misma base de código. Tal vez solo comenzar un nuevo repositorio sería una mejor solución.
Benjamin Bannier
2
Bueno, lo hicimos antes, IIRC, y me gustaría volver a hacerlo, así que tengo curiosidad;)
fazineroso
3
"para un nuevo proyecto" - Como @honk sugeriría poner esto en un nuevo repositorio. Dos opciones a partir de ahí para integrarlos. Conviértalo en un submoduleproyecto original, por ejemplo, docs/señalando a ese otro repositorio. O, si desea fusionar el código más tarde, agréguelo como control remoto.
gertvdijk
1
Una desventaja adicional del enfoque huérfano es que necesita mantener sus .gitignorearchivos 'd, y también cambiar constantemente entre las dos raíces (ramas). Así que también estoy para el nuevo enfoque de repositorio, en una nueva carpeta, con los mismos controles remotos y empujando a otra rama.
simo

Respuestas:

666

Puedes crear una rama como huérfana:

git checkout --orphan <branchname>

Esto creará una nueva sucursal sin padres. Luego, puede borrar el directorio de trabajo con:

git rm --cached -r .

y agregue los archivos de documentación, confírmelos y póngalos en github.

Una extracción o recuperación siempre actualizará la información local sobre todas las ramas remotas. Si solo desea obtener / obtener la información para una única rama remota, debe especificarla.

Hiery Nomus
fuente
18
Buena respuesta, pero es un poco molesto que la nueva rama comience con todos los archivos (de la rama anterior) organizados.
Matt Fenwick
12
Al emitir git checkout --orphan <branch>; No veo ningún listado de <branch> en git branch.
Santosh Kumar
51
Después git checkout --orphanse puede utilizar git reset --hardpara eliminar los archivos sobrantes.
Ilya Kozhevnikov
16
La razón por la que no ve la rama después git checkout --orphan <branch>es porque todavía no tiene confirmaciones. Después de la primera confirmación git branchimprime la nueva rama.
Krøllebølle
13
git clean -fd elimina los archivos no rastreados.
stefgosselin
71

La respuesta correcta es crear una rama huérfana. Explico cómo hacer esto en detalle en mi blog. (Enlace archivado)

...

Antes de comenzar, actualice a la última versión de GIT. Para asegurarte de que estás ejecutando la última versión, ejecuta

which git

Si escupe una versión anterior, es posible que deba aumentar su RUTA con la carpeta que contiene la versión que acaba de instalar.

Ok, estamos listos Después de hacer un CD en la carpeta que contiene su pago git, cree una rama huérfana. Para este ejemplo, nombraré la rama "mybranch".

git checkout --orphan mybranch

Eliminar todo en la rama huérfana

git rm -rf .

Hacer algunos cambios

vi README.txt

Agregar y confirmar los cambios

git add README.txt
git commit -m "Adding readme file"

Eso es. Si tu corres

git log

notarás que el historial de confirmaciones comienza desde cero. Para volver a su rama maestra, simplemente ejecute

git checkout master

Puede regresar a la rama huérfana ejecutando

git checkout mybranch
Sid Jain
fuente
16
No se recomiendan las respuestas de solo enlace. Si el enlace se mueve o se elimina, su respuesta deja de tener valor. Considere agregar partes esenciales directamente a esta misma respuesta. Preste especial atención a aquellos problemas que no están cubiertos con respuestas anteriores.
bytebuster
3
El enlace ya no es válido, desafortunadamente.
Alexey
1
Los archivos son una cosa maravillosa.
lucid_dreamer
3
Es PELIGROSO simplemente eliminar todo en el directorio de trabajo, porque cualquier proyecto no trivial tendrá archivos sin seguimiento (configuración, entorno, caché, etc.).
Slava Fomin II
12

Haga una nueva rama vacía como esta:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Si sus archivos proj-doc ya están en una confirmación bajo un subdirectorio, puede hacer la nueva rama de esta manera:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

lo que podría ser más conveniente que git branch --orphansi eso te dejaría con una gran cantidad de git rme git mving hacer.

Tratar

git branch --set-upstream proj-doc origin/proj-doc

y vea si eso ayuda con su problema de buscar demasiado. Además, si realmente solo desea obtener una sola rama, lo más seguro es especificarla en la línea de comandos.

jthill
fuente
1
Esta respuesta es interesante porque le permite iniciar otra rama / raíz con el primer commit totalmente vacío.
Stéphane Gourichon
Otra forma de hacer una rama vacía si no le importa cambiar a esgit checkout --orphan new-branch; git reset --hard
jthill
¿De qué sirve el xargs?
Flujo
@Flux es solo otra forma de hacer que la identificación del árbol sea subtitulada como un argumento de árbol de confirmación.
jthill
Realmente me gusta este enfoque, ya que permite crear una nueva rama vacía, sin abandonar su rama actual, además de que hay una confirmación vacía como punto de partida.
Brice
8

Si su versión de git no tiene la opción --orphan, se debe usar este método:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Después de hacer algo de trabajo:

git add -A
git commit -m <message>
git push origin <newbranch>
cyb0k
fuente
2
¡Tenga cuidado, git cleanpuede eliminar archivos que no desea eliminar! Ejecute git clean -ndxprimero para ver qué archivos eliminará antes de ejecutarlo de verdad con la -fopción.
Lassi
7

Digamos que tiene una masterrama con archivos / directorios:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Paso a paso cómo hacer una rama vacía:

  1. git checkout —orphan new_branch_name
  2. Asegúrese de estar en el directorio correcto antes de ejecutar el siguiente comando:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

En el paso 2, simplemente eliminamos todos los archivos localmente para evitar confusiones con los archivos de su nueva sucursal y los que mantiene en la mastersucursal. Luego, desvinculamos todos esos archivos en el paso 3. Finalmente, el paso 4 y posteriores están trabajando con nuestra nueva rama vacía.

Una vez que haya terminado, puede cambiar fácilmente entre sus ramas:

git checkout master 
git checkout new_branch
usuario1723157
fuente
1

En base a esta respuesta de Hiery Nomus .

Puedes crear una rama como huérfana:

git checkout --orphan <branchname>

Esto creará una nueva sucursal sin padres. Luego, puede borrar el directorio de trabajo con:

git rm --cached -r .

Y luego simplemente confirma la rama con confirmación vacía y luego empuja

git commit -m <commit message> --allow-empty
git push origin <newbranch>
Transatlántico
fuente
1

Consulte esta documentación , tiene detalles claros sobre

--orphan <new_branch>
Cree una nueva rama huérfana, llamada <new_branch>, iniciada <start_point>y cambie a ella. El primer compromiso realizado en esta nueva rama no tendrá padres y será la raíz de una nueva historia totalmente desconectada de todas las demás ramas y compromisos.

El índice y el árbol de trabajo se ajustan como si previamente hubiera ejecutado git checkout. Esto le permite comenzar un nuevo historial que registra un conjunto de rutas similares a ejecutando fácilmente git commit -a para realizar la confirmación de raíz.

Kamal Hossain
fuente
1
Un enlace a una solución es bienvenido, pero asegúrese de que su respuesta sea útil sin él: agregue contexto alrededor del enlace para que sus otros usuarios tengan una idea de qué es y por qué está allí, luego cite la parte más relevante de la página volver a vincular en caso de que la página de destino no esté disponible. Se pueden eliminar las respuestas que son poco más que un enlace.
Yunnosch
1

Encontré esta ayuda:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
齐 化 恒
fuente