Git/Githubの基本的な概念のほとんどを理解しましたが、全体像を理解するのはまだ困難です。
これらは、私がこれまでに何とか機能させることができたものです。
ただし、これまでのところプロジェクトのアルファ/ベータバージョンのみを扱っているため、バージョン管理されたリリースを実際に見たことはありません。
したがって、バージョン管理、個別のバージョンの維持、バージョンのホットフィックスなどについて詳しく知りたいと思います。
次のことを確実にするにはどうすればよいですか。
私は次のオプション間で疑っています:
git-flow を見てください。これは優れた(そして人気のある)分岐モデルです。
永遠に残る主なトランクはdevelop
とmaster
です。 master
は最新のリリースを保持し、develop
は最新の「安定した」開発コピーを保持します。
コントリビューターはfeature
からdevelop
ブランチ(慣例によりfeature/
で始まる)を作成します。
$ git checkout -b feature/my-feature develop
およびhotfix
からのmaster
ブランチ(慣例によりhotfix/
で始まる):
# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master
# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>
これらのブランチは「使い捨て」です。つまり、メイントランクにマージされるまでの寿命は短いです。小さな機能をカプセル化するためのものです。
コントリビューターがfeature
ブランチを完了すると、それをdevelop
にマージします。
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
hotfix
ブランチの処理が完了すると、master
とdevelop
の両方にマージされ、修正プログラムが次のように持ち越されます。
$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number
これが継続的インテグレーションの側面です。
リリースのパッケージ化を開始する準備ができたら、「安定した」release
ブランチからdevelop
ブランチを作成します(feature
ブランチの作成と同じです)。次に、バージョン番号をタグでバンプします(下記を参照)。
個別のrelease
ブランチを使用すると、バグを修正し、develop
ブランチに最後の仕上げを追加しながら、release
で新しい機能を開発し続けることができます。
リリースを完了する準備ができたら、release
ブランチをmaster
とdevelop
の両方にマージし(hotfix
のように)、すべての変更は繰り越されます。
release
ブランチまたはhotfix
ブランチを作成するときは、タグでバージョン番号を適切にバンプします。 Vanilla gitでは、次のようになります。
$ git tag -a <tag-name> -m <tag-description>
次に、タグを(個別に)リモートリポジトリにプッシュする必要があります。
$ git Push --tags
通常、バージョンがmajor.minor.hotfix
の形式を取るセマンティックバージョニングを使用するのが最善です。メジャーバンプには下位互換性がありませんが、マイナーバンプとホットフィックスバンプには下位互換性がありません(ベータ版でない限り、0.x.x
)。
上記で見たように、git-flowは次のコマンドでブランチをマージすることを推奨します:
$ git merge --no-ff <branch-name>
--no-ff
オプションを使用すると、リポジトリの現在のコミットに大量のブランチを残さずにすべてのブランチ履歴を維持できます(そのため、すべてのバージョンにブランチが必要になることはありません)。
また、プルすることをお勧めします
$ git pull --rebase
したがって、無用なマージコミットをたくさん追加する必要はありません。
.gitconfig
では、デフォルトでこれらの両方を実行するようにgitを設定できます。私はあなたにそれを調べさせます;)
コードベースの特定のバージョンを探している人は、名前でタグをチェックアウトできます。
# checkout in detached HEAD to browse
$ git checkout <tag-name>
# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>
または、誰かがgithubを閲覧している場合は、「ブランチ」ドロップダウンに「タグ」タブもあります。
このモデルを使用する私のお気に入りの方法は、gitの git flow extension を使用することです。
(編集:Louisは AVH fork を推奨しています。これはgit describe
でより適切に機能し、現在はよりアクティブになる可能性があります。Louisに感謝します。)
拡張機能は、すべての厄介な部分(merge --no-ff
の使用やマージ後のブランチの削除など)を自動化するので、あなたはあなたの人生を続けることができます。
たとえば、拡張機能を使用すると、次のように機能ブランチを作成できます。
$ git flow feature start my-feature-name
そして、それをそのように仕上げます
$ git flow feature finish my-feature-name
修正プログラムとリリースのコマンドは似ていますが、次のようにブランチ名の代わりにバージョン番号を使用しています。
# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14
# Create the next release
$ git flow release start 2.5.0
次に、Gitフローがバージョンタグを作成し、構成ファイルまたはマニフェストファイル(gruntのようなタスクマネージャーで行うことができます)でバージョンをバンプするように親切に通知します。
それが役立つことを願っています:) Travis CIセットアップとすべてをどのように統合するかは正確にはわかりませんが、githooksがそこに到達すると思います。
すべてのバージョンにタグを使用する必要がありますか?
いいえ、タグを使用する必要はありません。すべてのリリースにタグを付けたい場合はそれで問題ありません。または、CIシステムがビルドされるたびにタグを付けたい場合も、それを行うことができます。タグは基本的にコミットにユーザーフレンドリーな名前を付けているだけなので、簡単にプルして後で表示できます。
バージョンごとにブランチを作成する必要がありますか?
承知しました!分岐はGitでは安価で無料です。そのため、私はあらゆる機会にそれを利用しています。また、ブランチをマージしたり、かなりすばやく削除したりすることもできます。多くのブランチが必要だと感じた場合は、後で選択的にマージすることにより、いつでもブランチを削減できます。十分な実績のあるスキームを使用したい場合は、多数のGit分岐スキームも利用できます。
バージョン番号はどのように指定しますか?
タグは通常、gitに関係するため、バージョン番号を指定する方法です。プロジェクトをバージョン管理する方法、またはそれを行うための最良の方法について話している場合、かなり意見に基づく質問であるため、いくつかの掘り下げを行う必要があります。いくつかのプロジェクトは永遠にベータ版のままですが、他のプロジェクトはスタイルが崩れるように整数バージョンを増やします(Chromeを見て)
すべてのバージョンでタグを使用する必要がありますか?
「バージョン」とは、リリースまたはリリース候補を構成する一連のファイルを意味する場合、すべてのバージョンにタグを付けることを強くお勧めします。将来バージョン1.2.7を参照する必要がある場合、コミットのハッシュを探しますか、それともバージョン番号を使用しますか?
また、git describe
ビルド情報をどこかに(私と同じように)記録し、タグを使用すると、より優れた出力を提供できます。
もしそうなら、継続的インテグレーションシステムビルドはどのように自動的にリリースできますか?
継続的インテグレーションシステムは、タグの使用方法に関係なく、リリースを構築できます。コミットのハッシュに基づいてリリースをビルドするように指示できます。タグはあなたの人生を楽にします。
バージョンごとにブランチを作成する必要がありますか?もしそうなら、それは完全なトンのブランチを作成しませんか?
分岐は「バージョンごと」のものとは思わない。私のバージョンがすべてmaster
ブランチのコミットであるプロジェクトがいくつかあります。どちらのプロジェクトも安定した段階ではなく、古いバージョンを長期間サポートする必要がないため、今のところこれ以上複雑なものは必要ありません。しかし、1.0、1.1、1.2をリリースしてから2.0をリリースしたとしても、セキュリティ修正などで1.0シリーズをサポートする必要があるとします。そうすれば、1.xシリーズのメンテナンスリリースを配置するブランチが確実にできます。 。
バージョン番号を指定するにはどうすればよいですか?バージョン番号を指定する構成ファイルがあっても大丈夫ですか、それともそれよりも賢い方法がありますか?この場合、重要なのはJavaプロジェクトです。
複数の場所で番号を更新する必要がある場合に発生する可能性のあるファットフィンガーエラーを防ぐため、構成ファイルのように、バージョン番号の単一のソースを使用することが最善の方法です。私は…うーん…恥ずかしい経験から話している。 1.3をリリースしても、ソフトウェアがバージョン1.2であるとまだ報告されていることがわかります。おっとっと!
別の答えとして、mxduboisはgitflowを推奨しています。 gitflowを使用する場合は、 AVHエディション を使用することをお勧めします。元のバージョンはもはや積極的に維持されていません。 1つの注目すべき違いは、AVHエディションがgit describe
インテリジェントに機能します。元のバージョンは trips git describe
。
リストをスキャンするversionがフォーカスなので、...
バージョンを維持する1つの方法は、ブランチとマージ(またはリベース)を使用することです。
だからあなたは持っています:
master
次に、ブランチを作成します
v1
次に、さらに変更を加えます
master(diff1)
次に、ブランチを作成します
v3
次に、さらに変更を加えます
master(diff2)
今:
バージョン2を更新するには
git checkout v2
git merge master # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.
バージョン3を更新するには
git checkout v3
git merge master
上記は大規模なアップデート用です。
ある特定の変更を選択する必要がある可能性は高いですが、
git cherry-pick
http://git-scm.com/docs/git-cherry-pick でのチェリーピッキングの詳細