Quando confirmar o código?


59

Ao trabalhar em um projeto, o código pode ser desenvolvido razoavelmente rápido em um único dia ou pouco a pouco por um período prolongado de algumas semanas / meses / anos. Como as confirmações de código estão sendo consideradas como uma medida do desenvolvimento do projeto, isso realmente não significa que tenha mais código escrito do que um projeto que tenha confirmações menores.

Portanto, a questão é quando realmente fazer um commit no repositório para que o commit seja justificável?

Como complemento: É uma prática correta medir o desenvolvimento de um projeto com base em seus commits?


9
A maioria das coisas que são facilmente quantificáveis ​​são métricas ruins porque são simplificadas demais ou podem ser facilmente ajustadas para um bom desempenho em relação à medição específica.
Unholysampler

Obrigado a todos pelas contribuições. Há muitas razões válidas para fazer um commit que é distribuído pelas respostas, e não posso aceitar várias respostas, estou aceitando a resposta com o maior número de votos até agora. Mas eu aceito todas as suas respostas.

Respostas:


79

Você confirma quando atinge um estado da base de código que deseja lembrar. Existem várias razões pelas quais você pode se lembrar de um estado específico da base de código, portanto, não pode haver regras rígidas sobre quando confirmar. No entanto, o número de confirmações definitivamente não é uma medida de qualidade ou progresso.


10
Concordo, com o adendo de que o porta-malas é uma história diferente. Para fazer o check-in no tronco da minha equipe, por exemplo, ele precisa: a) construir corretamente eb) concluir alguma coisa. Qualquer membro da equipe é livre para criar um ramo embora e ele pode estar em qualquer estado que eles querem-lo.
Edward Estranho

34

Eu gosto de pensar em codificação como escalada neste contexto. Você sobe um pouco e depois coloca uma âncora na rocha. Se você cair, a última âncora que você plantou é o ponto que o protege, para que você nunca caia mais do que alguns metros. Mesmo com controle de origem; você codifica um pouco e quando atinge uma posição um pouco estável, comete uma revisão. Se você falhar terrivelmente, sempre poderá voltar para a última revisão e saberá que é estável.

Dito isto, se você trabalha em equipe, é habitual garantir que tudo o que você comprometa seja completo, faça sentido, construa de forma limpa e não quebre as coisas de outras pessoas. Se você precisar fazer alterações maiores que possam interferir no trabalho de outras pessoas, faça um ramo para poder se comprometer sem incomodar ninguém.

Também depende do sistema SCM que você está usando. Os sistemas distribuídos normalmente tornam a fusão e a bifurcação simples e rápidas, e você pode confirmar localmente; isso significa que você deve comprometer muito e pressionar / mesclar quando tiver realizado uma quantidade substancial de trabalho. Com sistemas centralizados como svn ou cvs, o comprometimento é mais caro e afeta a todos. A ramificação resolve parcialmente esse problema, mas, como acontece no servidor, pode ser dolorosamente lento e a fusão pode ser complicada. Portanto, com os SCMs centralizados, geralmente há uma cultura mais cuidadosa, na qual você só se compromete depois de realizar uma quantidade significativa de trabalho.

Quanto ao complemento: por favor, não faça isso. Linhas de código, número de confirmações, número de bugs encontrados / resolvidos etc. são medições muito ruins de qualidade ou quantidade.


Presumo que o mesmo se aplica a novas ramificações, onde todo novo desenvolvimento é confirmado em sua própria ramificação, que você pressionará quando o recurso estiver pronto? Ou seja. você pode confirmar até muito código incompleto em sua própria ramificação privada.
precisa saber é o seguinte

Sim, mas em menor grau, porque (veja a resposta original) você não incomodará ninguém diretamente. Dependendo do SCM em questão, geralmente é considerado uma boa prática limpar seu histórico de consolidação antes de mesclar o upstream (por exemplo git rebase -i).
Tdammers

13

Se você estiver usando DVCS como Mercurial ou Git, deverá se comprometer com seu repositório local sempre que tiver realizado uma quantidade significativa de trabalho. No entanto, apenas envie-o para o repositório compartilhado somente depois que estiver funcionando, uma mudança independente que foi testada.

Para VCS não distribuídos (como, por exemplo, SVN), a mesma lógica se aplica. Em vez de repositório local, use branch privado, em vez de push - merge para o branch principal.


+1 Surpreendeu que isso não foi mais votado. Esse foi o meu primeiro pensamento - DVCS ou vcs
Michael Durrant

9

Você deve se comprometer cedo e com frequência.

