web-dev-qa-db-ja.com

単独の開発者にとってバージョン管理の習慣は最適ですか?

私は自分の仕事の唯一の開発者であり、VCSの利点を理解しています。良い習慣に固執するのは難しいと思います。現在、私はgitを使用して主にWebアプリを開発しています(自分の仕事のためにオープンソースになることは決してありません)。

私の現在のワークフローは、開発サイトに多くの変更を加え、テストし、修正し、テストし、満足して変更をコミットしてから、ライブサイトにコミットをプッシュします(つまり、大きな新しい変更に取り組んでいる場合は、週に1回コミットしますが、私のIDEには、コミットされていないものの元に戻す履歴があります)。

基本的に、私はマシンを切り替えるときにのみgitを使用しています(たとえば、仕事用の開発用コンピューターから自宅の開発用コンピューターに、またはライブマシンに)。ただし、日中は本当にメリットがわかりません。これは私に変更の長いランドリーリストをもたらすことになります(そして、コミットごとに良いメッセージを見つけるのに苦労します、そして私がラッシュにいるときはいつでも-「管理者とテンプレートへのその他の変更」のようなくだらないメッセージを残す傾向があります)。

どのくらいの頻度でコミットすべきですか? 1行の変更ごとにコミットする必要がありますか?テストの前にコミットする必要がありますか(たとえば、少なくとも構文/コンパイルエラーの場合は、完全に元に戻す必要があります。アイデアが機能しなかった、またはメッセージが嘘だったため)。

毎朝/午後、まだ新鮮な間に夕食を取りやめる前に必ずコミットする必要がありますか? VCSの習慣が悪いために見逃しているものは何ですか?

36
dr jimbob

あなたはたくさん欠けています。

ある意味、私もソロです。重要な変更を行うたびに、または重要な変更を開始する前にコミットするので、物事を台無しにした場合、そして大きなことをしていなくても、時々戻ることができます。毎日ではないが、近い。時々一日に数回。

いつでも帰れるということです。たくさんあります。また、ブランチを順序付けておくと役立ちます。

それは私に多くの秩序を与えると思います。

私はsvnを使用していますが、うんざりしています。しかし、他のことを学ぶためにより多くの時間を費やすことはできません。

幸運を。

24
cauchy

頻繁にコミットする必要があります。論理的なマイルストーンに到達したら、必ずコミットする必要があります。それが1日より長くかかる場合は、少なくとも作業日の終わりにコミットするか、さらに良いことに、作業をより小さなチャンクに分割する必要があります。

それには多くの理由があります。たとえば、コンピュータがクラッシュした場合はどうなりますか? 1週間または1か月の仕事よりも1日の仕事だけを失う方がはるかに良いです。もう1つの理由は、頻繁なコミットによりバグを特定しやすくなることです。バイナリ検索を実行して、バグの原因となった小さな変更を特定できます。

もう1つ:コミットする前に、diffを実行して、加えたすべての変更を確認する必要があります。これにより、すべての変更に意味があること、および何も忘れていないことを確認できます。これは、より良いコミットメッセージを思いつくのにも役立ちます。そしてもちろん、これは頻繁にコミットするもう1つの理由です。1か月よりも1日分の変更を行う方がはるかに簡単です。

18
Dima

CVSを最大限に活用するには、一度に1つの機能/バグ修正に取り組み、その機能/バグ修正が完了したらコミットする必要があります。これを行うことにより、以下が得られます。

  • コミットメッセージは作成がより簡単になり、より意味のあるものになります。
  • 将来のバグを追跡して、それらを導入した変更に簡単に戻すことができます。
  • 以前の状態に簡単に戻すことができます(たとえそれが失敗した機能を失うことを意味するが、その後発生したバグ修正は維持する場合でも)。

また、PCを切り替えるため、少なくとも2つのブランチが必要です。

  • 常に機能する「準備完了」ブランチ(もちろん、開発ブランチで取り組んでいるバグを除く)
  • ときどき実行不能な状態になる可能性のある開発ブランチ(仕事帰りなど;)。
10
Ethan Furman

1行の変更ごとにコミットを取得する必要がありますか?

それがバグを修正するものであるなら、確かに。

悪いVCS習慣を持っていることで私が見逃しているものは?

私は「悪いVCS癖」を持った男と一緒に働いた。彼は一人で仕事をするのが大好きで、年間$ 1,000,000のようなものをもたらす製品ラインを担当していました。彼はボスが彼をしつこく言ったときだけコミットするでしょう。その後、ある日彼のハードドライブがクラッシュしました。交換用のセットアップを行った後、彼の最後のチェックインは6か月前であることがわかりました。 VCSはソースセーフだったので、他に何が問題だったか、最後のコミットが破損していたと推測できます。彼の製品ラインの破損していないバージョンを入手するには、1年以上前に戻る必要がありました。彼は解雇されるべきだったにもかかわらず、彼は解雇されなかった。

