Como isso está marcado com git , espero que minha falta de conhecimento sobre SVN seja negligenciável.
Atualmente, estou clonando um repositório e clonando um ramo específico usando o gitk.
Você está clonando todo o repositório remoto, não apenas uma ramificação específica.
O repositório é melhor imaginado como um banco de dados, portanto, você está criando um clone do estado atual do banco de dados remoto. Mas depois disso, você está trabalhando em sua própria cópia desse banco de dados; se você confirmar, alterará seu banco de dados local.
O fetch
comando é usado para manter o banco de dados local sincronizado com o remoto.
Geralmente a partir desse banco de dados local, você faz check-out de uma filial para trabalhar. Isso nada mais é do que um marcador interno para o git, onde seu trabalho atual começou.
Digamos que você esteja trabalhando em um repositório simples, onde não há ramificações além disso master
, você pode dar uma olhada na .git
pasta para desvendar a "mágica":
Suponha que seu último commit (on master
) foi 182e8220b404437b9e43eb78149d31af79040c66
, você encontrará exatamente isso em cat .git/refs/heads/master
.
git checkout -b mybranch
Depois que você ramifica uma nova ramificação , você encontrará exatamente o mesmo ponteiro no arquivo cat .git/refs/heads/mybranch
.
Ramos não passam de "ponteiros". O marcador "ativo" é chamado de HEAD
.
Se você quiser saber onde HEAD
está:
cat .git/HEAD
que diz ref: refs/heads/mybranch
, por exemplo , que, por sua vez, aponta ( cat .git/refs/heads/mybranch
) para um hash de confirmação78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
As confirmações reais são armazenadas na objects
pasta (como é um tópico próprio).
A pasta do projeto contém apenas o conteúdo desse ramo e não consigo ver todos os ramos como no SVN, o que é um pouco confuso para mim.
Não confunda o working directory
"git-database" como um todo. Como eu disse acima, seu diretório de trabalho é apenas um instantâneo de (talvez) um subconjunto.
Digamos que você tenha ramificações diferentes, seu diretório de trabalho é dedicado a trabalhar somente nessa ramificação (embora você possa colocar o trabalho de lá em outro lugar).
Geralmente, se você deseja ver quais ramos são definidos para o projeto, você tem a possibilidade de
git branch
para filiais locais
git branch --remote
para filiais remotas
git branch -a
para ambos
(ou git branch -v
)
Como o git é um sistema de controle de versão distribuído, não é apenas possível, mas incentivado, criar diferentes ramificações localmente / remotas.
Meu fluxo de trabalho típico é:
- ramificar um recurso ramificar
- ramificar uma ramificação WIP (trabalho em andamento) dessa
- trabalhe como quiser - mesmo se você confirmar após uma única linha; Não importa
Quando o recurso estiver concluído:
- esmagar / retrabalhar a
WIP
ramificação (com rebasing interativo) = fazer uma única confirmação a partir dessa
- mescle a
WIP
ramificação na ramificação de recursos e ofereça que (se você trabalha com o github, essa oferta seria chamada de "solicitação de recebimento") para integrar na ramificação estável (mestre).
Também gostaria de saber como lidar com um processo em que preciso trabalhar em duas ramificações ao mesmo tempo, caso, por exemplo, precise fazer um hotfix no master, mas também manter o conteúdo de outra ramificação.
Depende de como o seu projeto está estruturado:
Digamos que você tenha um mestre estável. E os recursos são desenvolvidos apenas a partir desse ramo estável - portanto, geralmente ele está atrás de um ramo de recurso. Então você teria um último commit no master que seria a raiz do ramo do recurso.
Em seguida, você faria um commit na ramificação principal e poderia decidir mesclar as duas ramificações ou fazer uma nova reformulação (que é uma espécie de mesclagem para usuários com necessidades avançadas, por assim dizer).
Ou você sempre pode fazer alterações nos galhos (por exemplo master
) e selecioná-los em outros galhos.
O que é uma convenção de nome de recomendação para tornar as pastas que incluem a ramificação clonada do repositório no GIT, exemplo myproject-branchname
É com você.
Normalmente, você acaba com o nome dos repositórios.
Mas há ocasiões em que isso não é desejado:
por exemplo, você clona oh-my-zsh com git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Here .oh-my-zsh
é explicitamente nomeado como o destino.