¿Cómo puedo encontrar la ubicación de origen / maestro en git, y cómo lo cambio?

227

Soy un novato Git. Recientemente moví un proyecto Rails de Subversion a Git. Seguí el tutorial aquí: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

También estoy usando unfuddle.com para almacenar mi código. Hago cambios en mi computadora portátil Mac en el tren hacia / desde el trabajo y luego los presiono para que se desenrollen cuando tengo una conexión de red con el siguiente comando:

git push unfuddle master

Utilizo Capistrano para las implementaciones y extraigo el código del repositorio desplegado usando la rama maestra.

Últimamente he notado el siguiente mensaje cuando ejecuto "git status" en mi computadora portátil:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

Y estoy confundido sobre por qué. Pensé que mi computadora portátil era el origen ... pero no sé si el hecho de que originalmente saqué de Subversion o presioné para Desenredar es lo que está haciendo que aparezca el mensaje. Cómo puedo:

  1. ¿Averigua dónde piensa Git que es 'origen / maestro'?
  2. Si está en otro lugar, ¿cómo convierto mi computadora portátil en el 'origen / maestro'?
  3. Recibe este mensaje para desaparecer. Me hace pensar que Git no está contento con algo.

Mi mac ejecuta Git versión 1.6.0.1.


Cuando ejecuto git remote show originsegún lo sugerido por dbr, obtengo lo siguiente:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Cuando corro git remote -vsegún lo sugerido por Aristóteles Pagaltzis, obtengo lo siguiente:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    [email protected]:spilth/geekfor.git

Ahora, curiosamente, estoy trabajando en mi proyecto en el geekfordirectorio pero dice que mi origen es mi máquina local en el gfdirectorio. Creo que gffue el directorio temporal que utilicé al convertir mi proyecto de Subversion a Git y probablemente desde donde empujé para desenredar. Entonces creo que he extraído una copia nueva de Unuddle al geekfordirectorio.

Parece que debería seguir los consejos de dbr y hacer:

git remote rm origin
git remote add origin [email protected]:spilth/geekfor.git
Brian Kelly
fuente

Respuestas:

202

1. Descubra dónde Git piensa que 'origen / maestro' está usando git-remote

git remote show origin

..que devolverá algo como ..

* remote origin
  URL: [email protected]:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Un control remoto es básicamente un enlace a un repositorio remoto. Cuando tu lo hagas..

git remote add unfuddle [email protected]/myrepo.git
git push unfuddle

..git empujará los cambios a esa dirección que agregaste. Es como un marcador, para repositorios remotos.

Cuando ejecuta git status, comprueba si el control remoto no tiene confirmaciones (en comparación con su repositorio local) y, de ser así, por cuántas confirmaciones. Si empuja todos sus cambios a "origen", ambos estarán sincronizados, por lo que no recibirá ese mensaje.

2. Si está en otro lugar, ¿cómo convierto mi computadora portátil en el 'origen / maestro'?

No tiene sentido hacer esto. Digamos que "origen" cambia de nombre a "computadora portátil": nunca querrá hacerlo git push laptopdesde su computadora portátil.

Si desea eliminar el control remoto de origen, lo hace ..

git remote rm origin

Esto no eliminará nada (en términos de contenido de archivo / historial de revisiones). Esto detendrá el mensaje "su rama está adelante por ...", ya que ya no comparará su repositorio con el control remoto (¡porque se ha ido!)

Una cosa para recordar es que no tiene nada de especial origin, es solo un nombre predeterminado que usa git.

Git usa originde manera predeterminada cuando haces cosas como git pusho git pull. Entonces, si tiene un control remoto que usa mucho (Unfuddle, en su caso), recomendaría agregar unududdle como "origen":

git remote rm origin
git remote add origin [email protected]:subdomain/abbreviation.git

o haga lo anterior en un comando usando set-url:

git remote set-url origin [email protected]:subdomain/abbreviation.git

Entonces puede simplemente hacer git pusho git pullactualizar, en lugar degit push unfuddle master

dbr
fuente
1
Él escribe que empuja al originrepositorio (a pesar de que no es consciente de cómo funciona eso en términos de git): quitar el control remoto difícilmente sería algo útil para él.
Aristóteles Pagaltzis
10
No entiendo por qué la gente reformula las preguntas. Cambia el significado de la pregunta, hace que las respuestas existentes no tengan sentido y no permite que otras personas sepan que el que hace la pregunta necesita más información en función del hecho de que su pregunta puede ser ligeramente "incorrecta".
estu
99
Quitar el origen remoto era exactamente lo que necesitaba porque apuntaba a un repositorio local que ya no existía, no al repositorio desenrollado.
Brian Kelly
3
stu: ¡Reescribir es algo bueno! Si no dijeron claramente, no tiene sentido obtener respuestas que no resuelvan el problema real.
dbr
44
Pero es mucho más fácil enojarse y amargarse. :-) Pero veo tu punto.
stu
286

