履歴から削除せずに変更を破棄する


180

うまくいかなかったコミットがあるので、履歴から削除せずに破棄したい。

以前のリビジョンから更新してコミットし、新しいヘッドを作成しました。


私はブランチを持っていません、ブランチは必要ありません。単に新しいヘッドをそのままそのまま使い続けたいだけです。空想的でもなく、マージも心配もなく、前のものを忘れてください。

どうすればいいのかわからないようで、できないと思い始めています。私が見つけたのは、ブランチに関するもの、またはマージに関するものです。


1
リポジトリにあるため、履歴から削除されていません。新しいヘッドを作成したので、間違いなく修正を続けることができます。新しい頭で続けるのを妨げているものは何ですか?
テイラー

ブランチに対する嫌悪感は何ですか?
Andres Jaan Tack

@Andresブランチへの嫌悪ではありません。私はそれを閉じるためにそれを作成するという愚かな追加のステップなしで動作するようにそれを必要としました。
o0 '。

誰もが読む-このシナリオではブランチがすでに作成されていることに注意してください。この回答に与えられた説明を注意してください。stackoverflow.com/a/3692607/3195477
UuDdLrLrSs

回答:


181

忘れたいリビジョンでリポジトリを先頭に更新してから、hg commit --close-branchその(匿名)ブランチをクローズ済みとしてマークするために使用します。次に、必要ブランチのヘッドに更新して、作業を続けます。

-cオプションをhg headsに使用すると、閉じたブランチを表示できますが、デフォルトでhg mergeは表示されず、閉じたヘッドとマージしようとしないことがわかります。

hg push --forceプッシュするとリモートリポジトリに実際に追加のヘッドが作成されるため、このクローズドヘッドを別のリポジトリに初めてプッシュするときに使用する必要があります。Mercurialに、これで問題ないことを伝えてください--force。閉じた頭を引っ張る人々は警告によって悩まされることはありません。


3
@Niall C.が名前付きブランチとしてマークした場合にのみ機能しますか?私は彼が、彼はそれがデフォルトになっていることをやったと言っているものと仮定しているから
msarchet

しかし...それは真実ではありません、私が呼び出すとき、私はまだ両方の頭をリストにしていますhg heads...私はMercurial 1.4.3を使用しています、それは新しい機能ですか?
o0 '。

2
@msarchet:AFAIK、今日試してみると、-close-branchは匿名ブランチでは機能しません。すべきですが、そうではありません。Mercurialの将来のバージョンでこの変更が行われることを願っています。匿名ブランチは非常に優れていますが、名前付きブランチと同じようにファーストクラスである必要があります。
Krazy Glew、2012年

4
@KrazyGlew:問題は、「匿名の」ブランチは、実際には、そのベースとなったブランチと同じ名前の2番目のブランチにすぎないということです。(名前付き)ブランチを実際に閉じようとしているのではありません。これまで行った変更を破棄しようとしています。つまり、hg branches現在のブランチ名を表示する必要があります。ブランチを閉じようとするのではなく、匿名ブランチを元のブランチにマージして、すべての変更を破棄します。
StriplingWarrior

2
私の場合、デフォルト(これは標準)と呼ばれるブランチと、デフォルト/マスターと呼ばれる別のブランチがあります(リモートデポが実際にgitであるという事実によります)。hg update default / master; hg commit --close-branch; hg update defaultは私のために働きました。
MattD、2014

68

この段階ではブランチを使用したくないと思いますが、それはまさにあなたがやったことです。以前のバージョンに戻って動作するものをコミットすると、名前のないブランチが作成されましたが、ブランチはまったく同じです。


同じように続けて、複数の頭を持つことを心配しなくても問題はありませんが、誤って一度間違った頭を選んでしまわないように片付けたい場合は、古いブランチを削除できます。

Mercurialのドキュメントには、Pruning Dead Branchesに関するさまざまなオプションを紹介する優れたセクションがあります。

古いブランチを「クローズ」としてマークするのが最良の方法だと思います。古いヘッドがリビジョン「123」の場合:

hg update -r 123
hg commit --close-branch -m 'Closing old branch'
hg update -C default

3
ブラー-私が入った後、ちょうど@ニアルの答えを見た。Niallの賛成票を投じ、鉱山はゼロポイントのプールで低迷する可能性があります。:)
Nick Pierpoint 2010

1
私、あなたの答えは、より良い、それが少ない(私が言うことができるように近くにgitのユーザーを混乱させるために選ばれているように見える)merucrialの用語のgroking必要と似
tacaswell

8
笑それは逆です!mercurialの用語はsvnユーザーにとって自然に聞こえるように選択されましたが、gitの用語は地獄と混同しています!とにかく、最後の更新が含まれているため、この回答に賛成-C
Tobia

2
あなたはなぜ必要なのですか-Chg update?変更されたファイルはないように見えるので、それがなくても動作するはずです。
最大

1
私が知る限り、どこにも-Cは必要ありません。ただし、更新しようとしたときに未処理の変更がある場合は、中止されます。
イーライアルバート

21

まず、次のように入力します。

hg heads

3つのヘッドがリストされていると想像してください。

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

