Creo que estoy en el camino correcto para entender los conceptos básicos de git.
Ya he configurado y clonado un repositorio remoto. También creé un repositorio vacío del lado del servidor, y vinculé mi repositorio local.
Mi problema es que no entiendo la diferencia entre:
- origen / maestro vs control remoto / origen / maestro
Por lo que he entendido, master es una rama local, y remotes / origin / master es remota.
Pero, ¿qué es exactamente origen / maestro ?
git
git-remote
John Rumpel
fuente
fuente
.git/refs/origin/master
alguna vez derivaría.git/refs/remotes/origin/master
? Esto me está sucediendo a mí ahora y me estoy desanimando.Respuestas:
Tome un clon de un repositorio remoto y ejecútelo
git branch -a
(para mostrar todas las ramas que Git conoce). Probablemente se verá más o menos así:Aquí,
master
hay una rama en el repositorio local.remotes/origin/master
es una rama nombradamaster
en el remoto llamadoorigin
. Puede referirse a esto como cualquieraorigin/master
, como en:También puede referirse a él como
remotes/origin/master
:Estas son solo dos formas diferentes de referirse a la misma cosa (por cierto, ambos comandos significan "muéstreme los cambios entre la
master
rama remota y mimaster
rama").remotes/origin/HEAD
esdefault branch
para el remoto llamadoorigin
. Esto te permite simplemente decir enorigin
lugar deorigin/master
.fuente
git branch -a
mostrar la rama remota comoremotes/origin/master
es en parte porque la referencia subyacente está almacenada.git/refs/remotes/origin
(si no se ha empaquetado). En mi opinión, la salida degit branch -a
podría ser mucho más clara, quizás separando el nombre del control remoto del nombre de la rama con algo más que una barra oblicua.git branch -r
, que es solo para mostrar ramas remotas, mostrará la rama soloorigin/master
porque elremotes/
prefijo no es necesario.git log
veocommit fa9sd8jasdf98 (HEAD -> master)
, ¿qué significa esto? ¿Qué es HEAD en este caso? Pensé que actualmente era "maestro" y me estaba comprometiendoorigin/master
. Creo que tengo algo mezclado, ¿alguien podría ayudar a calmar? EDITAR ACTUALIZACIÓN: Creo que lo entendí, ¿es correcto suponer que HEAD actualmente está apuntando a la rama maestra, lo que significa que actualmente estoy en el proceso de comprometerme a dominar?Respuesta corta para tontos como yo (robado de Torek):
fuente
Técnicamente, en realidad no hay ninguna cosa "remota" en absoluto 1 en su repositorio de Git, solo hay nombres locales que deberían corresponder a los nombres de otro repositorio diferente. Los nombrados
origin/whatever
inicialmente coincidirán con los del repositorio desde el que clonó:hace una copia local del otro repositorio. En el camino, anota todas las ramas que estaban allí, y los commits a los que se refieren, y los pega en su repositorio local bajo los nombres
refs/remotes/origin/
.Dependiendo de cuánto tiempo
git fetch
pases antes de ti o de un equivalente para actualizar "mi copia de lo que está en algún lugar, donde esté", pueden cambiar sus ramas, crear otras nuevas y eliminar algunas. Cuando realice sugit fetch
(ogit pull
que realmente es buscar más combinar), su repositorio hará copias de su nuevo trabajo y cambiará todas lasrefs/remotes/origin/<name>
entradas según sea necesario. Es ese momento defetch
ing que hace que todo coincida (bueno, eso y el clon inicial, y algunos casos depush
ing también, básicamente cada vez que Git tiene la oportunidad de verificar, pero vea la advertencia a continuación).Git normalmente te hace referirte a los tuyos
refs/heads/<name>
como justos<name>
, y a los remotos comoorigin/<name>
, y todo funciona porque es obvio cuál es cuál. A veces es posible crear sus propios nombres de sucursal que no lo hacen obvio, pero no se preocupe por eso hasta que suceda. :-) Solo dale a Git el nombre más corto que lo haga obvio, e irá desde allí:origin/master
es "donde el maestro estuvo allí la última vez que lo verifiqué", ymaster
es "dónde está el maestro aquí según lo que he estado haciendo" . Ejecutegit fetch
para actualizar Git en "donde está el maestro allí", según sea necesario.Advertencia: en versiones de Git anteriores a 1.8.4,
git fetch
tiene algunos modos que no se actualizan "donde está el maestro allí" (más precisamente, modos que no actualizan ninguna rama de seguimiento remoto). Ejecutandogit fetch origin
, ogit fetch --all
, o simplementegit fetch
, se actualiza. Corrergit fetch origin master
no lo hace . Desafortunadamente, este modo "no se actualiza" es activado por ordinariogit pull
. (Esto es principalmente una molestia menor y se soluciona en Git 1.8.4 y versiones posteriores).1 Bueno, hay una cosa que se llama "remoto". ¡Pero eso también es local! El nombre
origin
es lo que Git llama "un control remoto". Básicamente es solo un nombre corto para la URL que usaste cuando hiciste el clon. Es también donde elorigin
enorigin/master
viene. El nombreorigin/master
se denomina rama de seguimiento remoto , que a veces se acorta a "rama remota", especialmente en documentación anterior o más informal.fuente
origin/master
pegatina en ellocal
gráfico del repositorio, y no en la etiquetaremote
(recomiendo de todo corazón la presentación "Git Happens" de Jessica Kerr para personas nuevas engit
: vimeo.com/46010208 . Me rascaba la cabeza entre las 30:00 y las 30: 19.)Intentaría simplificar la respuesta de @ ErichBSchulz para principiantes:
fuente
last time I've checked
, pierde un punto importante$ git remote add origin https://github.com/git/git.git
--- Ejecutará este comando para vincular su proyecto github al origen. Aquí el origen está definido por el usuario. Puedes cambiarle el nombre por$ git remote rename old-name new-name
$ git fetch origin
- Descarga objetos y referencias del repositorio remoto a su computadora local [origen / maestro]. Eso significa que no afectará a su rama maestra local a menos que las combine usando$ git merge origin/master
. Recuerde verificar la rama correcta donde necesita fusionarse antes de ejecutar este comandoNota: El contenido recuperado se representa como una rama remota. Fetch le brinda la oportunidad de revisar los cambios antes de integrarlos en su copia del proyecto. Para mostrar los cambios entre los suyos y los remotos
$git diff master..origin/master
fuente
Una aclaración (y un punto que me confundió):
"remotes / origin / HEAD es la rama predeterminada" no es realmente correcto.
remotes / origin / master era la rama predeterminada en el repositorio remoto (la última vez que verificó). HEAD no es una rama, solo apunta a una rama.
Piense en HEAD como su área de trabajo. Cuando lo piensa de esta manera, 'git checkout branchname' tiene sentido con respecto a cambiar los archivos de su área de trabajo para que sean los de una rama en particular. Usted "paga" los archivos de ramificación en su área de trabajo. HEAD a todos los efectos prácticos es lo que usted puede ver en su área de trabajo.
fuente
HEAD
es un "puntero a una rama" (el archivo real en su repositorio local a menudo contiene la cadenaref: refs/heads/master
, por ejemplo ... a menos que esté "separado", que es otra cosa completamente diferente). Sin embargo, hay una especie de error en la forma en queclone
interpreta la "CABEZA remota": los protocolos de transferencia no pueden enviar una rama indirecta en absoluto, solo un SHA-1 sin procesar, por lo que git tiene un error que hace que esto "funcione principalmente". Sin embargo, de vez en cuando alguien tropieza con un caso extraño. Desearía que git no creararemotes/origin/HEAD
nada, especialmente cuando sale mal ...Creo que esta notación de git slash probablemente se entienda mejor mirando dentro de su
.git
carpeta.Por ejemplo, aquí hay un árbol abreviado de mi .git para la base de origen de LibreOffice.
En Linux
sudo apt-get install tree
es útil para ver esto.En Windows , creo que el
tree
comando aún podría funcionar.Desplácese hacia abajo y eche un vistazo a las referencias (también conocidas como 'referencias') en la parte inferior:
Podría haber sido menos confuso si se presentara así, pero no fue así:
Tenemos tres tipos básicos de referencias: cabezas , controles remotos y etiquetas .
.git / refs / heads tiene nuestro maestro local .
.git / refs / remotes puede contener varios controles remotos, aunque por el momento solo tenemos origen en él.
.git / refs / tags (se discute en otra parte).
origen , por lo tanto, es nuestro único y remoto. Tiene origen / maestro .
Encontramos que tenemos 2 HEADS (punteros a las sucursales actuales), uno local y otro remoto:
Si enumeras tus sucursales :
A continuación, puede tener muchas sucursales de seguimiento remoto, y nosotros las tenemos aquí. Usted sabe que estas son ramas de seguimiento remoto porque tienen el prefijo ' remotes / '. Los que se muestran aquí son para el origen con nombre remoto.
Entonces, la segunda línea es el puntero de rama actual del origen . Mandos a distancia / origen: CABEZA - señala a -> maestro. Esto muestra que en el repositorio remoto, la rama actual es su rama llamada master , (no debe confundirse con nuestra rama local llamada master ).
Las ramas restantes no se encuentran en su .git / refs / tree, sino que las encontrará en
.git/packed-refs
.Cuando vamos a buscar , descargamos los cambios desde el repositorio remoto a nuestro repositorio de seguimiento remoto.
Cuando nos fusionamos , fusionamos los cambios en este repositorio de seguimiento local y remoto en nuestra sucursal o sucursales locales de trabajo, en este caso en nuestra sucursal maestra.
(Cuando hacemos git pull hacemos los dos pasos en una sola operación).
También es interesante observar que estos UUID remotos y locales para el maestro actualmente apuntan al mismo nodo (también conocido como 'commit'):
Entonces, nuestro maestro local apunta al mismo lugar que el maestro de origen del control remoto:
Finalmente, creo que también es útil echar un vistazo a
.git/packed-refs
Sin duda, esto deja más preguntas que respuestas, pero creo que puede comenzar a ayudarlo a responder sus propias preguntas sobre qué es qué.
fuente