2009-03-18 12 views
460

No soy un maestro de Git, pero he estado trabajando con él desde hace un tiempo, con varios proyectos diferentes. En cada proyecto, siempre git clone [repository] y desde ese punto, siempre puede git pull, siempre y cuando no tenga cambios sobresalientes, por supuesto.¿Cómo se hace que git siempre se saque de una rama específica?

Recientemente, tuve que volver a una sucursal anterior, y lo hice con git checkout 4f82a29. Cuando estuve nuevamente listo para tirar, descubrí que tenía que volver a establecer mi rama como maestro. Ahora, no puedo extraer usando git pull directamente, pero en su lugar, tengo que especificar git pull origin master, lo cual es molesto, y me indica que no entiendo completamente lo que está sucediendo.

¿Qué ha cambiado que no me permite hacer un git pull directamente sin especificar el maestro de origen, y cómo cambiarlo de nuevo?

ACTUALIZACIÓN:

-bash-3.1$ cat config 
[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
[branch "master"] 
[remote "origin"] 
    url = [email protected]:user/project.git 
    fetch = refs/heads/*:refs/remotes/origin/* 

ACTUALIZACIÓN 2: Para que quede claro, entiendo que mi método original puede haber sido incorrecta, pero necesito solucionar este repo por lo que yo simplemente puedo usar git pull nuevo. Actualmente, git pull resultados en:

-bash-3.1$ git pull 
You asked me to pull without telling me which branch you 
want to merge with, and 'branch.master.merge' in 
your configuration file does not tell me either. Please 
name which branch you want to merge on the command line and 
try again (e.g. 'git pull '). 
See git-pull(1) for details on the refspec. 

If you often merge with the same branch, you may want to 
configure the following variables in your configuration 
file: 

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details. 

que puedo decir git pull que se ramifican a fusionarse, y funciona correctamente, pero git pull no funciona como lo hizo originalmente antes de mi git checkout.

+0

¿Cómo se ve tu .git/config? ¿Qué hiciste después de que revisaste esa confirmación? –

+0

¿Hizo commits en la parte superior de 4f82a29? –

+0

Pat, no hice ningún commit en la parte superior. Esto está en un servidor, y necesitábamos volver a una versión estable para ocultar un error que habíamos creado. Este sistema no es para fines de desarrollo, así que simplemente quería retroceder, esperar mientras solucionamos el error y luego volver a la versión principal. –

Respuesta

709

Bajo [branch "master"], trate de añadir lo siguiente al archivo de configuración de Git del repo (.git/config):

[branch "master"] 
    remote = origin 
    merge = refs/heads/master 

Esto le dice a Git 2 cosas:

  1. Cuando estás en la rama principal, el el control remoto predeterminado es origen
  2. Al usar git pull en la rama maestra, sin ningún control remoto y rama especificados, utilice el control remoto predeterminado (origen) y fusione los cambios desde la rama maestra remota.

No estoy seguro de por qué esta configuración se habría eliminado de su configuración, sin embargo. Es posible que deba seguir las sugerencias que otras personas publicaron también, pero esto puede funcionar (o ayudar al menos).

Si no desea editar el archivo de configuración a mano, puede utilizar la herramienta de línea de comandos en lugar:

$ git config branch.master.remote origin 
$ git config branch.master.merge refs/heads/master 
+2

Esto funcionó para mí también, había comprobado un proyecto de github. Estoy ejecutando OS X 10.4 –

+0

Gracias * muy * mucho - esto me sucedió en un único proyecto de desarrollador con un repositorio "servidor" y dos computadoras (que solía presionar/tirar frecuentemente sin problemas antes del error), No sé por qué, pero la solución funcionó bien. – chesterbr

+0

Consulte la respuesta por Head para evitar tener que editar el archivo de configuración a mano – pjb3

4

Su pregunta inmediata de cómo hacer que tire maestro, debe hacer lo que dice. Especifique el refspec para extraer de su configuración de sucursal.

[branch "master"] 
    merge = refs/heads/master 
+0

¿No debería ser eso "refs/heads/master"? Según git-pull (1), este es el nombre de la sucursal en el sitio remoto que se fusiona de forma predeterminada. –

+0

Sí, estás en lo cierto. El informe del que tomé mi ejemplo es un caso especial. Corregido –

23

Git pull combina dos acciones - ir a buscar nuevas confirmaciones desde el repositorio remoto en las ramas de orugas y luego fusionarlos en su rama actual .

Cuando marcó un compromiso en particular, no tiene una rama actual, solo tiene HEAD apuntando al último compromiso que realizó. Por lo tanto, git pull no tiene todos sus parámetros especificados. Es por eso que no funcionó.

Según su información actualizada, lo que está tratando de hacer es revertir su repositorio remoto. Si conoces el commit que introdujo el fallo, la forma más fácil de manejar esto es con git revert que registra un nuevo commit, que deshace el buggy de confirmación especificada:

$ git checkout master 
$ git reflog   #to find the SHA1 of buggy commit, say b12345 
$ git revert b12345 
$ git pull 
$ git push 

Ya que es el servidor que va a querer cambiar, yo supondrá que no necesita reescribir el historial para ocultar la confirmación de errores.

Si el error se introdujo en una confirmación de fusión, este procedimiento no funcionará. Ver How-to-revert-a-faulty-merge.

+0

Me está dando una gran educación aquí, lo cual agradezco, pero es posible que no describa mi situación muy bien, así que esta no es una coincidencia exacta para mi flujo de trabajo. Probablemente publicaré otra pregunta para abordar eso. ¡Gracias, Paul! +1 a usted, señor. –

+0

Acabo de leer mal su situación. Me alegra que hayas obtenido la respuesta que necesitabas. – Paul

10

Sin querer editar mi archivo git config Seguí la información en @ de mipadi puesto y utilizado:

$ git pull origin master 
+13

El punto era hacer esto automáticamente en lugar de especificarlo. – Eric

137

Si lo prefiere, puede establecer estas opciones a través de la línea commmand (en lugar de editar el archivo de configuración), así:

$ git config branch.master.remote origin 
    $ git config branch.master.merge refs/heads/master 

O, si eres como yo, y quiero que esto sea el valor por defecto en todos sus proyectos, entre los que podría funcionar en el futuro, a continuación, agregarlo como un ajuste de configuración global:

$ git config --global branch.master.remote origin 
    $ git config --global branch.master.merge refs/heads/master 
+10

+1 por conocer la palabra mágica "refs/heads/master". No tuve problemas para averiguar cómo configurar la variable, pero no tenía ni idea de qué configurar * a *, y las páginas man no fueron de mucha ayuda. Finalmente encontré el lugar correcto en los documentos después de encontrar esta respuesta. Para los curiosos: la palabra mágica se refiere a una ruta de archivo en '.git' en la que aparece git para mantener el código hash de la confirmación actual del maestro. – mokus

78
git branch --set-upstream master origin/master 

Esto añadirá la siguiente información a su archivo config:

[branch "master"] 
    remote = origin 
    merge = refs/heads/master 

Si tiene branch.autosetuprebase = always entonces también añadirá:

rebase = true 
+0

Me parece la forma más fácil de hacer que Git se comporte como se le pidió, especialmente si hay más ramas, no solo remotas (incluso si tiene que hacer esto para cada rama, es una vez por rama) – s3v3n

+1

Acabo de probar esto, y obtener el error 'fatal: No es un nombre de objeto válido: 'origin/master'. aunque' origin' es un control remoto válido, y 'master' existe, como de costumbre, en ambos repositorios. –

+2

Ken, primero debe hacer "origen de búsqueda de git" para obtener los nombres de las sucursales remotas. –

6

También hay una manera de configurar Git para que siempre arrastre y empuje la rama remota equivalente a la rama que está actualmente desprotegida en la copia de trabajo. Se llama una rama de seguimiento que git ready recommends setting by default.

Para el siguiente repositorio por encima de la actual directorio de trabajo:

git config branch.autosetupmerge true 

Para todos los repositorios Git, que no están configurados de otro modo:

git config --global branch.autosetupmerge true 

tipo de magia, en mi humilde opinión, pero esto podría ayudar en casos donde la rama específica es siempre la rama actual.

Cuando se tiene branch.autosetupmerge conjunto de true, y obtenga una rama, por primera vez, Git le informará sobre el seguimiento de la rama remoto correspondiente:

(master)$ git checkout gh-pages 
Branch gh-pages set up to track remote branch gh-pages from origin. 
Switched to a new branch 'gh-pages' 

Git luego empuje a esa rama correspondiente de forma automática:

(gh-pages)$ git push 
Counting objects: 8, done. 
Delta compression using up to 2 threads. 
Compressing objects: 100% (6/6), done. 
Writing objects: 100% (6/6), 1003 bytes, done. 
Total 6 (delta 2), reused 0 (delta 0) 
To [email protected]:bigben87/webbit.git 
    1bf578c..268fb60 gh-pages -> gh-pages 
45

me resulta difícil recordar los exactas git config o git branch argumentos que en la mipadi y respuestas de Casey, así que utilizan estos 2 comandos para añadir el referen aguas arriba ce:

git pull origin master 
git push -u origin master 

Esto agregará la misma información a su .git/config, pero me resulta más fácil de recordar.

+1

Estoy de acuerdo. Esta debería ser la mejor respuesta más simple. – linbianxiaocao

+0

Su respuesta debe incluir por qué funciona y consulte la sección en los documentos que explica por qué. – vfclists

Cuestiones relacionadas