たとえば、最後のヘッド(223)をアクティブにして残りを閉じたいとします。

その後、次のようにします。

#59を閉じる

hg up -r 59
hg ci --close-branch -m "clean up heads; approach abandoned"

頭を閉じて#123

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"
Jason R. Coombs

5
また、作業コピーが閉じたばかりのヘッドに残っていることを除いて、最後に少し完了しました。閉じたヘッドで別の変更をコミットすると、再び開きます。あなたはしたいと思うhg up -r 223すべての変更を行う前に。
Jason R. Coombs

@ジェイソン・R・クームス:そうです!
Artur Barseghyan

@Niallと私の今の経験によれば、複数のヘッドを押すことについての警告を通過するhg push --forceだけでなく、が必要になりますhg push
2018年

1
@Artur一般的に同意します。この場合、hg pushそれ自体ではうまくいきませんでした。複数のヘッドがあるために拒否した場合、外部リポジトリに変更をプッシュすることをどのように推奨しますか?
craq

12

使いたいhg backout。これにより、変更セットによって行われた変更が子の変更セットから削除されます。

良い説明のためにこれをチェックしてください。 Mercurialバックアウト


2
これが正解です。バックアウトはチェンジセットの逆を追加し、作業を取り消し、コミットメッセージを提供して、アイデアが気に入らなかった理由を思い出させます。
Ry4an Brase

7
私は実際には同意しません-片方の頭で作業を中止し、良い開始点からやり直すことは、バックアウトを使用するよりもクリーンな作業パターンのように見えます。特に、一度に複数のチェンジセットをバックアウトすることはできないためです。
Martin Geisler、2009

1
@マーティン・ガイスラー、私はこれに一般的に同意しますが、OPはブランチなしの変更を放棄したいと述べました
msarchet

2
@Martin Geislerええ、私はブランチするのがすべてで、たまに悪い変更を加えるのが最善です
msarchet

1
それは時々役立つかもしれませんが、それは本当に私が欲しかったものではありませんでした。とにかくありがとう:)
o0 '。

2

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でのみ機能することを意味します。


2

不要なブランチを閉じる、または削除する代わりに、その影響を完全に破棄する方法でブランチをマージしますが、履歴は残します。このアプローチでは、これらの不要な変更がプッシュで伝達される可能性があります。これが意図した効果である場合にのみ使用してください。

チェンジセットの履歴が次のようになっているとします。

1-2-3-4-5-6    
       \    
        7-8-*

それがある56、もはやこれを望んではありません。

あなたはこれを行うことができます:

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歴史の中に保存されているが、より最近は何も影響しません。


2

これはEvolve拡張機能の使用例です。現在Mercurialにはバンドルされていないため、技術的にはサードパーティの拡張機能です。しかし、それはMercurial開発者を含む多くの人々によってかなり頻繁に使用されており、非常に活発に開発されており、どこにも行きません。

Evolve拡張機能を使用すると、簡単に

hg prune -r revname

そしてあなたの人生を乗り越えます。csetは引き続き存在しますが、廃止されました。--hiddenMercurialコマンドにオプションを渡さない限り表示されず、デフォルトではリモートリポジトリにプッシュされません。本当にやりたいなら強制してもいいと思うけど。

剪定しているcsetに保持したい祖先がある場合、hg evolveこれらのチェンジセットをリベースするために実行する必要があります。hg evolve自動的に行われます。それ以外の場合は、何もする必要はありません。


1

不要なヘッドを複製せずに、破損したリポジトリを新しいリポジトリに複製できます。次に、古いリポジトリを削除し、新しく作成したクローンを元の場所に移動して、引き続き作業します。これにはしばらく時間がかかりますが、不要なリビジョンの兆候がなく、完全にクリーンなリポジトリが得られます。

hg clone --rev myGoodResition myDirtyRepo myCleanRepo

1
これは完全に申し訳ありませんが、申し訳ありません。
o0 '。

4
@Kristof:それは冗談ですか?私の投稿の最初の行
もう一度

-1

エラーで作成されたヘッドの首を斬首したいとき、この問題に何度も遭遇しました。私はいつもそれが地球の表面から消えるのを見たいです。

ローカルコピーで最新のものを入手してから、

  1. 削除するヘッドの先頭(新しいネックが分岐し始める場所)を見つけ、リビジョン番号を取得します

  2. それをはがします。


ソース:TipsAndTricks

ソース:PruningDeadBranches#Using_strip

hg --config extensions.hgext.mq= strip -n <rev>
  1. 簡単なファイル更新を行い(ファイルに空白を追加)、コミットしてプッシュします。

これで、リポジトリの頭が取り除かれているはずです。ストリッピングでは中央リポジトリにプッシュできる変更が作成されないため、最後の手順は重要です。最後のステップがなければ、ローカルで頭をはがしただけです。


1
ただし、プッシュしても、リモートリポジトリから何も削除されません。追加するだけです情報をするです。変更セットがすでに中央リポジトリにある場合は、evolve拡張機能を使用するか、中央サーバー自体でなんらかの方法でそれを取り除く必要があります。変更セットがまだ中央リポジトリにない場合は、ローカルで削除することで、プッシュは必要ありません。
Ben
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.