私は、mercurialの分岐に混乱しているgitユーザーです。小さな変化をどのように追跡するのですか?


32

以前はgitを使用していましたが、Pythonに貢献したいので、今では水銀を学ぶ必要があり、非常にイライラします。

そこで、私はいくつかの小さなパッチを作成し、それらをローカルのMercurialリポジトリでコミットとして追跡したいと考えました。どうやら水銀の分岐を処理する4つの方法があります。1と4は完全にばかげているように見え、名前付きブランチはヘビーウェイトのようで、1コミットの迅速な修正のためにそれらを使用することになっていないので、ブックマークを使用しました。

今、私のパッチは拒否され、ブックマークブランチの1つをリポジトリから削除したいと思います。OK、gitではブランチを強制削除して忘れてしまうので、ブックマークを削除すると次の問題が発生します。

  • TortoiseHGは、hg logコミットとdefaultブランチに2つのヘッドがあることを示しています。そして、私が正しく理解していれば、追加のプラグインなしでhgのコミットを削除することはできません。

  • Mercurialにはハッシュだけでなく、リビジョン番号もあります。いくつかのコミットを追加したので、それ以降にプルされたすべてのコミットには、メインの中央リポジトリとは異なるリビジョン番号が付けられています。

  • ブックマークをhg update引っ張ってmaster最新のコミットに自動的に移動した後、実行しますが、TortoiseHGでそれを行う方法が見つかりませんでした。

何が間違っていますか?これは正常で予想されるもので、これらの問題を無視する必要がありますか?または、ブランチでどのように作業するのですか?

回答:


22

個人的に、あなたのシナリオでは、複数の変更に取り組んでいない限り、ブランチを作成することさえしません。

リポジトリのクローンを作成して作業し、プルリクエストを作成します。

ブランチを使用する場合は、名前付きブランチを使用します。これらは、ブックマークがそうではなかったこの正確な目的のために設計されました。なぜあなたがそれをヘビーウェイトと考えるのか分かりません。

MercurialのWikiには、「枝刈り」のさまざまな方法を説明するページ全体があります。「クローンの使用」オプションは要件を満たしている必要があります。

より具体的な問題に答えるには...

TortoiseHGとhgログには、コミットとデフォルトのブランチに2つのヘッドがあることが引き続き示されています。そして、私が正しく理解していれば、追加のプラグインなしでhgのコミットを削除することはできません。

これは、Mercurialを初めて使用したときに犯した間違いです。これらの追加のプラグインを恐れないでください。それらのいくつかは非常に強力なツールであり、多くの場合、後にコア製品に組み込まれます。それがまさにMercurialの仕組みです。特定のタスクを実行する必要がある場合は、取得して使用します。

履歴の修正はMercurialの世界では悪いことだと考えられているため、バニラ製品にはGitユーザーが必要と考えるすべてのものが常に含まれているわけではありませんが、アプリケーションを使用したいが優先順位が異なる人のためのプラグインはたくさんあります。

Mercurialにはハッシュだけでなく、リビジョン番号もあります。いくつかのコミットを追加したので、それ以降にプルされたすべてのコミットには、メインの中央リポジトリとは異なるリビジョン番号が付けられています。

リビジョン番号を気にしないでください。それらはもはや便利さの問題です。ハッシュコードは、レポからレポに渡される重要な識別子です。リビジョン番号はリポジトリ間で一貫性がありません。良い説明については、Hg Initをチェックしてください。

リビジョン番号は、単一のレポで作業する場合に便利で覚えやすいショートカットです。

マスターブックマークを最新のコミットに自動的に移動するためにプルした後にhg updateを行いますが、TortoiseHGでそれを行う方法が見つかりませんでした。

TortoiseHgのを使用する場合は、使用ワークベンチではなく、他のツールを。すべてが(ほとんど)そこにあります。更新はリビジョンコンテキストメニューにあります。常に直観的ではありませんが、上記のリンクに優れたガイドがあり、慣れると自信を持って放棄してしまいます。


適切な名前付きブランチがhg
jk

9

どうやら水銀の分岐を処理する4つの方法があります。1と4は完全にばかげているように見えましたが、名前のついた枝は重いようです

Mercurialでは、ブランチを作成しません。すべてのコミットは事実上ブランチであり、どのコミットも複数の親と複数の子を持つことができます。したがって、これらは同じエンティティを編成する4つの異なる方法です。

別の名前付けることもできます、する必要はありませんが、良いアイデアです。名前付きブランチに大きな重みはありません-それは単なる追加のメタデータです。個人的には、どのような状況でも、名前付きブランチを他のものよりも好みます。

TortoiseHGとhgログには、コミットとデフォルトのブランチに2つのヘッドがあることが引き続き示されています。

すべてをにダンプするのではなく、名前付きブランチを使用するまさにその理由defaultです。

そして、私が正しく理解していれば、追加のプラグインなしでhgのコミットを削除することはできません。

実際にMercurialで何も削除することはできませ削除しないでください。使用するhg stripことはできますが、ログには記録されません-基本的には、ローカルリポジトリの一部を切断するだけです。それをプッシュすることはできません。また、ローカルにストリップしたブランチを持つレポジトリからプルすると、それは戻ってきます。

Mercurialにはハッシュだけでなく、リビジョン番号もあります。いくつかのコミットを追加したので、それ以降にプルされたすべてのコミットには、メインの中央リポジトリとは異なるリビジョン番号が付けられています。

数字は何の意味もありません。彼らはあなたを混乱させる場合、あなたはそれらを無視することができます。

