うまくいかなかったコミットがあるので、履歴から削除せずに破棄したい。
以前のリビジョンから更新してコミットし、新しいヘッドを作成しました。
私はブランチを持っていません、ブランチは必要ありません。単に新しいヘッドをそのままそのまま使い続けたいだけです。空想的でもなく、マージも心配もなく、前のものを忘れてください。
どうすればいいのかわからないようで、できないと思い始めています。私が見つけたのは、ブランチに関するもの、またはマージに関するものです。
うまくいかなかったコミットがあるので、履歴から削除せずに破棄したい。
以前のリビジョンから更新してコミットし、新しいヘッドを作成しました。
私はブランチを持っていません、ブランチは必要ありません。単に新しいヘッドをそのままそのまま使い続けたいだけです。空想的でもなく、マージも心配もなく、前のものを忘れてください。
どうすればいいのかわからないようで、できないと思い始めています。私が見つけたのは、ブランチに関するもの、またはマージに関するものです。
回答:
忘れたいリビジョンでリポジトリを先頭に更新してから、hg commit --close-branch
その(匿名)ブランチをクローズ済みとしてマークするために使用します。次に、必要なブランチのヘッドに更新して、作業を続けます。
-c
オプションをhg heads
に使用すると、閉じたブランチを表示できますが、デフォルトでhg merge
は表示されず、閉じたヘッドとマージしようとしないことがわかります。
hg push --force
プッシュするとリモートリポジトリに実際に追加のヘッドが作成されるため、このクローズドヘッドを別のリポジトリに初めてプッシュするときに使用する必要があります。Mercurialに、これで問題ないことを伝えてください--force
。閉じた頭を引っ張る人々は警告によって悩まされることはありません。
hg heads
...私はMercurial 1.4.3を使用しています、それは新しい機能ですか?
hg branches
現在のブランチ名を表示する必要があります。ブランチを閉じようとするのではなく、匿名ブランチを元のブランチにマージして、すべての変更を破棄します。
この段階ではブランチを使用したくないと思いますが、それはまさにあなたがやったことです。以前のバージョンに戻って動作するものをコミットすると、名前のないブランチが作成されましたが、ブランチはまったく同じです。
同じように続けて、複数の頭を持つことを心配しなくても問題はありませんが、誤って一度間違った頭を選んでしまわないように片付けたい場合は、古いブランチを削除できます。
Mercurialのドキュメントには、Pruning Dead Branchesに関するさまざまなオプションを紹介する優れたセクションがあります。
古いブランチを「クローズ」としてマークするのが最良の方法だと思います。古いヘッドがリビジョン「123」の場合:
hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default
-C
でhg update
?変更されたファイルはないように見えるので、それがなくても動作するはずです。
hg heads
changeset: 223:d1c3deae6297
user: Your name <your@email.com>
date: Mon Jun 09 02:24:23 2014 +0200
summary: commit description #3
changeset: 123:91c5402959z3
user: Your name <your@email.com>
date: Sat Dec 23 16:05:38 2013 +0200
summary: commit description #2
changeset: 59:81b9804156a8
user: Your name <your@email.com>
date: Sat Sep 14 13:14:40 2013 +0200
summary: commit description #1
その後、次のようにします。
hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"
hg up -r 123
hg ci --close-branch -m "clean up heads; approach abandoned"
hg push
hg up -r 223
これで完了です。
--close-branch -m "Closing branch - technique #2 abandoned in favor of technique #3"
。
hg up -r 223
すべての変更を行う前に。
hg push --force
だけでなく、が必要になりますhg push
。
hg push
それ自体ではうまくいきませんでした。複数のヘッドがあるために拒否した場合、外部リポジトリに変更をプッシュすることをどのように推奨しますか?
使いたいhg backout
。これにより、変更セットによって行われた変更が子の変更セットから削除されます。
良い説明のためにこれをチェックしてください。 Mercurialバックアウト
NiallとNickの答えはどちらもまっすぐです。ぶら下がっているヘッドをたくさん作成しているので、ヘッドをより簡単に閉じるためのエイリアスを作成しました。これをあなたに追加することによって.hgrc
:
[alias]
behead = !REV=$($HG id -i); $HG update $@ -q && $HG ci --close-branch -m "Closing dead head" && $HG update $REV -q
(すでに[alias]
セクションがある場合は、代わりにセクションに追加できます)
次のように、1つのコマンドでヘッドを閉じることができます(手動で別のチェンジセットに更新する必要はありません)。
$ hg behead 123
注:エイリアスはMercurialエイリアスがシェルコマンドになる可能性があるという事実を利用しています。これは、Windowsではなく、UNIXでのみ機能することを意味します。
不要なブランチを閉じる、または削除する代わりに、その影響を完全に破棄する方法でブランチをマージしますが、履歴は残します。このアプローチでは、これらの不要な変更がプッシュで伝達される可能性があります。これが意図した効果である場合にのみ使用してください。
チェンジセットの履歴が次のようになっているとします。
1-2-3-4-5-6
\
7-8-*
それがある5
と6
、もはやこれを望んではありません。
あなたはこれを行うことができます:
hg up 8
hg merge -r 6 -t :local
hg commit ...
これはこれを作成します:
1-2-3-4-5-6
\ \
7-8-9-*
を更新する8
ことで、履歴内の必要なヘッドで作業していることを確認できます。
-t :local
指示すると呼ばれるマージ「ツール」を使用するHG 地元すなわち、他のブランチからの変更、現在の作業フォルダの状態によって表されていないものを無視するように指示します。詳細情報。
したがってにおける不要な変更5
とは、6
歴史の中に保存されているが、より最近は何も影響しません。
これはEvolve拡張機能の使用例です。現在Mercurialにはバンドルされていないため、技術的にはサードパーティの拡張機能です。しかし、それはMercurial開発者を含む多くの人々によってかなり頻繁に使用されており、非常に活発に開発されており、どこにも行きません。
Evolve拡張機能を使用すると、簡単に
hg prune -r revname
そしてあなたの人生を乗り越えます。csetは引き続き存在しますが、廃止されました。--hidden
Mercurialコマンドにオプションを渡さない限り表示されず、デフォルトではリモートリポジトリにプッシュされません。本当にやりたいなら強制してもいいと思うけど。
剪定しているcsetに保持したい祖先がある場合、hg evolve
これらのチェンジセットをリベースするために実行する必要があります。hg evolve
自動的に行われます。それ以外の場合は、何もする必要はありません。
エラーで作成されたヘッドの首を斬首したいとき、この問題に何度も遭遇しました。私はいつもそれが地球の表面から消えるのを見たいです。
ローカルコピーで最新のものを入手してから、
削除するヘッドの先頭(新しいネックが分岐し始める場所)を見つけ、リビジョン番号を取得します
それをはがします。
ソース:TipsAndTricks。
ソース:PruningDeadBranches#Using_strip。
hg --config extensions.hgext.mq= strip -n <rev>
これで、リポジトリの頭が取り除かれているはずです。ストリッピングでは中央リポジトリにプッシュできる変更が作成されないため、最後の手順は重要です。最後のステップがなければ、ローカルで頭をはがしただけです。