como usar o controle de versão

19

Estou desenvolvendo um site em php em localhost e, à medida que os módulos são concluídos, carrego-o na nuvem para que meus amigos possam testar o alfa.

Enquanto continuo desenvolvendo, tenho muitos arquivos e perco o controle de quais arquivos editei ou alterei etc. Ouvi falar de algo como 'controle de versão' para gerenciar todos eles, mas não tenho certeza de como funciona.

Portanto, minha pergunta é: Existe uma maneira fácil / serviço / aplicativo disponível para rastrear todas as edições / alterações / novos arquivos e gerenciar os arquivos à medida que desenvolvo o site. Assim que terminar um módulo, quero carregá-lo na nuvem (estou usando o Amazon Cloud Service). Se algo acontecer com os novos arquivos, talvez eu queira voltar ao arquivo antigo. E talvez, em um clique ou dois, eu consiga ver os arquivos que editei ou alterei desde o último que carreguei?

ptamzz
fonte
5
Há muitas sugestões sobre qual sistema de controle de versão usar e, para ser honesto, todas elas são melhores do que a maneira "manual" atual.
8272 Johan

Respostas:

28

O gerenciamento de configuração de software , do qual o Controle de versão faz parte, é um pouco mais complexo do que acompanhar as alterações nos arquivos, embora você certamente possa começar com isso. Mas leia os artigos da Wikipedia relacionados acima, juntamente com o tutorial de Joel Spolky sobre Mercurial .

Para começar, escolha um Mercurial, GIT ou Bazaar, nessa ordem, e instale-o junto com as ferramentas para o seu IDE e sistema operacional (eu prefiro o Mercurial com HGE for Eclipse).

  1. Inicialize um repositório a partir do seu diretório de trabalho ( hg init com Mercurial) ..
  2. Decida quais arquivos e diretórios você deseja rastrear e quais não. A regra geral é não rastrear arquivos gerados por compiladores e outras ferramentas.
  3. Use o comando para adicionar os arquivos e diretórios ao repositório ( hg add for Mercurial).
  4. Informe a ferramenta sobre os padrões dos arquivos que você não deseja rastrear (edite .hgignore para Mercurial).
  5. Execute uma confirmação para rastrear as versões originais ( hg ci ).
  6. Execute uma confirmação após cada marco lógico, mesmo que seja pequeno.
  7. Adicione novos arquivos ao criá-los.
  8. Repita os dois últimos.
  9. Faça backup do diretório de trabalho e do repositório com a frequência razoável.

Com seus arquivos no repositório, você pode conhecer as diferenças entre as duas versões de um arquivo ou diretório ou o projeto completo ( hg diff ), ver o histórico de alterações ( hg hist ) e reverter as alterações ( hg up -r )

É uma boa idéia marcar ( hg tag ) o repositório antes de publicar seu código, para que haja uma maneira fácil de voltar exatamente ao que você publicou para alterações ou comparações.

Se você quiser experimentar uma linha de desenvolvimento diferente, faça-o em uma ramificação simples, clonando o repositório principal ( hg clone ) e não recuando até que o experimento seja conclusivo. É tão fácil quanto ter um diretório de trabalho diferente para o experimento.

Se a experiência for para uma versão nova e atualizada, clone e ramifique (ramificação hg ) para manter todas as cópias dos repositórios atualizadas sem que uma experiência interfira na outra.

Linus Torvalds (que lida com dezenas de milhares de arquivos e milhões de linhas de código em seus projetos) fez uma palestra no Google sobre por que a ferramenta não pode ser CVS, SVN ou qualquer um dos muitos gratuitos e comerciais disponíveis ; vale muito a pena assistir.

