2

私はmercurialリポジトリを持っています。リビジョン A にありました。いくつかの変更を加え、(リビジョン B に) コミットし、プッシュしました。しかし、後で、私はそれらの変更を行いたくないことに気付きました. リビジョン A に更新し、リビジョン C にいくつかの代替変更を加えました。

C
| -
| B
|/
A

ただし、rev C をプッシュすることはできません。これは、新しいリモート ヘッドが作成されると不平を言うためです (そうなります)。リモート mercurial にリビジョン B とその中のすべての変更を単純に忘れさせて、リビジョン C をプッシュしてそこから続行できるようにするにはどうすればよいですか?

4

5 に答える 5

5

履歴を編集するのは難しいです。変更セットをパブリック リポジトリにプッシュすると、履歴から簡単にプルーニングできなくなります。

あなたの問題に対する最も直接的な解決策は次のとおりです。

  1. hg update <tip of branch you want to forget>
  2. hg commit --close-branch -m "close unwanted branch"
  3. hg update <tip of branch you want to keep>
  4. すべての変更をプッシュします。--forceご指摘のとおり、ブランチに複数のヘッドが存在するようになったため、使用する必要があります。

本当にブランチを削除する必要がある場合は、EditingHistoryをもう一度お読みください。それでも実行可能と思われる場合は、PruningDeadBranchesで説明されている方法のいずれかを使用できます。

于 2012-06-13T13:46:09.080 に答える
4

個人的には、ブランチを閉じてプッシュを強制します (Tim Henigan が説明しているように)。これは、DAG を真実の状態のままにするためです。ただし、別のオプションがあります。ダミーのマージを行います。これはマージですが、入ってくる変更を無視します。

hg update C
hg -y merge --tool=internal:fail B
hg revert --all --rev .
hg resolve -a -m
hg ci

最終結果は

M
|\
C |
| |
| B
|/
A

...しかし、M には B の変更が含まれていません。

于 2012-06-13T14:33:29.973 に答える
3

コマンドを使用してbackout、B 変更を元に戻します。

hg up B
hg backout B

これで、作業ディレクトリは B の前と同じ状態になりました。これを と呼びますA'

バックアウトしたら、実際の変更を行ってコミットします。履歴は次のようになります。

C
|
A' 
|
B
|
A
于 2012-06-13T14:54:53.033 に答える
1

他の人々は「B」を取り除くためのいくつかの良い答えを持っていますが、それをそこに出すためにあなたはいつでもすることができます:

hg push --rev C

これはCをプッシュしますが、Bはプッシュせず、新しいヘッドについて文句を言いません。

于 2012-06-13T15:22:36.997 に答える
1

Mercurial ブランチは永続的で、コミット オブジェクト自体に登録されます。主にここにリストされている、ブランチを閉じたり削除したりするための(あまり簡単ではない)方法がいくつかあります。私はすでにそれらのいくつかを以前に使用したことさえあります. これらは、一時的なものであると考えてブランチを使用した人にとっては、やや絶望的な解決策であることに注意してください。

ただし、本当に一時的なブランチが必要な場合は、ブックマークを使用してください。

于 2012-06-13T13:17:00.717 に答える