Llegué a esta pregunta en busca de una explicación acerca de lo que significa el mensaje "su rama está adelante por ...", en el esquema general de git. No hubo respuesta a eso aquí, pero dado que esta pregunta aparece actualmente en la parte superior de Google cuando busca la frase "Su rama está por delante de 'origen / maestro'", y desde entonces he descubierto lo que realmente significa el mensaje , Pensé en publicar la información aquí.

Entonces, al ser un novato gitano, puedo ver que la respuesta que necesitaba era una respuesta claramente novata. Específicamente, lo que significa la frase "su rama está adelante por ..." es que hay archivos que ha agregado y comprometido en su repositorio local, pero que nunca han llegado al origen. La intención de este mensaje se ofusca aún más por el hecho de que "git diff", al menos para mí, no mostró diferencias. No fue hasta que ejecuté "git diff origin / master" que me dijeron que había diferencias entre mi repositorio local y el maestro remoto.

Entonces, para ser claros:


"su rama está adelante por ..." => Debe empujar al maestro remoto. Ejecute "git diff origin / master" para ver cuáles son las diferencias entre su repositorio local y el repositorio maestro remoto.


Espero que esto ayude a otros novatos.

(Además, reconozco que hay sutilezas de configuración que pueden invalidar parcialmente esta solución, como el hecho de que el maestro puede no ser realmente "remoto", y que "origen" es un nombre reconfigurable utilizado por convención, etc. Pero los novatos sí no nos importa ese tipo de cosas. Queremos respuestas simples y directas. Podemos leer sobre las sutilezas más tarde, una vez que hayamos resuelto el problema apremiante).

Conde

Earl Jenkins
fuente
2
@ Earl ¿No git diff --cached origin/mastersería una mejor instrucción aquí, ya que establece cuál sería el resultado del próximo impulso? El comando resaltado que tiene arriba también muestra archivos no confirmados y no organizados (creo que también soy un novato git)
nhed
48
También es posible que deba ejecutar git fetchsi obtiene este error después de a git pull remote branch. Tus árbitros pueden estar desactualizados. git fetcharregla eso.
Bryan Kennedy
Qué origin/mastersignifica la parte masterrama en originrepos?
Rakib
1
Tenga en cuenta que esta descripción está incompleta. Actualmente estoy experimentando # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Pero git diff origin / master no muestra nada (y la opción --cached no cambia esto). Y, git fetch no cambia esto, git pull no cambia esto, git reset --hard no cambia esto. Para cambiar esto, necesitaba: git reset - hard origin / master Y elijo esa ruta porque otras personas están trabajando conmigo en este repositorio y no quería invalidar sus pruebas, y porque no pude averiguar qué confirma. son.
rdm
1
También recibo este mensaje cuando necesito extraer de en lugar de empujar a origen / maestro. por ejemplo, de otra rama si git checkout masterrecibo el mensaje, lo que significa que debería hacerlo git pull origin masterantes de trabajar. pero lo encuentro muy confuso porque la redacción del mensaje sugiere lo contrario
Anentropic
38

Tuve un problema similar a este donde estaba mi directorio de trabajo ahead of origin by X commitspero git pullestaba resultando Everything up-to-date. Logré arreglarlo siguiendo este consejo . Estoy publicando esto aquí en caso de que ayude a alguien más con un problema similar.

La solución básica es la siguiente:

$ git push {remote} {localbranch}:{remotebranch}

Donde las palabras entre paréntesis deben reemplazarse por su nombre remoto, el nombre de su sucursal local y el nombre de su sucursal remota. p.ej

$ git push origin master:master
Mims H. Wright
fuente
1
Gracias, eso lo hizo por mí. git diffno mostró nada, y después de hacer lo que describiste ya no recibo este mensaje confuso y molesto.
LaundroMat
1
Necesita más votos a favor :). Las respuestas con más votos fueron "sin efecto" para mí (es decir, "git fetch" - no hizo nada ... marque "git remote show origin" - nada incorrecto, nada necesitaba cambiar)
Adam
10

Pensé que mi computadora portátil era el origen ...

Eso es un poco absurdo: se originrefiere al repositorio remoto predeterminado, el que generalmente obtiene / extrae los cambios de otras personas.

Cómo puedo:

  1. git remote -vte mostrará lo que origines; origin/masteres su "marcador" para el último estado conocido de la masterrama del originrepositorio, y el suyo masteres una rama de seguimiento para origin/master. Esto es todo como debería ser .

  2. Usted no Al menos no tiene sentido que un repositorio sea el repositorio remoto predeterminado por sí mismo.

  3. No lo es Simplemente le dice que ha realizado una cantidad de confirmaciones locales que no están en el repositorio remoto (de acuerdo con el último estado conocido de ese repositorio).