Apalala
fonte
1
Eu prefiro o Mercurial também. Eu gosto do suporte no Netbeans porque, enquanto você está codificando, mostra todas as linhas que foram alteradas desde seu último commit. Também codifica com cores arquivos novos / alterados / inalterados na árvore do produto. Que soa como seria útil para o OP: I lose track of which file I've edited or changed. A HGE também pode fazer isso, eu não a usei.
JD Isaacks #
1
+1 para descrever o processo, bem como parte de como usar as ferramentas para fazê-lo.
Donal Fellows
Como uma pergunta secundária, o .xcodeprojarquivo que o Xcode usa para projetos iOS seria considerado algo a dizer ao Mercurial para ignorar ou é importante manter o arquivo sincronizado?
Kevin Yap
1
@Kevin Eu não conheço o Xcode, mas os IDEs e as ferramentas mais recentes têm arquivos de configuração separados para itens gerais do projeto (versões de idiomas e bibliotecas, regras de formatação de código, dependências etc.) e preferências do usuário (diretórios onde coloco itens, painel layout, skins, tamanho da fonte, assinatura pessoal). O primeiro pode ser incluído no repositório se a equipe concordar. O último não deve ser incluído, porque uma atualização do repositório substituirá suas preferências pelas de outra pessoa e isso se tornará rapidamente irritante e contraproducente.
Apalala
1
@ John: O NetBeans faz isso para todos os VCS que ele suporta. Neste ponto, é apenas um recurso básico dos IDEs.
Mike Baranczak
13

Eu recomendo o Git. Saiba mais aqui: https://lab.github.com/

Se você não gosta do Git, existem outras soluções de controle de versão. Você pode conferir o SVN.

Todd
fonte
1
Como um usuário comum do Git, gostaria de acrescentar que é extremamente fácil e intuitivo captar os comandos essenciais. E o suporte é ótimo para que você não se perca ao procurar ajuda. Eu usei o SVN, mas não foi tão fácil para mim, mas pode ser bom para muitos usuários.
Muhammad Usman
1
+1 Considere também: as pessoas escolhem mudar de svn (um VCS) para git (um DVCS - d = distribuído), mas não de GIT para SVN (por opção).
Michael Durrant
7

É só você ?, use um DVCS

Por mais contra-intuitivo que pareça, é melhor começar com um Sistema de Controle de Versão Distribuído (mercurial, git, bazar) do que um sistema centralizado (svn, cvs). Por quê ?, você o instala em sua máquina e executa seu repositório localmente, e é isso. Em um sistema centralizado como o svn, você precisa configurar seu cliente e um servidor ... e, em seguida, você precisa se conectar a um servidor para armazenar suas alterações.

Com um DVCS, você é o repositório local e, se desejar, pode usar um serviço como bitbucket.org ou github.com.

IMHO, mercurial é um DVCS mais amigável e igualmente capaz para começar.

Existem outros ?, use um DVCS!

Existem inúmeras vantagens ao usar um DVCS para trabalhar com uma equipe, a mais importante em contraste com um sistema centralizado é que não existem corridas de confirmação e isso ocorre porque, tecnicamente, o repositório de cada indivíduo é uma ramificação e quando você compartilha seu altera essas ramificações que são mescladas para você e você nem percebe, o que significa que, em vez de ter um histórico de versões como este, onde você tem pessoas canalizando seu trabalho em linha reta:

insira a descrição da imagem aqui

Você acaba tendo algo parecido com isto, onde todos cometem ad hoc:

insira a descrição da imagem aqui

Cada um se preocupa com seu próprio trabalho durante o controle de versão (ou seja, não corre para confirmar) e não se preocupa com uma conexão com um servidor apenas para confirmar.

Boa sorte

dukeofgaming
fonte
1
+1 Exemplos muito bons! Você deve editar para enfatizar a dor ausente em árvores de mesclagem complexas com ferramentas modernas.
Apalala 8/11
5

Para ser breve, existem muitas alternativas, entre as quais o Subversion (SVN) e o Git parecem mais populares (portanto, é mais fácil encontrar soluções na web).

Ambos diferem. O SVN é mais simples, mas o Git não exige que você tenha um servidor - você pode controlar a versão localmente.

Supondo que você tenha Linux e deseje começar a usar o Git:

  1. Instale o Git
  2. Vá para o diretório e execute o comando 'git init'
  3. Aprenda a adicionar arquivos, revisar alterações, enviá-las ...
  4. ... e fazer coisas mais avançadas (revisando logs, revertendo alterações, ignorando arquivos, criando ramificações, mesclando-as, criando e usando controles remotos, usando submódulos, usando suporte a SVN etc.).

