2010-06-22 11 views
12

¿Alguien podría decirme cómo clonar el primer compromiso? No quiero eliminar confirmaciones recientes, solo hago una copia clónica del estado inicial para poder tomar algunos de los archivos.Git: ¿Cómo clonar el primer compromiso?

+0

un repositorio git puede tener varios '' comete la primera – knittl

+8

Okay, chicos, no hacen un mal olor como de la primera cometer algoSiempre hay al menos una confirmación raíz, y es muy raro que haya múltiples, especialmente en un repositorio de un usuario que hace una pregunta básica como esta. – Cascabel

Respuesta

9

Para responder a la pregunta que yo creo que hayas querido preguntar:

Usted puede obtener toda su repositorio en el estado de la primera comprometerse con:

git checkout <commit SHA1> 

Después de terminar de jugar un poco, se puede hacer git checkout master para volver a donde estabas.

Y usted puede conseguir los archivos individuales en su estado desde el primer comprometerse con:

git checkout <commit SHA1> <file or directory> ... 

Una vez más, después de que haya terminado, puede hacerlo git checkout master <file or directory> para volver a donde estabas.

No hay necesidad de "clonar" un compromiso (¿por el cual supongo que quiere decir clonar el repositorio y verificar el primer compromiso?). Por supuesto, si por alguna razón no puede modificar los archivos de su repositorio (por ejemplo, no desea que su creación no esté actualizada), puede, por supuesto, clonarlo, y luego hacer exactamente lo mismo en el repositorio clonado. .

-1

Creo que todo lo que tiene que hacer es crear una nueva bifurcación a partir de la confirmación original que desee, verificarla y luego volver a fusionarla con la CABEZA de la sucursal en la que está trabajando.

Si abcxyz ... es el SHA1 del confíe que quiere y que está trabajando en la rama principal, esto es generalmente lo que se quiere hacer:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit 
git checkout oldskool 
#make changes 
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited) 
git checkout master 
git merge oldskool 
+0

Estás creando oldskool a partir de un antecesor de master, por lo que la rebase lo va a adelantar rápidamente, y luego la fusión no es operativa. Sin cambio al maestro Si omite la rebase, la fusión también será un avance rápido, y de nuevo, no cambiará a maestro. – Cascabel

14

Creo que quiero hacer la misma cosa. Verifica la confirmación inicial y bifurca desde allí. No estoy seguro con la respuesta aceptada. Pero creo que podría (en parte) completar la pregunta original. Después de leer este hilo, sin embargo a ir con algunas secuencias de comandos de bash alrededor

git log --pretty=oneline master | tail -1 

supongo que esperaba que habría alguna referencia o compromiso ish-árbol para esto.

Por lo tanto usted puede pagar el primer comprometerse con el siguiente comando:

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'` 

2017 actualización desde '12 (GIT 1.8.1), que tiene una mejor opción: git rev-list. Vea otras respuestas aquí o KyleMit at superuser para una mejor forma de scripting esto.

+3

Si usaste 'git rev-list --all' en lugar de' git log --pretty = oneline master', no tendrías que analizar el mensaje de confirmación porque devuelve solo shas. Ver mi respuesta a [Usando git, ¿cómo puedo volver a la primera confirmación] (http://superuser.com/a/773366/180163) – KyleMit

11

Si por "primera confirmación", te refieres a la confirmación principal de una rama que no tiene ningún padre, entonces quieres usar git-rev-list para hacer eso. Sólo tiene que utilizar

git rev-list --max-parents=0 HEAD

que hará que su "Commit inicial" para la cabeza actual. Use maestro si lista o cualquier otra especificación de revisión hijo. envuelva en que $(...) con el fin de utilizar que en una expresión, tales como:

git checkout $(git rev-list --max-parents=0 HEAD)

+2

Gracias, esta es la única respuesta que cubre el caso general sin una copia intermedia/pegar paso. –

+0

Gracias por la solución Jesse! –

Cuestiones relacionadas