10

良いリビジョンがあるとします: 3200. 次に、何かをテストしたいのですが、10 行の変更があり、いくつかの行を削除する必要があるため、まだテスト中ですが、最初にコミットし、いくつかの変更の後、もう一度コミットします。たとえば、6 つのコミットを行いました。

今はこれを保留にしたいのですが、すべてのテストと記述されたコードを失いたくないので、

$ hg up -r 3200

私が望む良い、安定したリビジョンはどれですか? 今、コミットしてヒントとしてプッシュできますか? (可能であればhg backout、多少見栄えが悪いのでバックアウトを避けたいです。また、ロールバックには「この間に誰かが私から引っ張った場合、変更が何らかの形でレポに戻る可能性がある」という副作用があるため、ロールバックしたくありません)

4

3 に答える 3

12

Mercurial では、いくつかの方法で物事を保留にすることができます。最も簡単な方法は、どこにもプッシュしないことです。歴史を遡ってから

$ hg update 3200

あなたが使用することができます

$ hg push -r .

リビジョン 3200 までのみプッシュします。これ.は重要です — これは、作業コピーの親リビジョン、この場合は 3200 を意味します。リビジョン 3200 は、まだリビジョン 3201 ~ 3206 を持っているため、ローカル リポジトリの「ヒント」にはなりません。番号付きのリビジョンは、常に「ヒント」と呼ばれるものです。つまり、履歴は次のようになります。

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
             ^                              ^
            "."                           "tip"

ここで、現在の作業コピーの親リビジョンとヒント リビジョンをマークしました。

リビジョン 3200 に基づいて作業を開始すると、グラフは次のように変化します。

[3199] -- [3200] -- [3201] ... [3205] -- [3206]
                \
                 \-------------------------------- [3207]
                                                      ^
                                                  ".", "tip"

「ヒント」を強調しすぎないようにしてください。それは常に変化し、一般的にあまり興味深いものではありません。3206 に戻ってコミットすると、ヒントはリポジトリに新しく作成されたリビジョン 3208 を示します。別のリポジトリでは、tip は、あなたからプルされたものとプルされた時期に応じて、別のものになる可能性があります。

頻繁に行う必要がある場合は、エイリアスhg push -r .を作成することをお勧めします。このようなエイリアスはより穏やかなプッシュになるため、「ナッジ」と呼ぶことができます

[alias]
nudge = push -r .

ツールボックスにそれがあれば、いつでもできる

$ hg nudge

作成したばかりの変更セットをサーバーに送信するため、保留にした可能性のある他のブランチを送信することを心配する必要はありません。

最後に、使用できることを覚えておいてください

$ hg update 3206
$ hg commit --close-branch -m "Abandoning this line of development"

3206チェンジセットを「クローズ」としてマークします。これは、 に表示されhg headsず、実行時にマージの対象とは見なされないことを意味しますhg merge。サーバーにプッシュする場合は使用する必要がありますhg push --forceが、複数の開いたヘッドを作成していないため、別の閉じたヘッドを追加するだけで問題ありません。

複数のオープン ヘッドの問題は、新しいヘッドがhg cloneそのうちの 1 つに更新される可能性があり、混乱を招く可能性があることです。人々はどこから作業を開始すればよいかわかりません。Mercurial の最近のバージョンでは、hg cloneクローズド ヘッドに更新されないため、この問題を回避できます。

閉じたヘッドは、それに基づいて子コミットを作成するだけで再度開くことができます。これは、ある時点でブランチが閉じられたことを示すグラフ内のメモを除いて、悪影響を与えることなく開発ラインを一時的に閉じることができることを意味します。

于 2011-12-21T23:58:30.157 に答える
0

krupans の答えはもちろん正しく、彼はすでに頭が 2 つあるという問題について言及しています。ただし、同じブランチの 2 つのヘッドが存在することを強調したいと思います。他の人にとっては、何が起こっているのか、どちらのヘッドを使用すればよいのかを理解するのが難しくなる可能性があります。

このため、テスト コードを新しいブランチに配置することが有益な場合があります。そのためには、履歴を書き直す必要があります。MQ 拡張機能を使用してこれを行うことができます (3201 がリビジョン 3200 の子リビジョンであり、3206 がテスト コミットの最後のものであると仮定します。

hg qimport -r 3201:3206
hg qpop -a
hg branch branchname
hg qpush -a
hg qfinish -r 3201:3206

リポジトリのクローンでこれを試してください!

これは、これらの変更を他の場所にまだプッシュしていない場合にのみ行う必要があります。

于 2011-12-20T08:54:49.087 に答える
0

質問とそれに付随するコメントから、すべての新しい変更を 3200 に基づいて行い、320​​0 に基づいた以前の作業を別のブランチとして残したいようです。それは簡単です:

hg up 3200
# work work
hg ci -m "new work based on 3200"

しかし、私が知る限り、3200 をチップとしてマークする方法はありません。3200 に基づいて何かをコミットすると、その新しい変更セットがヒントになるので、良性の変更を加えてそれをコミットして新しいヒントを作成することもできますが、それはちょっと面倒です。Mercurial が 3200 をヒントとしてマークしていないため、仲間の共同作業者が作業のベースとして 3200 を使用することを知らないことが心配な場合の別のオプションは、タグを付けて、チームメンバーに作業コピーを確認して更新するように伝えることです。作業を開始する前にそのタグに。

于 2011-04-02T14:24:15.453 に答える