2012-05-02 10 views
89

¿Cómo puedo actualizar de forma segura (extraer) un proyecto de git, manteniendo intactos los archivos específicos, incluso si hay cambios ascendentes?git pull manteniendo los cambios locales

myrepo/config/config.php

¿Hay alguna manera, de, incluso si este archivo se va a cambiar en el control remoto, cuando git pull, todo lo demás se actualiza, pero este archivo no ha cambiado (ni siquiera fusionado)?

PS. Necesito hacer lo que estoy pidiendo porque solo estoy escribiendo scripts basados ​​en git. No puedo cambiar los archivos de configuración a las plantillas.

así que necesito una forma de escribir las secuencias de comandos de actualización que no pierda lo que se modificó localmente. Me esperaba algo tan simple como:

git assume-remote-unchanged file1 
git assume-remote-unchanged file2 

continuación git pull

+0

son los cambios a 'config.php' comprometidos? –

+1

posible duplicado de [¿Es posible excluir compromisos específicos al hacer una fusión de git?] (Http://stackoverflow.com/questions/332528/is-it-possible-to-exclude-specific-commits-would-doing- a-git-merge) – Daenyth

+0

No está comprometido. Preferiría no tener que –

Respuesta

164

Hay una solución simple basada en Git stash. Muestra todo lo que has cambiado, extrae todo lo nuevo, aplica tu escondite.

git stash 
git pull 
git stash pop 

En stash pop puede haber conflictos. En el caso que describa, de hecho existiría un conflicto para config.php. Pero resolver el conflicto es fácil porque sabes que lo que pones en el escondite es lo que quieres. Así que hacer esto:

git checkout --theirs -- config.php 
+3

esa comprobación de git --sus comandos son muy confusos. Hizo lo que quería una vez y algo realmente malo en otra ocasión. ¿Tienes alguna buena documentación sobre esto? – Milimetric

+2

Sí, a veces 'suyo' y 'nuestro' pueden ser confusos. En un 'git merge' 'nuestro' es lo que está actualmente en el directorio de trabajo. Pero para un 'git rebase' (o' git rebase -onto') el significado puede intercambiarse. – GoZoner

+0

@GoZoner Creo que esto funciona para buscar también. Es solo que después de 'git stash' uno tiene que verificar una rama diferente y luego' git fetch origen : '. luego revisa la rama anterior y luego 'git stash pop'. Intenté y funcionó, pero no tuve ningún conflicto de fusión. – AnkurTank

13

Si usted tiene un archivo en tu repositorio que se supone que debe ser personalizado por la mayoría de los extractores, a continuación, cambiar el nombre del archivo a algo como config.php.template y agregue config.php a su .gitignore.

+4

marque [esta respuesta] (http://stackoverflow.com/a/3970442/236871) también, puede usar '.gitattributes' para mantener siempre sus cambios durante la fusión. – KurzedMetal

+0

Eso es más como lo que necesitaba. La cuestión de la plantilla es la solución elegante, pero me temo que no puedo usar esto, ya que solo estoy escribiendo despliegues de scripts. –

4

Actualización: esto literalmente responde la pregunta, pero creo que KurzedMetal's answer es realmente lo que quieres.

Suponiendo que:

  1. Usted está en la rama master
  2. La rama ascendente se master en origin
  3. No tiene cambios no confirmados

.... usted podría hacer:

# Do a pull as usual, but don't commit the result: 
git pull --no-commit 

# Overwrite config/config.php with the version that was there before the merge 
# and also stage that version: 
git checkout HEAD config/config.php 

# Create the commit: 
git commit -F .git/MERGE_MSG 

Puede crear un alias si necesita hacerlo con frecuencia. Tenga en cuenta que si tiene cambios no confirmados en config/config.php, esto los descartaría.

3

También podemos tratar git pull usando rebase

git pull --rebase origin dev