2011-01-07 7 views
78

teniendo en cuenta que hay varios comandos git que no tienen sentido en un repositorio desnudo (porque repositorios pelados no utilizar índices y no tienen un directorio de trabajo),¿Cómo puedo comprometer la última confirmación en un repositorio de git bare?

git reset --hard HEAD^ 

no es una solución a uncommit el último cambio en dicho repositorio.

Buscando a través de Internet, todo lo que pude encontrar en relación con el tema es this, en la que se me presenta tres formas de hacer esto: 1.
"actualizar manualmente el árbitro (que implica la plomería)";
2. "git push -f desde un repositorio no vacío";
3. "git branch -f this $that".

¿Qué solución cree que es más adecuada o qué otras formas existen para hacerlo? Lamentablemente, la documentación que encontré sobre los repositorios sin formato es bastante pobre.

+7

@ Lavinia-Garbriela Dobrovol No utilice las cosas complicadas a continuación. Estás tratando de mover HEAD a una confirmación diferente y para eso es que se reinicia el git, incluso en un repositorio simple. Por mi respuesta a continuación, use: git reset --soft Con --soft, no intente cambiar un árbol de trabajo e índice que no existe, por lo que git le permite hacer el reinicio sin problema. – Hazok

Respuesta

107

Puede usar el comando git update-ref. Para extraer la última confirmación, se debería utilizar:

$ git update-ref HEAD HEAD^ 

O si no estás en la rama de la que usted no puede quitar la última confirmación:

$ git update-ref refs/heads/branch-name branch-name^ 

También puede pasar una SHA1 si que desee:

$ git update-ref refs/heads/branch-name a12d48e2 

Consulte la documentación del comando git-update-ref.

+0

¿Qué es HEAD en el repositorio desnudo no está en la rama derecha? – VonC

+0

@ Lavinia-Gabriela Dobrovolschi: claro, no estaba familiarizado con la sintaxis exacta. – VonC

+0

@VonC Se puede especificar el en 'git-ref actualización ' ser la rama derecha, como "refs/heads/master" en lugar de la cabeza, por ejemplo. Espero no haber malinterpretado tu pregunta. –

7

El git push -f debería funcionar bien:
Si se clona que repo desnuda, retire la última confirmación (git reset --hard HEAD^ como usted menciona, pero en un acuerdo de recompra no desnuda local) y empuje hacia atrás (-f):

  • no cambia ningún SHA1 para las otras confirmaciones anteriores a la que elimine.
  • está seguro de que rechaza el contenido exacto del repositorio desnudo menos la confirmación adicional (porque acaba de clonarlo primero).
+0

@ VonC Hola Von, he visto su respuesta es mucho en Git así que quería preguntarle ... Tenía curiosidad, ¿por qué no iba a restablecer '' git --soft como se muestra en mi respuesta a continuación ser la práctica recomendada para mover HEAD en un repositorio desnudo? – Hazok

+0

Creo que otra razón es que el uso del restablecimiento parcial para repos sin información no está disponible y muchos foros parecen tener soluciones complejas innecesariamente cuando parece que el reinicio suave es la mejor práctica debido a la menor cantidad de escritura y menos posibilidad de error – Hazok

+1

@Zach: un 'reset --soft' debería funcionar cuando se hace directamente en un repositorio simple. Sospecho que esto raramente se hace porque un repositorio desnudo es generalmente un ** repositorio en sentido ascendente ** (es decir, un repositorio al que estás presionando datos), y la mayoría de las veces, * no * tienes un acceso local directo a él. . Pero si lo hace, este es sin duda otro buen ejemplo del uso de '' reset --soft' "(como en http://stackoverflow.com/questions/5203535/practical-uses-of-git-reset-soft) +1 a tu respuesta. – VonC

25

Si se utiliza el siguiente en un acuerdo de recompra desnudo:

git reset --soft <commit> 

entonces no se enfrenten a los problemas que tiene el uso de --hard y --mixed opciones en un acuerdo de recompra al descubierto ya que no está tratando de cambiar algo el repositorio desnudo no tiene (es decir, árbol de trabajo e índice).En su caso concreto que se quiere utilizar (de la cesión temporal desnudo):

git reset --soft HEAD^ 

Para switch branches on the remote repo hacer:

git symbolic-ref HEAD refs/heads/<branch_name> 
+2

¿Cómo se selecciona la rama que desea mover? Tu ejemplo funciona bien en master, pero 'git checkout other_branch' no funciona en su totalidad. – Gauthier

+1

Hmmm ... Me pregunto quién me votó por esto. La pregunta no preguntaba cómo cambiar las sucursales en un repositorio remoto, sino cómo reiniciar en un repositorio simple. Para cambiar la rama predeterminada en un repositorio remoto, use git symbolic-ref HEAD refs/heads/. – Hazok

2

También puede utilizar la notación refspec Git y hacer algo como esto:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

Esto fuerza la actualización de la bifurcación de destino (como se denota por la referencia) a la confirmación de origen como se indica en el +<object ref> parte.

+2

, excepto cuando hay un acl en la rama, que suele ser el caso si "necesita hacerlo en el repositorio desnudo en sí" ... –

Cuestiones relacionadas