Aristóteles Pagaltzis
fuente
1
Asumí que mi computadora portátil era el origen ya que ahí fue donde creé el repositorio (donde se originó).
Brian Kelly
1
Por el contrario, tiene mucho sentido para mí originapuntar a la computadora portátil localmente, ya que estar fuera de línea o cambiar de red es un caso muy común para dispositivos portátiles como las computadoras portátiles. De esta manera, puede usarlo git pushy en git pullcualquier momento, sin necesidad de pensar si está conectado a la red correcta actualmente. Este local originse puede sincronizar con los controles remotos reales automáticamente cuando hay un enlace de red disponible, dependiendo del estado de roaming actual. La parte problemática es cuándo ejecutar qué sincronización, en comparación con eso, la parte GIT es bastante fácil.
Tino
2
Apuntar origina otro repositorio en su computadora portátil tiene mucho sentido, claro. Sin embargo, señalar el originrepositorio en sí mismo no lo hace: no haría ninguna diferencia si se ejecuta git pusho git pull, ya que un repositorio siempre está exactamente sincronizado consigo mismo de todos modos. Es err, algo tautológico.
Aristóteles Pagaltzis
3

[Solución]

$ git push origin

^ esto lo resolvió para mí. Lo que hizo, sincronizó mi maestro (en la computadora portátil) con el "origen" que está en el servidor remoto.

Chris
fuente
1

Estoy luchando con este problema y ninguna de las respuestas anteriores aborda la pregunta tal como la veo. He eliminado el problema de nuevo a lo básico para ver si puedo aclararlo.

Creo un nuevo repositorio (rep1), pongo un archivo y lo confirmo.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Creo un clon de rep1 y lo llamo rep2. Miro dentro de rep2 y veo que el archivo es correcto.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

En rep1 hago un solo cambio en el archivo y lo confirmo. Luego, en rep1 creo un control remoto para apuntar a rep2 y presionar los cambios.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Ahora, cuando entro en rep2 y hago un 'estado git', me dicen que estoy por delante del origen.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

README en rep2 es como era originalmente, antes de la segunda confirmación. Las únicas modificaciones que he hecho son rep1 y todo lo que quería hacer era empujarlas a rep2. ¿Qué es lo que no estoy captando?

Steve Hindmarch
fuente
1
Dos cosas: la verificación "origen / maestro" de rep2 en realidad no mira rep1. Si hace un 'git pull' en rep2, notará que están en el mismo estado y dejará de quejarse. Para ver realmente los cambios de una inserción en una copia de trabajo, debe hacer un 'git checkout': las notificaciones nunca tocan la copia de trabajo del repositorio de destino.
Walter Mundt
Pensé que podría ser ese el caso, pero obtengo "git checkout M README Tu rama está por delante de 'origin / master' en 1 commit". Pero mi copia de trabajo está realmente detrás de 1 commit, no adelante.
Steve Hindmarch
1

Está esperando que "empujes". Tratar:

$ git push

Vino
fuente
1

Tuve este problema recientemente y pensé que era porque había eliminado algunos archivos que ya no necesitaba. El problema es que git no sabe que los archivos han sido eliminados y ve que el servidor todavía lo tiene. (servidor = origen)

Entonces corrí

git rm $(git ls-files --deleted)

Y luego ejecutó un commit y push.

Eso resolvió el problema.

looneydoodle
fuente
1
Esto sólo funciona si el mensaje de registro de borrado dice - <nombre de archivo>
looneydoodle
1

Soy un novato git también. Tuve el mismo problema con los mensajes 'su rama está por delante del origen / maestro por N commits'. Hacer el 'git diff origin / master' sugerido mostró algunas diferencias que no me importó mantener. Entonces ...

Como mi clon de git era para alojar, y quería una copia exacta del repositorio principal, y no me importaba mantener los cambios locales, decidí guardar mi repositorio completo y crear uno nuevo:

(en la máquina de alojamiento)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Por conveniencia, solía hacer cambios en el clon en mi máquina de alojamiento. No más. Haré esos cambios en el maestro, git commit allí y haré un git pull. Con suerte, esto debería mantener mi clon git en la máquina de alojamiento en completa sincronización.

/ Nara

Nara Narasimhan
fuente
0

Me preguntaba lo mismo sobre mi repositorio. En mi caso, tenía un viejo control remoto que ya no estaba presionando, así que necesitaba quitarlo.

Obtenga la lista de controles remotos:

git remote

Elimina el que no necesitas

git remote rm {insert remote to remove}
Jason Rikard
fuente
0

Es posible restablecer una confirmación específica antes de que se realicen sus propias confirmaciones.

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

Use git logpara encontrar qué confirmación fue la confirmación que tenía antes de que se produjeran los cambios locales.

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Tome nota de las confirmaciones locales y restablezca directamente la confirmación anterior:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
RobLoach
fuente
-1

Tuve el problema "Tu rama está por delante de 'origin / master' por nn commits". cuando empujé a un repositorio remoto con:

git push ssh://[email protected]/yyy/zzz.git

Cuando descubrí que mi dirección remota estaba en el archivo .git / FETCH_HEAD y usé:

git push

El problema desapareció.

novato
fuente