Espero que isso ajude você a começar.

Tadeck
fonte
1
O SVN não requer um servidor, mas exige que o repositório esteja em um diretório diferente do servidor. O SVN e o CVS geralmente são preteridos em favor de ferramentas como GIT e Mercurial, que não exigem uma conexão de rede para o trabalho diário e não exigem um repositório central para o desenvolvimento de software distribuído e colaborativo.
Apalala 7/11
Você não acha que isso é realmente idêntico à criação do servidor de repositório SVN no host local? O que você precisa é configurar e manter o repositório central e, quando você move seus arquivos, deve certificar-se de que o repositório SVN ainda esteja acessível (nem pense em copiar todo o repositório central toda vez que você mover arquivos para uma máquina diferente). Também não acho que o Subversion esteja obsoleto (embora não esteja falando do CVS) - ele é apenas centralizado e, em alguns casos, seria uma idéia melhor reforçar a centralização.
Tadeck
Apalala, alguma pergunta: como o Mercurial lida com informações de quais usuários criaram alterações específicas? No Git, você pode alterá-lo e confirmar a alteração como outra pessoa, criando assim uma bagunça (há algum recurso para distinguir o commiter do remetente, mas não é óbvio o suficiente). A Mercurial resolveu esse problema relacionado ao controle de versão distribuída?
Tadeck
2
@Tadeck Não é assim que Mercurial e GIT funcionam, no meu entendimento. Nestas, uma única pessoa é responsável pelo que entra em um repositório, seja por commit, pull ou patch. Nos repositórios distribuídos, se alguém tiver privilégios de envio, você já confia neles com todo o seu coração. Linus Torvalds explica bem nesta conversa: youtube.com/watch?v=4XpnKHJAok8
Apalala 7/11
@Tadeck Em relação ao SVN, eu o usei bastante e acabei pensando que não havia melhorias no CVS (que pelo menos possui repositórios ASCII simples e está maduro o suficiente para nunca corrompê-los). Novamente, Torvalds explica isso bem no vídeo que eu vinculei antes. A incapacidade de trabalhar offline e a incapacidade de mesclar tornam obsoletas as ferramentas antigas do SCM.
Apalala
2

Como o Apalala sugere, eu recomendo o check-out do hginit . Como você é novo no controle de versão, pode pular a primeira página. Isso deve lhe dar uma boa introdução; depois, você pode postar no SO se tiver perguntas específicas.

JD Isaacks
fonte
0

Eu vou contra a opinião da maioria e recomendo o Subversion. O Subversion é fácil de usar e faz todo o material necessário para indivíduos e equipes pequenas. É um produto maduro, portanto, todo IDE disponível no mercado tem um bom suporte. Sim, ele não tem todos os recursos do Git. (Eu nunca usei o Mercurial, então não falarei sobre isso.) Mas a maioria dos desenvolvedores não precisa desses recursos adicionais.

Vários repositórios? Tenho certeza de que existem usos legítimos para esses, mas nunca os encontrei.

Ser capaz de fazer confirmações locais, sem acesso à rede? É bom ter isso, se você estiver fazendo várias alterações discretas e não puder acessar o servidor de repositório - mas, honestamente, com que frequência isso acontece?

O Git facilita o processo de ramificação e fusão. Mas para uma equipe de uma pessoa, isso não é grande coisa.

Para algo na escala do kernel Linux - sim, use Git. Para o resto de nós, o Subversion é bom o suficiente.

Mike Baranczak
fonte
Downvoting. Os recursos do Git que não estão no SVN (como ramificação leve e fácil mesclagem) são úteis, talvez até essenciais, em projetos pequenos e grandes.
Marnen Laibow-Koser,
1
@ MarnenLaibow-Koser Sim, essa era minha opinião na época, mas depois de usar o Git profissionalmente por vários anos, eu teria que concordar com você.
Mike Baranczak
Excelente! Você será assimilado. : D
Marnen Laibow-Koser