別の逸話は私自身が関係しています。以前は、取り外し可能なハードドライブに趣味や研究プロジェクトのコードを保存していました。ある日、私のアパートが壊れました。ラップトップ(破損)とすべてのリムーバブルハードドライブが盗まれました。すべてのDVD(Red Dawnを除く)が盗まれました。デスクトップコンピュータはどれも盗まれませんでした。オフサイトのソース管理があったとしても、15年分のプロジェクトを失うことはなかったでしょう。特に、いくつかのプロジェクトは学術プロジェクトに基づいていたためです。多くの教授が大学を離れて民間産業に行ったため、これらのプロジェクトは企業のIPブラックホールに姿を消しました。失われたコードを回復することは不可能です。

どのくらいの頻度でコミットすべきですか?

いくつかの指標に分類します。

  • コンピュータが故障した場合、どれだけの作業を失うことになりますか?または盗まれますか?

  • これでBug_1234が修正される場合は、「fixes Bug_1234」というコメントを使用してコードを確認してください。

  • これが論理的な配信/マイルストーンである場合は、「Bug_1234、form_xyz」(または適切な場合はTask_1234)などのコメントを付けてチェックインします。

  • 必ず、金曜日の夜に帰宅する前にコードをチェックインしてください。また、休暇に出る前に、すべてのチェックイン(またはチェックアウトの取り消し)を行ってください。

  • 会社の方針が指示する時はいつでも。

7
Tangurena

行数の変化の観点から考えないでください。機能のチャンクで考える。 VCSを使用すると、各機能チャンクの中心的な場所に見出しを付けることができるため、「ここで何が起こったか」を簡単に確認できます。 git log。

また、EclipseのようなIDEを使用すると、特定の行をポイントし、それを表示されている形にしたコミットに移動できます。つまり、ソース行からコミットに直接進むことができます。コミットが小さく、適切なメッセージがある場合、「大量のバグを修正する」よりもはるかに役立ちます。

5
user1249

このように変更をグループ化することで見逃している最大のことは、いつ、どこでバグが発生したかを追跡できることです。

私の経験では、いくつかのバグが導入されてから2〜3週間後にいくつかのバグに気づき、1週間分のコミットをふるいにかけることは、事実のかなり後に困難になります。これらの場合、コミットをバイナリ検索して問題の原因となった個々の変更を追跡することは役に立ちました。これらのバグは、主にC++コードのメモリ使用に関するバグであるため、プロジェクトではそれほど発生しない可能性があります。

チームで開発するときは、他の利点が役立ちます-単純なコミットコメント、マージの容易さ、バグ修正へのコミットの関連付けなど。

ワークフローでは、毎日または半日ごとにコミットを開始する場合、タグまたはブックマークを使用して、ライブサイトで使用されているコードのバージョンを追跡する必要があると思います。それは追跡する最も重要なことだと思います。

4
tugs

私もソロ開発者で、SVNを使用しています。データベースの構造とデータベース内のテストデータをxmlに変換するツールを作成して、ソース管理に含めることもできます。

私は通常、自律的な作業単位を完了するたびにコミットします。ときどき、些細で無関係な一連の単一行の修正をあちこちで実行すると、それらすべてをまとめてコミットしますが、単一行の修正が2つの無関係な大きな自律型作業単位間で発生すると、独自の修正が行われますコミット、それは何も悪いことではありません。

また、私は常にコンパイルするコードをコミットし、ほとんどすべての基本的なテストにも合格するコードをコミットします。そうでない場合は、コミットメッセージに「DOES NOT WORK」が含まれていることを確認します。これが起こる唯一のケースは、まだ十分に機能していなくても失いたくない重要な変更を行ったときです。これに加えて、私は素晴らしいリファクタリングの冒険に乗り出そうとしています。それは成功するでしょう。それで、私はそれを台無しにして捨てなければならないという危険を冒す前に、私がこれまでに行った作業のバックアップとしてリポジトリを使用します。

これは、ソースコードをコミットする必要があるときは常にコミットすることを意味します。朝のコミットまたは夜のコミットのルールを設定してもまったく意味がありません。コードが存在する状態であり、コミットする時であるかどうかを決定します。

リポジトリーに入れるメッセージはそれほど重要ではありません。どうしても意味のある何かを思い付くことができない場合でも、必要なときにコミットしないよりも、空白のメッセージでコミットする方が適切です。

