tag - Git ramificación: maestro vs. origen/maestro vs. controles remotos/origen/maestro
qué tipos de etiquetas existen en git (6)
- origen : este es un nombre personalizado y más común para apuntar a remoto.
$ 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
- maestro : el nombre de la rama predeterminada en Git es maestro. Para computadoras remotas y locales.
- origen / master : esto es solo un puntero para referir la rama principal en el repositorio remoto. Recuerda que dije puntos de origen a distancia.
$ git fetch origin
- Descarga objetos y refs del repositorio remoto a su computadora local [origin / master]. Eso significa que no afectará a su rama principal local a menos que los fusione utilizando $ git merge origin/master
. Recuerde sacar la rama correcta donde necesita fusionar antes de ejecutar este comando
Nota: El contenido obtenido se representa como una rama remota. La búsqueda le brinda la oportunidad de revisar los cambios antes de integrarlos en su copia del proyecto. Para mostrar los cambios entre los tuyos y el $git diff master..origin/master
remoto de $git diff master..origin/master
Creo que estoy en el camino correcto para entender los conceptos básicos de git.
Ya configuré y cloné un repositorio remoto. También creé un repositorio vacío del lado del servidor y uní mi repositorio local.
Mi problema es que no entiendo la diferencia entre:
- origen / maestro vs. controles remotos / origen / maestro
Por lo que he entendido, el maestro es una rama local, y los controles remotos / origen / maestro son remotos.
Pero, ¿qué es exactamente origen / maestro ?
Intentaría simplificar la respuesta de @ ErichBSchulz para principiantes:
- origen / maestro es el estado de la rama principal en el repositorio remoto
- maestro es el estado de la rama principal en el repositorio local
Respuesta corta para dummies como yo (robado de Torek):
- origin / master es "donde el maestro estaba allí la última vez que lo revisé"
- master es "donde el maestro está aquí basado en lo que he estado haciendo"
Técnicamente no hay nada "remoto" 1 en tu repositorio de Git, solo hay nombres locales que deberían corresponder a los nombres en otro repositorio diferente. Las llamadas origin/whatever
que inicialmente coincidirán con las del repositorio clonado desde:
git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...
hace una copia local del otro repositorio. A lo largo del camino, toma nota de todas las ramas que estaban allí, y las asigna a las que se refieren, y las guarda en su repositorio local bajo los nombres refs/remotes/origin/
.
Dependiendo de cuánto tiempo vayas antes de que git fetch
o equivalente para actualizar "mi copia de lo que hay en algún sitio", pueden cambiar sus ramas, crear nuevas y eliminar algunas. Cuando hagas tu git fetch
(o git pull
que es realmente buscar más fusión), tu repos hará copias de su nuevo trabajo y cambiará todas las entradas de refs/remotes/origin/<name>
según sea necesario. Es ese momento de fetch
que hace que todo coincida (bueno, eso y el clon inicial, y algunos casos de push
también, básicamente cada vez que Git tiene la oportunidad de verificarlo), pero vea la advertencia a continuación).
Git normalmente hace que te refieras a tus propios refs/heads/<name>
como solo <name>
, y los remotos como origin/<name>
, y todo funciona porque es obvio cuál es cuál. A veces es posible crear sus propios nombres de rama que no lo hagan obvio, pero no se preocupe hasta que suceda. :-) Solo dale a Git el nombre más corto que lo hace obvio, y continuará desde allí: origin/master
es "donde el maestro estuvo allí la última vez que lo revisé", y el master
es "donde el maestro está aquí basado en lo que yo he estado haciendo". Ejecute git fetch
para actualizar Git en "donde el maestro está allí", según sea necesario.
Advertencia: en las versiones de Git anteriores a 1.8.4, git fetch
tiene algunos modos que no actualizan "donde el maestro está allí" (más precisamente, modos que no actualizan ninguna rama de rastreo remoto). Ejecutando git fetch origin
, o git fetch --all
, o incluso solo git fetch
, se actualiza. Ejecutar git fetch origin master
no . Desafortunadamente, este modo "no se actualiza" se desencadena por un git pull
normal. (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 "remota". ¡Pero eso también es local! El nombre de 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. También es de donde proviene el origin
en el origin/master
. El nombre origin/master
se denomina rama de seguimiento remoto , que a veces se abrevia como "rama remota", especialmente en documentos más antiguos o más informales.
Una aclaración (y un punto que me confundió):
"controles remotos / origen / HEAD es la rama predeterminada" no es realmente correcto.
remotes / origin / master fue la rama predeterminada en el repositorio remoto (la última vez que marcó). HEAD no es una rama, solo apunta a una rama.
Piense en HEAD como su área de trabajo. Cuando piensas de esta manera, ''git checkout branchname'' tiene sentido con respecto a cambiar tus archivos de área de trabajo para que sean los de una rama en particular. Usted "registra" los archivos de sucursal en su área de trabajo. HEAD para todos los fines prácticos es lo que está visible para usted en su área de trabajo.
Tome una clonación de un repositorio remoto y ejecute git branch -a
(para mostrar todas las ramas que conoce git). Probablemente se verá algo como esto:
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
Aquí, el master
es una sucursal en el repositorio local. remotes/origin/master
es una rama llamada master
en el origin
designado remoto. Puede referirse a esto como origin/master
, como en:
git diff origin/master..master
También puede referirse a él como remotes/origin/master
:
git diff remotes/origin/master..master
Estas son solo dos formas diferentes de referirse a la misma cosa (por cierto, ambos comandos significan "muéstreme los cambios entre la rama master
remota y mi rama master
).
remotes/origin/HEAD
es la default branch
para el origin
nombrado remoto. Esto le permite simplemente decir origin
lugar de origin/master
.