web-dev-qa-db-ja.com

gitはhgmqと同等ですか?

Mercurialと一緒にGitを使い始めて、Gitに慣れました。

Mercurialのmq拡張機能を広範囲に使用してローカルパッチを管理しており、Gitに相当するものを探しています。

Gitブランチを使用する必要がありますか?または、パッチを簡単に適用および削除できるローカルパッチを管理するためのより良い方法はありますか?

ありがとう、

50
John Weldon

免責事項:私はhgユーザーではないので、hgについて読んだことがありますが、実際に使用した経験はあまりありません。

gitは、「パッチキュー」スタイルでブランチを管理するための非常に強力で柔軟なツールをいくつか提供しているため、多くの基本的な(そして非常に複雑な)ユースケースでは、ネイティブgitは十分に強力です。

通常、ほとんどのプロジェクトは、新しいコミットのみを取得し、「巻き戻される」ことはない中央の安定したマスターブランチを保持しているため、マスターブランチのコミットは修正されます。

これに加えて、メンテナー(または開発者)は、安定したブランチに基づく進行中のパッチ(つまりコミット)の1つ以上の流動的なブランチを維持することができます。

典型的なパッチ管理アクティビティは次のとおりです。

パッチキューを最新の安定したブランチにリベースします-git rebaseを使用します。

パッチキューを古いメンテナンスブランチに複製します-git branchgit rebaseを使用します。

キュー内のパッチの並べ替え-テキストエディタを使用してgit rebase --interactive(別名git rebase -i)を使用してキューを並べ替えます。

パッチの押しつぶし-squashディレクティブでgit rebase -iを使用します

パッチまたはパッチコミットメッセージの変更-編集ディレクティブでgit rebase -i(テーマを見つけますか?)を使用します。

パッチを何らかの方法(つまり、その内容、説明、または親子関係)で変更するアクティビティは、そのパッチの新しいコミットIDで新しいコミットを作成します。古いコミットが安定したマスターブランチにプロモートされる前に破棄され、定期的に置き換えられる可能性があるという事実は、それらをブランチではなく「パッチキュー」にする唯一のことですが、これは物理的な違いではなくプロジェクトの規則ですコミットを構成するデータ内。 gitにとって、それらは同一のオブジェクトです。

パッチを「実際の」コミットにプロモートするには、パッチをキューの先頭に移動し、マスターブランチにマージするだけです。パッチをキューの先頭に移動した後は、マスターブランチに基づく通常のコミットとまったく同じであるため、パッチをマージすると、マスターブランチポインターがパッチコミットを指すように早送りされます。

このコミットを「安定した」マスターパッチとして公開することは、次のように言う行為です。これは、変更されないコミットであり、プロジェクトの不変の履歴の一部です。

31
CB Bailey

ブランチを使用して、アップストリームブランチに対して定期的にリベースするだけです。これは、mq(過去にデータを失った)を使用するよりも管理が簡単で安全です。

9
Dustin

Gitは実際にはこの機能自体を提供していません。用途によっては、「git stash」やブランチでうまくいくかもしれませんが、それはかなり基本的なことです。 gitを使用したより高度なパッチ管理のニーズがある場合は、QuiltまたはStGitを使用するようです。 http://git.or.cz/gitwiki/PatchManagement を参照してください。

7
C Pirate