Conheço pessoas que cometem tantas vezes quanto a cada 90 segundos. A sério. Parece funcionar para eles. Eu experimentei confirmar sempre que salvar um arquivo, que provavelmente é mais frequente que 90 segundos. Hoje, eu provavelmente me comprometo a cada 15 minutos. Um VCS que permite compactar várias confirmações em uma e que permite confirmações locais (como git) facilita muito isso.

Com que frequência você deve se comprometer? Difícil dizer, mas provavelmente mais frequentemente do que você é agora. Continue cometendo cada vez mais, encontre um ponto que pareça absurdo demais e depois recue um pouco. É provável que você acabe com algo razoável.

Você mede o desenvolvimento de um produto com base no valor entregue aos seus usuários. Não há outra medida precisa.


11
+1. Quando você combina o BDD como quiser, o refator até cair, a codificação atômica e uma linguagem altamente expressiva, 90 segundos podem demorar muito tempo sem confirmação.
Jörg W Mittag

8

As confirmações são os componentes de qualquer código / dado controlado por versão. Cada confirmação deve fazer exatamente um dos seguintes:

  • Adicionar uma nova peça de dados ou função
  • Corrija um ou mais erros (um commit para cada correção, se possível) onde a correção pode ser:
    • Melhoria de desempenho
    • Corrigindo o comportamento incorreto do código
    • Removendo erros tipográficos
  • Refatorando código ou dados sem alterar a semântica. Isso inclui:
    • Reescrevendo código que se comporta idêntico ao original
    • Alterando a representação dos dados para um formato diferente
    • Formatar código ou dados para atender às diretrizes de formatação do projeto
  • Mesclar alterações de outra ramificação (upstream / downstream)

Além disso, ao trabalhar em ramificações, as confirmações devem ir para uma ramificação mais adequada. Duas confirmações não devem ter a mesma mensagem de confirmação (implicando alterações semelhantes), mas em ramificações diferentes, pois confunde os colaboradores. Uma maneira melhor é confirmar a ramificação principal e mesclar com a ramificação do recurso.

Se os confirmadores seguem a regra acima, torna-se trivial para:

  • Reverter uma alteração específica sem efeitos colaterais
  • Identificar comportamento que altera as alterações de código das alterações de formatação de código
  • Mesclar entre diferentes ramos, evitando a maioria dos conflitos
  • Colabore com outros desenvolvedores que podem fazer suas alterações com facilidade

Em relação à medição do progresso do projeto com base em confirmações, é possível se a refatoração de confirmações e a correção de erros não forem levadas em consideração.


Eu acho que essa resposta deve ser a resposta aceita, mas provavelmente a pergunta estava à procura de uma explicação mais simples :)
Behnam Rasooli

7

Confirme somente quando você tiver testado com êxito a função / módulo / funcionalidade fornecida e tiver certeza razoável de que ela está pronta para integração ou teste do sistema.

E para responder às suas perguntas adicionais - NÃO !! a medida de onde o projeto está nunca deve ser determinada pelo número de confirmações ... quem sabe o que realmente foi comprometido? Foi testado com sucesso no sistema ou mesmo testado em unidade. Só porque está comprometido - não significa que esteja pronto para produção.


5
Isso seria verdade se você estivesse se comprometendo com o tronco, mas se estivesse se comprometendo com uma ramificação de recursos ou uma ramificação privada, não há necessidade de estar pronto para integração.
Neil Butterworth

11
@ Neil Butterworth: ... a menos que haja outros desenvolvedores trabalhando no mesmo ramo com algumas dependências no seu código.
FrustratedWithFormsDesigner

@Frustrated Nesse caso, certamente deve ser compilável, mas não vejo que deva estar pronto para integração e teste do sistema.
Neil Butterworth

11
Dicotomia interessante aqui entre vcs distribuídos e centralizados. Com os vcs distribuídos, isso nunca seria uma preocupação, pois você pode comprometer-se a apresentar ramificações localmente e manter-se fora do caminho de outros desenvolvedores.
George Mauer

2
@ George - Esta é uma dicotomia falsa. A dicotomia real é entre o uso de filiais privadas (por desenvolvedor) ou públicas (compartilhadas por vários desenvolvedores). Isso é ortogonal para o uso de um VCS centralizado de distribuído (no entanto, os DVCSs incentivam filiais privadas, pois as filiais começam como particulares até você publicá-las).
Stephen C. Steel

6

Como complemento: É uma prática correta medir o desenvolvimento de um projeto com base em seus commits?

Não. Havia uma WTF diária sobre por que essa é uma idéia horrível.

Minha regra geral de confirmação de código é fazer check-in quando tiver concluído um pedaço de código e ele for compilado. Chunk não está realmente definido. Se for uma tarefa pequena, talvez não faça o check-in até terminar. Se for maior, posso fazer check-in após a conclusão de cada parte lógica.