思いつくものすべてが愚かに聞こえるために適切なコミットメッセージを考えることができない場合は、これは問題ないことを覚えておいてください。コミットメッセージは明白な状態を示すことが期待されているので、あなたがそれらを書いているとき、それらはあなたに愚かに聞こえるはずです。しかし、私を信じてください。もしあなたが1か月後に古いリビジョンを調べる必要があるなら、あなたは何のメッセージよりも愚かなメッセージでさえ感謝するでしょう。

4
Mike Nakis

「論理的」な変更を行うたびにコミットします。たとえば、新しい機能を実装する場合は、段階的にそれを実行します。これらの各ステップは通常、相互に依存しています。したがって、これらのステップを個別にコミットし、コミットメッセージで各ステップが必要な理由を説明できます。

コミットメッセージは本当に重要です。 whatしていることを伝えないでくださいwhyしていることを伝えます。コードはすでに変更を文書化していますが、6か月後にはなぜ変更を加えたのかを知ることができます。

これは、偶然誰かが飛び込んできて、あなただけではなくなった場合にも役立ちます。たとえあなたにとっても、きれいな履歴があれば、git blameを使用して、バグのある行がいつ、なぜ変更されたかを簡単に知ることができます。

泥の大きなボールの変更の代わりに小さなコミットを行うことで、中間状態をテストすることもできます。何かを緊急にリリースする必要がある場合は、変更を隠しておくことができます。以前に機能していたときにバグを導入した場合、そのバグを導入したのがコミットされていない変更かどうか、または古いコミットであったかどうかを隠して確認できます。

また、git bissectの威力を発揮して、この厄介なバグであるというコミットを伝えることもできます。コミットが2,000行の長さである場合でも、それは役立ちますがそれほど多くはありません...

もう1つは、それが継続的インテグレーション(CI)、次に継続的デプロイメント(CD)の最初のステップであることです。 CIとテストは新しいコミットでトリガーできるため、変更をプッシュするたびに、何かが壊れているかどうかがわかります。これにより、展開しても安全かどうかを確認し、Rushにいるときのリリースの直前ではなく、問題が発生した時点で通知されます。

他の質問について:

  • git rebase --interactiveを使用して)履歴を書き直そうとしない限り、コンパイルさえしなかったものをコミットしないでください。
  • 1行の変更は、別の目的がある場合(バグの修正、または現在コミットされていない変更とは無関係)のコミットに値します。それらをステージングするには、git add --patchを使用します。
  • あなたが失うわけにはいかない重要なものがない限り、夕食の前に自分を強制する必要はありません。その場合、進行中の作業を別のブランチにコミットすることができます。
  • リモートリポジトリへのコミットとプッシュはバックアップです。 1週間に1回だけコミットしてプッシュすると、最悪の場合、1週間分の作業が失われる可能性があります。
1
liberforce

私は常習的なコミッターであり、私に合っていることがわかりましたが、確かに私のコミットメッセージはほとんどの場合、

Age:  9 mins [*] Working on implementing and testing PaintSystem.
Age: 17 mins [*] Working on implementing and testing PaintSystem.
Age: 37 mins [*] Working on implementing and testing PaintSystem.
Age: 52 mins [*] Working on implementing and testing PaintSystem.

そのため、私のブランチ(Mercurial)にそのような頻繁かつ習慣的なコミットを行ったことで、最も詳細なコミットログが確実に促進されたとは言えません。たとえば、妻が夕食に出かけるように言われたら、途中でコードをコミットすることもあります。その時点で、前の「作業中[...]」コミットメッセージを急いでコピーして使用します。

私のコミットログパターンは通常、"Working on [...] Working on [...] Working [...] Completed [...] Started working on [...] Working on [...] Completed [...] Started working on [...]"のようなものです

裏側では、それは私の尻を救った。予想もテストもしなかったEdgeケースに遭遇することもあります。その場合、頻繁にコミットすることで、間違いの原因を正確に突き止めることができます。

したがって、私は最良の習慣については知りませんし、理想的なコミットログの習慣に耳を傾けることは確かに一人ではありませんが、より頻繁にコミットすることは、回帰を実行する必要があるときに間違いなく役立つことは確かです。

1行の変更ごとにコミットする必要がありますか?

以前は1行の変更をコミットしましたが、通常はトリッキーな変更で、おそらく時間が足りなかったでしょう。私のコミットは、常に完全で完全な作業単位や変更に似ているとは限りません。言われたように、時々それらはちょうど私の妻が突然夕食に出かけるように頼んだ結果です。

