2011-04-16 19 views
67

Duplicar posible:
In git, is there a simple way of introducing an unrelated branch to a repository?¿Cómo creo una confirmación sin un padre en Git?

Tengo un pequeño proyecto que estaba trabajando sin ningún tipo de software de control de versiones, y terminó con tres versiones diferentes del mismo guión, donde cada uno hace algo ligeramente diferente de los demás. Inicialicé un gpo repo con una de las versiones, y me gustaría comprometer a cada uno de los otros dos sin padres. De esa forma, puedo unir las diferencias como si cada una de las tres versiones del guión fuera la punta de diferentes ramas.

Ni siquiera estoy seguro de si esto es necesariamente una manera razonable o razonable de solucionar este problema ... Cualquier consejo sobre cómo hacer las cosas de esta manera, o consejos sobre una mejor manera de manejar esta situación sería muy apreciado.

+2

¿Por qué no creas dos ramas y añades las otras dos versiones y luego trabajas en las ramas? – manojlds

+0

Ver: [cómo insertar un compromiso como el primero, cambiando todos los demás?] (Http://stackoverflow.com/questions/645450/git-how-to-insert-a-commit-as-the-first- shifting-all-the-others) –

+2

Esto se conoce como * root commit *. –

Respuesta

122

Desde mi comentario:

Por qué no crear dos ramas y añadir las otras dos versiones a ellos y luego trabajar en las ramas?

Lo cual creo que estaría de acuerdo con la respuesta de ctcherry también.


Pero si realmente desea crear una "rama" completamente diferente que no está relacionada con maestría, a continuación, puede hacerlo con git checkout --orphan. El manual for git checkout describe a trabajar de la opción --orphan:

Crear un nuevo huérfano rama, llamada <new_branch>, partió de <punto_inicial> y cambiar a él. 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 otras ramas y compromisos.

Es posible utilizar de esta manera:

git checkout --orphan version2 
git rm -rf . 
<add version2 script> 
git add your files 
git commit -m 'Initial commit for version 2' 

Si su Git es mayor que 1.7.2 (cuando se introdujo git checkout --orphan), entonces se puede utilizar la secuencia de comandos alternativo desde “Creating New Empty Branches” en el Git Community Book:

Ocasionalmente, es posible que desee mantener sucursales en su repositorio que no comparten un antecesor con su código normal. Algunos ejemplos de esto podrían ser documentación generada o algo similar. Si desea crear una nueva cabeza de la rama que no utiliza su código base actual como padre, puede crear una rama vacía como esto:

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

+1 por mencionar 'git checkout --orphan' - incluso si mi git 1.7.1 aún no es compatible. Pero parece que [Ubuntu 11.04 contendrá git 1.7.4] (http://packages.ubuntu.com/natty/git), así que solo tendré que esperar dos semanas más. –

+14

+1 para explicar por qué el OP podría replantearse su estrategia, pero luego responder la pregunta de todos modos, en lugar de decir "Su enfoque es incorrecto" y dejarlo así. – MatrixFrog

+0

Después de realizar 'git checkout', también puede usar' git reset --hard' para eliminar los archivos por etapas. – Thai

2

Puede crear una rama para cada versión de la secuencia de comandos y asignarlas a esas ramas individuales. Luego, combínalos de a uno por vez en el maestro. Eso debería tener el efecto que estás buscando.

+1

¡O combínalos todos a la vez! –

2

por qué no empezar con un repo 'vacía' (por ejemplo, una un solo archivo de lectura de su declaración de problema anterior).Luego puede ramificar las tres veces y agregar las diferentes versiones de script en cada una de las ramas, y enviarlas por separado.

A continuación, puede bifurcar/editar/confirmar/combinar y probar todas las opciones de una manera bien gestionada.

Cuestiones relacionadas