2009-06-04 15 views
49

私はGitをMercurialと共に使用して、Gitに慣れてきました。git mqと同等のgit?

私は地元のパッチを管理するために、広範囲のMercurialでMQ拡張機能を使用して、私はGitの同等を探しています。

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

ありがとう、

+0

非常に稀にgitのものが必要です。 – shabunc

答えて

28

Git WikiのInterfaces, Frontends And Toolsページの「パッチ管理インタフェースレイヤー」セクションをチェックしてください。 拡張水銀「MQ」にほぼ等しい2つのパッチ管理インターフェイスを、そこに記載されている:

  • StGIT(Gitの積層)、Pythonで書かれた2つの古いは、パッチを
  • Guiltを表すために2つのスナップショットを使用して(以前の 'gq')は、一連のbashスクリプトとして書かれていましたが、シリーズファイルとパッチ(ファイルごとに1つ)はプレーンテキストファイルとして保存されています。
  • PG(斑状のGit)非推奨ず、もはや維持されています。

さらに高度な使用法が必要ない場合は、代わりに「git rebase --interactive」を使用してパッチの並べ替え、スカッシュ、分割を行うことができます。現在のバージョンのアップストリームに対してブランチを管理するには、通常 "git rebase"で十分です。

+1

これらの「高度な使用法」の1つを挙げることはできますか?私は 'git rebase --interactive'はMqのようなものの必要性をほとんど排除していると思います。 – kizzx2

+7

** @ kizzx2:** 'git rebase --interactive'は、シリーズ全体を順番に処理するよう強制します。パッチ管理インターフェイスを使用すると、簡単にパッチ間を行き来して編集することができます。パッチの変更の履歴を表示したり、シリーズの途中で新しいコミットを追加したり、チェリーが他のコミットを選択したりすることもできます。 –

+1

@jakub、 'git checkout'はコミットの間を行き来することはできませんか?パッチの管理はとても簡単です。 gitの全体的なポイントは、コミット全体を歩くことは簡単だということです。 –

7

ギットは本当にこの機能を提供していません。あなたの用途に応じて、 "git stash"やブランチを手に入れることができるかもしれませんが、かなり基本的です。もし人々がgitでより高度なパッチ管理が必要な場合は、キルトやStGitに変わったようです。http://git.or.cz/gitwiki/PatchManagement

9

ブランチを使用して上流ブランチに対して定期的にリベースしてください。これはmq(これまで私が過去にデータを失ったもの)を使用するよりも管理しやすく、安全です。

31

免責事項:私はHGのユーザーではないので、私はHGについて読んだことがあるが、それを使用しての多くの最初の手の経験を持っていません。

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

は一般的に、ほとんどのプロジェクトは、新しいコミットを取得して、「巻き戻し」はその固定されているマスターブランチにコミットすることはありません中央の安定masterブランチを保ちます。この保守(または開発者)の上に

は、安定したブランチに基づいている(すなわち、コミット)作業中のパッチの1つ以上の流体分岐を維持することができます。

典型的なパッチ管理活動は、次のとおりです。

最新の安定版ブランチへのパッチキューをリベース - 古いmaintentance枝上にパッチキューを複製、

git rebase使用 - git branchgit rebaseを使用し、

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

- パッチまたはパッチがコミットメッセージを変更することスカッシュディレクティブ

git rebase -iを使用するには - 編集ディレクティブで(?テーマを見つける)git rebase -iを使用しています。

パッチを何らかの形で変更するアクティビティ(コンテンツ、説明、または親)は、そのパッチの新しいコミットIDで新しいコミットを作成します。安定したマスターブランチに昇格される前に、古いコミットが捨てられ、定期的に置き換えられるという事実は、ブランチではなくパッチキューにする唯一のものですが、これは物理的な違いではなくプロジェクトのコンベンションですコミットを構成するデータ内に存在します。 gitには同じオブジェクトです。

パッチを「本当の」コミットにするには、パッチをキューの先頭に移動し、それをマスターブランチにマージするだけです。パッチをキューの先頭に移動した後は、マスタブランチに基づく通常のコミットと同じになるため、マージブランチポインタを早送りしてパッチコミットを指すようにします。

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

+0

私は一般的にMercurialを使用しますが、これはおそらく私が見た合理的なgitの枝の最良の説明です。ありがとう! :) – rpjohnst

+2

私が1つのプロジェクトで広く使用するMercurial Queuesの1つの機能は、.hg/patchesディレクトリをコピーするだけでそれらを「エクスポート」することです。レポから外部にパッチを保存して管理できることが重要です。確かにこの使用法は非常に珍しいですが、同じような機能を提供するものは何もありませんか? –

+0

@PaulMooreエクスポートしたいパッチに対して 'git format-patch'を実行します。もし必要ならば、それらをmboxファイルに保存することもできます。 。おかげさまで、 – kyrias