TBHその"Working on [...]"ログパターンに従う多くのコミットは、一貫性のある変更の単位をモデル化していません(なぜ"Working on [...]"よりも優れたメッセージを思い付くことができないのはなぜですか)。 、自分でコーヒーを作るように。 "Completed [...]"メッセージはその作業単位の終了を示しており、何かに取り掛かった直後に、最初の"Started working on [...]"タイプのメッセージとともに、より詳細なメッセージを書き込むことがよくあります。 15分ごとに1回のようにコミットを平均すると、それらの「Working on [...]」メッセージは、誰かがより詳細なメッセージで1つの大きなコミットでコミットする可能性のある中間者のようなものになります。

テストの前にコミットする必要がありますか(たとえば、少なくとも構文/コンパイルエラーの場合は、完全に元に戻す必要があります。アイデアが機能しなかった、またはメッセージが嘘だったため)。

私は先に進んで、時々テストを実行する前にそれをコミットします(ここでも、予期しないイベントがあった場合)。また、私はソロですが、CIを実行するサーバー(ここでは、LAN上の自宅で実行されているサーバーのみ)にプッシュします。それはやり過ぎのように思えるかもしれませんが、私は以前の職場でそれに頼ることにとても慣れました。さらに、毎回すべての単体テストと統合テストを手動で実行する必要がありません。私はそれをすべて押すだけに結び付けるのが好きです。テストが失敗した場合、私が回帰を行い、最新のリビジョンの間違いを修正して続行するという前向きな方法で作業するのは簡単です。そうは言っても、コミットする前に、少なくともbuildデバッグビルドに対してコードを実行します。

毎朝/午後、まだ新鮮な間に夕食を取りやめる前に必ずコミットする必要がありますか?

私は出かける前にコミットし、プログラミングの合間に休憩を取るのが好きです。私はこの質問に出会うまでは、なぜそれほど深く考えていませんでした。私は自分がコミットログなしで中断したところから、自分が中断したところの代わりに、自分が中断したところを拾わないようにするためだと思います。ええと、私はあなたに連絡する必要があります。私がコミットする頻度を考えると、理論的には必要ないかもしれないからです。なんらかの理由でコンピューターを離れる前でも、コミットしてプッシュする方が快適です。たとえば、私が去った後、コンピューターが火事になり、開発者がSVNを使用していたときにプロジェクトマネージャーが数週間も仕事に取り掛からず、何もしなくても常に気づかされないという、以前の心理的な恐怖かもしれません。コードは会社の所有物であることを思い出させながら、できるだけ頻繁にコードをチェックインするようにしてください。また、特にプッシュを使用すると、CIプロセスがすべてのテストの実行を開始できるようになり、離れているときに戻って結果を確認できるようになるため、少し効率的です。

ああ、そしてときどき、私が去った後に少し酔ってしまい、酔っている間に複雑なコードを書こうとすることは通常悪い考えです(いつもではありませんが、一度酔っている間にエウレカの瞬間を過ごした後、本当に素晴らしいコンテキストメニューシステムを思いついたことがありますが、ビールは6杯ほどしかなく、コードを書くのはそれほど複雑ではありませんでした。そうしようとすると、少なくとも、酔っ払ったコードと地味なコードを混ぜる代わりに、元に戻す前に地味に書かれたコードをコミットしました。その時点で、コミットログは"Reverting back to code written before Jagermeister shots."のようになります。酒に酔ったコードのインスピレーションを得ない限り、これを頻繁に実行しないでください。しかし、これらのまれなケースでは、出かける前に何かをコミットして酔っぱらうことが本当に役に立ちました。

0
user204677

どのくらいの頻度でコミットすべきですか?

一人の開発者として、私は基本的なテストの後、そして夜の終わりにプロジェクトを去るときに、私が大きな変更を加えたと感じたときはいつでもコミットします。

1行の変更ごとにコミットする必要がありますか?

いいえ、その1行の変更で機能またはバグが大幅に変更される場合を除きます。

テストの前にコミットする必要がありますか(たとえば、少なくとも構文/コンパイルエラーの場合は、完全に元に戻す必要があります。アイデアが機能しなかった、またはメッセージが嘘だったため)。

おそらく違います。少なくとも私にとっては、ほとんどのテストとコーディングを「作業コピー」で行い、変更に満足した後でコミットします。多くのIDEでは、実際にコミットする前に何が変更されたかを示し、コミットにメモを添付する機会を与えてくれます

毎朝/午後、まだ新鮮な間に夕食を取りやめる前に必ずコミットする必要がありますか? VCSの習慣が悪いために見逃しているものは何ですか?

VCSやそれが引き起こす悪い習慣にはあまり詳しくありません。私は最初の質問に答えて、これについて私の意見をほとんど共有したと思います。

想定されている一般的な質問への回答として、あなたはほとんど別のレスポンダーの投稿で扱われているブランチとしてコミットを使用しているようです。どのIDE使用していて、元に戻す履歴などがあるかわかりませんが、IDEそしてマシン間を移動します。

0
dbuell