Mas nunca faça check-in se não compilar. Eu sei que parece uma coisa estúpida dizer em voz alta, mas eu já tive que explicar isso para as pessoas antes.


11
+1 para aviso de compilação. Tínhamos um cofrinho no escritório, onde todos tinham que pagar uma taxa cada vez que cometiam algo que resultou em uma falha na compilação. Infelizmente nós temos algum dinheiro desta forma, pelo menos inicialmente :)
Ray

@ Ray - em meu último lugar, a multa foi para o fundo de loteria. Infelizmente, nunca ficamos ricos com esse mau hábito. : P
Tyanna

1

Faça uma confirmação quando o código estiver pronto para ser compartilhado com outros usuários do código - quando estiver relativamente estável, seguro e testado corretamente.

E não, eu não acho que as confirmações são uma ótima métrica para o desenvolvimento de um projeto, porque conheço alguns desenvolvedores que confirmarão todas as alterações pequenas e pequenas e outros que confirmarão apenas grandes alterações na funcionalidade. Como você mede quantitativamente o valor de um commit em detrimento de outro?


Lembre-se de que, com sistemas distribuídos, commit! = Share. Você deve pressionar quando tiver algo pronto para ser compartilhado.
precisa

@ Rein Henrichs: Bom ponto, embora o controle de origem aqui no trabalho não tenha essa funcionalidade (pelo menos até onde eu saiba). Quando algo é comprometido, todos os outros no projeto podem ver e ressincronizar (e geralmente fazem isso, às vezes às cegas).
FrustratedWithFormsDesigner

O que pode ser uma indicação de que você pode se beneficiar de melhores ferramentas. Tudo o que impede confirmações frequentes é um impedimento desnecessário.
precisa

@ Rein Henrichs: Não vou discutir isso !!
FrustratedWithFormsDesigner

1

Assim que a tarefa correspondente for concluída . Uma tarefa faz parte de uma história de usuário .

Uma tarefa é concluída quando:

  • os testes unitários correspondentes passam,
  • código está devidamente documentado e
  • código é confirmado.

Você pode ter uma definição diferente de concluído .

Não vejo o valor em medir o número de confirmações. No entanto, se você vir alguém trabalhando por um longo período na mesma história de usuário (ou pior, histórias), isso é um cheiro.


1

Confirme todas as mudanças significativas que você acha que quebram alguma coisa. A única coisa que você não deve confirmar são as mudanças de estilo, porque elas não incorporam alterações na lógica. Mas, caso contrário, quanto menores as alterações que você confirmar, melhor.

Quanto menor a consolidação, mais detalhado você pode documentar o processo de reflexão, que é um aspecto de um bom registro de consolidação. Uma boa revisão de código não deve ser apenas sobre o resultado do código, mas também o processo de reflexão.

Além disso, ter muitos commits pequenos facilita a divisão, um recurso muito pouco usado do controle de versão, que me salvou muitas horas procurando bugs de agulhas nas bases de código do palheiro.

Dividindo em resumo; Descubra um problema na base de código atual. Em seguida, escolha uma confirmação no changelog em que você tem certeza de que o problema específico não existia. Comece verificando o commit no meio, entre a versão "boa" e a "ruim". Teste para verificar se o problema ainda está presente. Se for, você precisa olhar mais para trás, no meio do "bom" e do commit testado anteriormente. Se o problema desaparecer, ele foi introduzido após essa alteração específica; portanto, é necessário verificar o meio entre o commit "ruim" e o commit testado anteriormente. Repetir. Eventualmente, você terminará com o commit que introduziu o problema. Mas somente se você tiver pequenas confirmações, caso contrário, você saberá em que grande pilha de mudanças o problema ocorreu.

Aqui está como ele funciona com o Git, mas o principal se aplica a qualquer controle de versão.


isso não parece oferecer nada substancial sobre os pontos apresentados e explicados em 10 respostas anteriores. Além disso, o último parágrafo parece se referir ao recurso específico-git enquanto a questão não parece ser sobre git
mosquito

A divisão não é específica para o git. Isso pode ser feito com qualquer tipo de controle de versão, este foi apenas um exemplo quanto eu estou ciente Git tem que construir.
Jasper Kennis

-1

Quando:

  • constrói (SEMPRE)
  • testes de unidade passam
  • funciona (a menos que esteja claramente marcado como "trabalho em andamento")
  • os benefícios de salvar o estado do código superam os problemas de executar os testes, pensar em uma boa mensagem de confirmação e resolver qualquer conflito de mesclagem durante o processo de confirmação

votado por essa é a nossa melhor prática.
jersoft
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.