2011-04-14 20 views
10

Tengo un repositorio remoto de git y uno local con el que trabajo. Cada vez que hago algún cambio localmente, los empujo al control remoto. Luego alguna vez hago un "commit git" en el remoto para almacenar los cambios en los archivos remotos.¿Por qué obtengo el "error: error al presionar algunas referencias"?

No edito el repositorio remoto directamente. Solo me comprometo con los cambios. Y soy un desarrollador único, nadie más trabaja en ese repositorio.

¿Por qué me sale un error que, por lo que sé, significa que tengo que tirar primero?

No quiero tirar porque los archivos de repos remoto están desactualizados y perderá mis cambios locales. Esto es realmente molesto, ¿por qué sucede esto? ¿Y cómo puedo solucionar sin tener que extraer o volver a crear el repositorio? (Como se puede ver, se trata de algo así como un tipo de subversión de estilo de control de versiones aquí)

EDITAR - El error:

To ssh://... 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'ssh://...' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 
+0

¿Qué quiere decir que hace un "commit git" en el repositorio remoto? ¿El repositorio remoto es un repositorio simple? En general, solo deberías presionar a un repositorio simple, pero no puedes comprometerte con un repositorio simple, así que estoy un poco confundido acerca de lo que estás tratando de hacer. ¿Puedes mostrar un ejemplo de los comandos reales que estás ejecutando y el resultado real que recibes? –

+0

bueno, yo era un poco sospechoso acerca de esa parte, es por eso que lo menciono también. El repos se crea con 'git init'. Realizo una confirmación en el repositorio remoto, porque de lo contrario no veo los cambios en ese repositorio. Estoy agregando código para mostrar el error – Spyros

Respuesta

11

Lo que debe hacer es crear el repositorio remoto como un repositorio desnudo . Un repositorio desnudo es solo el repositorio git, sin una comprobación actual (es decir, es como el contenido del directorio .git en un repositorio regular de Git, por lo que contiene objetos y referencias, pero no tiene un índice ni funciona copia de la jerarquía de archivos). Si intenta ingresar a un repositorio no desnudo, la copia de trabajo no se sincronizará con lo que se ha cometido y causará los tipos de problemas que está viendo aquí.

Puede crear un repositorio vacío usando git init --bare repo.git. O puede clonar un repositorio existente como un repositorio simple usando git clone --bare original-repo new-repo.git.

Si desea tener una copia desprotegida del repositorio en su servidor, deberá crear un repositorio nuevo, no desnudo en el servidor, y luego ingresar ese repositorio desde el repositorio simple que usted envía al .

+0

Entonces, si lo entiendo correctamente, la idea es que el repositorio simple es como un índice que tiene una forma interna de representar los datos guardados y luego solo clona una copia de trabajo (o copia de seguridad) . – Spyros

+0

+1 debes presionar al repositorio de Git desnudo. –

+1

@SpyrosP Básicamente.Un repositorio simple almacena solo el historial, las ramas y las etiquetas, pero no tiene ningún tipo de copia de trabajo de una versión en particular, como lo hace un repositorio normal. Puedes clonar un repositorio simple para crear un repositorio normal que tenga una copia de trabajo en la que hagas tu trabajo. –

6

esto siempre significa que no se ha sincronizado con el repositorio remoto de recompra locales, por lo que primero debe sincronizarlos mediante el uso de git tirón de comandos de la siguiente manera:

git checkout master  
git pull origin master 

después de este proceso, se le sincronizarlos, y luego puede enviar cambios al repositorio remoto de la siguiente manera:

git add [filename/directory] 
git commit -m"input your message" 
git remote add origin https://github.com//yourname.git  
git push origin master 
5

Aquí hay otra opción.

git reset --mixed origin/master 
git add . 
git commit -m "Your message" 
git push origin master 
0

Me enfrenté a un problema similar, y el siguiente comando funcionó. git push --set-upstream origen maestro

Cuestiones relacionadas