web-dev-qa-db-ja.com

Mercurialのブランチに混乱したgitユーザーです。小さな変更を追跡するにはどうすればよいですか?

以前はいつもgitを使っていましたが、pythonに貢献したいので、Mercurialを学ぶ必要があり、非常にイライラします。

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

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

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

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

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

何が悪いのですか?これは正常で予期されていることであり、これらの問題を無視する必要がありますか?または、ブランチをどのように操作するのですか?

32
Anton Barkovsky

個人的には、あなたのシナリオでは、コア開発者に受け入れられる必要のある複数の変更に取り組んでいない限り、ブランチを作成することさえありません。

リポジトリを複製して作業し、プルリクエストを実行するだけです。

ブランチを使用する場合は、名前付きブランチを使用します。ブックマークはそうではなかった、まさにこの目的のために設計されました。なぜそれがヘビー級だと思うのかわかりません。

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

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

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

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

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

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

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

リビジョン番号は、単一のリポジトリを操作するときに便利で覚えやすいショートカットです。

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

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

22
pdr

どうやらMercurialで分岐を処理するには4つの方法があるようです。 1と4は完全にばかげているように見えました、名前付きブランチはヘビーウェイトであるようです

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

あなたはcan彼らに異なる名前を付けます、あなたする必要はありません、しかしそれは良い考えです。名前付きブランチには大きな負担はありません。これは、追加のメタデータです。個人的には、名前の付いたブランチを他の何よりも優先します。

TortoiseHGとhgログはまだコミットとデフォルトのブランチに2つのヘッドがあることを示しています。

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

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

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

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

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

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

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

以前はいつもgitを使っていましたが、pythonに貢献したいので、Mercurialを学ぶ必要があり、非常にイライラします。

それは大丈夫です、多くのMercurialユーザーはGit(私を含む)について同じように感じています。

9
a sad dude

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

短い答え:少しの変更があってもかまいませんが、ブランチを使用できます。そのブランチを削除することを考えている場合は、ブックマークを使用して、後でそれを削除できるようにし、stripその後の変更。

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

  • 1と4は分岐と見なされます。これは、コミットするたびに、名前のないブランチを効果的に作成しているためです(ソースに同時に別のコミットがある場合)/blessed repo)、技術的にはブランチです。 方法4では新しい「ヘッド」を作成していますが、方法1では作成していません。ヘッドはマージされることになっています。方法1はばかげていると思うが、一部の人はそれを気に入っているようだ...小規模なプロジェクトの場合、私はそう思う。

  • 方法2に関して、それは枝が重いということではなく、それらが永続的であるということです。 strip拡張機能などを使用しない限り、ブランチを削除することはできません。繰り返しになりますが、Mercurialの設計哲学は歴史を変えることには向いていません(しかし、それはそれで良くなりました)。

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

ここで、他の質問に答えます。

  • hg headsを使用して、どのヘッドを持っているかを確認できます。1つの名前付きブランチに2つ以上のヘッドがある場合は、それらをマージすることをお勧めします。 おそらくあなたのブックマークがある場所です
  • 行ったばかりの変更を取り除くには、hg rollbackを実行できますが、そうではないと思います。
  • ブックマークを削除するには、次のようにしますhg bookmark --delete yourbookmark
  • 歴史の中で枝が切りやすいのも嬉しいですね。 リベース拡張ストリップ操作 を調べます
  • Mercurialにはすでにいくつかの拡張機能がバンドルされていますが、デフォルトではアクティブ化されていません。任意のフォルダーに移動し、任意の場所で右クリックしてTortoiseHGコンテキストメニューを表示し、[グローバル設定]に移動してから、[拡張機能]:MQ拡張機能とRebase拡張機能をアクティブにします。これにより、リポジトリ間の互換性がまったく損なわれることはありません。
  • ここに来たので、次のいずれかを行うことができます。
    • ブックマークが始まった場所のストリップ(これでおそらく問題が解決します)
    • 視覚化を容易にするために、変更を前面にリベースし、後でそれらを取り除くことができます。リベースについては、別のときに役立つかもしれないので説明しました。

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

最後に、あなたは何も間違っていない、それらはわずかに異なる考え方で構築された異なるツールであることを覚えておいてください。履歴を変更する(git)または履歴を変更しない(hg)。 Mercurialでは、履歴を変更して(特にフェーズを使用して)足元で自分を撃つことは困難であり、それがgitよりも優れている理由です。

6
dukeofgaming

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

匿名ブランチのコツは、それらをプッシュしたくない場合、つまりローカルに保持したい場合に、フェーズを「秘密」に設定することです。 doそれらをプッシュしたいが、それらに基づいてこれ以上のコミットを望まない場合は、それらの上に "--close-branch"をコミットするだけです。つまり、それらはもう表示されません。 'heads'リストとMercurialは、そのブランチの複数のヘッドに関する不満を解消します。

1
bc.cam