Como esto está etiquetado con git , espero que mi falta de conocimiento de SVN sea descuidada.
Actualmente estoy clonando un repositorio y clono una rama específica usando gitk.
Está clonando todo el repositorio remoto, no solo una rama específica.
El repositorio se imagina mejor como una base de datos, por lo que está haciendo un clon del estado actual de la base de datos remota. Pero después de eso, está trabajando en su propia copia de esa base de datos; si se compromete, modifica su base de datos local.
El fetch
comando se utiliza para mantener la base de datos local sincronizada con la remota.
Por lo general, desde esa base de datos local, revisa una sucursal para trabajar. Esto no es más que un marcador interno para git, donde comenzó su trabajo actual.
Digamos que estás trabajando en un repositorio simple, donde no hay una rama además master
, puedes echar un vistazo a la .git
carpeta para desvelar la "magia":
Suponga que su último commit (on master
) fue 182e8220b404437b9e43eb78149d31af79040c66
, encontrará exactamente eso debajo cat .git/refs/heads/master
.
A partir de eso, ramifica una nueva rama git checkout -b mybranch
, encontrará exactamente el mismo puntero en el archivo cat .git/refs/heads/mybranch
.
Las ramas no son más que "punteros". El marcador de "trabajo" se llama a HEAD
.
Si desea saber dónde está su HEAD
está en:
cat .git/HEAD
que dice ref: refs/heads/mybranch
, por ejemplo , que a su vez apunta ( cat .git/refs/heads/mybranch
) a un hash de confirmación78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Las confirmaciones reales se almacenan en la objects
carpeta (el cómo es un tema propio).
La carpeta del proyecto contiene solo el contenido de esa rama y no puedo ver todas las ramas como en SVN, lo cual es un poco confuso para mí.
No confunda el working directory
con la "base de datos git" en su conjunto. Como dije anteriormente, su directorio de trabajo es solo una instantánea de (quizás) un subconjunto.
Digamos que tiene diferentes sucursales, su directorio de trabajo está dedicado a trabajar solo en esa rama (aunque podría colocar el trabajo desde allí en otro lugar).
Por lo general, si desea ver qué ramas están definidas para el proyecto, tiene la posibilidad de
git branch
para sucursales locales
git branch --remote
para sucursales remotas
git branch -a
para ambos
(o git branch -v
)
Dado que git es un sistema de control de versiones distribuido, no solo es posible, sino que se recomienda, hacer diferentes ramas localmente / remotas.
Mi flujo de trabajo típico es:
- bifurcar una ramificación característica
- bifurcar una rama WIP (trabajo en progreso) de ese
- trabaje como quiera, incluso si se compromete después de una sola línea; No importa
Cuando se completa la función:
- aplastar / reelaborar la
WIP
rama (con rebase interactivo) = hacer un solo commit desde ese
- fusionar la
WIP
rama en la rama de características y ofrecer que (si trabaja con github esa oferta se llamaría una "solicitud de extracción") para integrarse en la rama estable (maestra).
También me gustaría saber cómo manejar un proceso en el que necesito wprl en dos ramas al mismo tiempo en caso de que, por ejemplo, necesite hacer una revisión en master pero mantener el contenido de otra rama también.
Depende de cómo esté estructurado su proyecto:
Digamos que tienes un maestro estable. Y las características solo se desarrollan a partir de esa rama estable, por lo que generalmente está detrás de una rama de características. Entonces tendría un último commit en master que sería la raíz de la rama de características.
Luego, realizaría una confirmación en la rama maestra y podría decidir si fusionar ambas ramas o volver a crear una base (lo cual es una especie de fusión para usuarios con necesidades avanzadas, por así decirlo).
O siempre puede realizar cambios en las ramas (p master
. Ej. ) Y seleccionarlos en otras ramas.
¿Qué es un convenio de nombre recomendado para hacer que las carpetas que incluyen la rama clonada desde el repositorio en GIT, por ejemplo myproject-branchname
Es tu decision.
Por lo general, terminas con el nombre de los repositorios.
Pero hay ocasiones, cuando esto no se quiere:
por ejemplo, clonas oh-my-zsh con git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Aquí .oh-my-zsh
se nombra explícitamente como el objetivo.