マスターブックマークを最新のコミットに自動的に移動するためにプルした後にhg updateを行いますが、TortoiseHGでそれを行う方法が見つかりませんでした。

TortoiseHGは使用していませんhg pull -uが、両方pullを実行しupdateます。

以前はgitを使用していましたが、Pythonに貢献したいので、今では水銀を学ぶ必要があり、非常にイライラします。

大丈夫、多くのMercurialユーザーがGit(私を含む)について同じことを感じています。


6

MercurialとGitが似ている場合でも、デザインは異なります。おそらく最も重要なデザインの違いは、Mercurialでの履歴の変更はgitほど柔軟ではないことです(推奨されないため)。

簡単な答え:少しの変更があったとしても、ブランチを使用できます。あなたがそのブランチを削除することを考えている場合は、使用したブックマークを使用すると、後でそれを削除してできるようストリップ後で変更を。

最初に、あなたが言及することのいくつかに少し光を当てようとします:

  • 1と4はブランチと見なされます。コミットするたびに、事実上、名前のないブランチ(ソース/祝福されたレポジトリで同時に別のコミットがある場合)を作成するためです方法4では、新しい「ヘッド」を作成していますが、方法1では作成していません。ヘッドはマージされることになっています。方法1はちょっとばかげていることに同意しますが、一部の人はそれを好むようです...小さなプロジェクトの場合、私は推測します。

  • 方法2に関しては、分岐が重いということではなく、永続的であるということです。ストリップ拡張のようなものを使用しない限り、ブランチを削除することはできません。繰り返しになりますが、Mercurialの設計哲学は、歴史の修正には向いていません(しかし、それはより良くなっています)。

  • リビジョン番号に関して、それらあなたがリビジョンに関係するすべてのコマンドを使用するための単なるローカルで人間が読めるリファレンスです。ハッシュの使用が好きな場合でも、できます。リビジョン番号は単なるショートカットであり、異なるリポジトリ間の内部操作についてはMercurialによって無視されます。

次に、他の質問に答えます。

  • あなたは、あなたが持っているものの頭をチェックすることができhg headsますが、単一の名前付きブランチで2+頭を見れば、彼らがマージされていることが好ましいです。それはおそらくあなたのブックマークがあるところです
  • あなたが行ったばかりのリビジョンを取り除くために、あなたはできますhg rollbackが、私はこれが当てはまらないと思います。
  • ブックマークを削除するには hg bookmark --delete yourbookmark
  • 歴史の中で枝を簡単に切ることができて幸せです。見てリベース拡張ストリップ操作
  • Mercurialにはすでにいくつかの拡張機能がバンドルされていますが、デフォルトでは有効化されていません。任意のフォルダーに移動し、任意の場所を右クリックしてTortoiseHGのコンテキストメニューを表示し、[グローバル設定]、[拡張機能]の順に選択します。MQ拡張機能とRebase拡張機能をアクティブにします。これにより、リポジトリ間の互換性が損なわれることはありません。
  • ここにいるので、次のいずれかを実行できます。
    • ブックマークの開始位置を削除します(これで問題が解決する可能性が高い)
    • 視覚化を簡単にするために、変更をフロントでリベースして、後で削除することもできます。改めて言及したのは、それがいつかあなたにとって役に立つかもしれないからです。

また、gitでは明示的にプッシュする必要があり、後で削除できるため、「プライベートローカルブランチ」を持つことができます。Mercurialでは、持っているものをすべてプッシュしますがこれを回避したい場合は、フェーズ機能を使用して、一連のリビジョンをsecretとしてマークできます。秘密の修正はプッシュされません。

最後に、あなたは何も悪いことをしていませんが、それらはわずかに異なる考え方で構築された単なる異なるツールであることに留意してください:履歴を変更する(git)または履歴を変更しない(hg)Mercurialでは、履歴を修正する(特にPhasesで)足を踏み入れるのが難しく、そのためgitよりも優れている人もいます。


名前付きブランチを記録する変更セットのすべての分散コピーが実行後に削除されたことを保証する方法はありませんhg strip。名前付きブランチにはグローバルな名前空間があり、Gitブランチ名にはないという違いを除いて、Gitブランチ名の分散コピーについても同じことが言えると思います。また、名前の分岐のために複数のヘッドが存在します。これは、分散型VCSの感染性のある設計エラーです。
シェルビームーアIII

1

Mercurialでは、ブランチを気にしないのが最も簡単です。必要に応じて、履歴のどこで編集したいのかを見つけ、コミットを作成します(別名匿名ブランチ)。異なるコンテキストで頭の間をジャンプしなければならない場合、ブックマークは役に立つかもしれませんが、ほとんどの場合、私はそれらを気にしません。名前付きブランチは、長期間有効なブランチ(バグ修正ブランチ、プロジェクトブランチ)では問題ありませんが、1コミットまたは2コミットの修正では、ジョブに適したツールではありません。

匿名ブランチのコツは、プッシュしたくない場合、つまりローカルに保ちたい場合、フェーズを「秘密」に設定することです。あなたがいる場合、それらをプッシュしたいのですが、あなたがそれらに基づく任意のより多くのコミットをしたくない、あなただけのそれらの上に「--close分岐を」コミット、彼らはもはや「頭」リストと水銀に表示されますを意味していますそのブランチの複数のヘッドについて文句を言うのを止めます。


-1

ブランチの代わりにブックマークを単純に使用できると思います。とにかく製品のサポートを継続する予定であり、2つのブランチを長期的にマージすることは大きな頭痛の種です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.