web-dev-qa-db-ja.com

TortoiseHgで偶発的なブランチを削除する方法は?

(私はTortoiseHgに比較的慣れていないので、我慢してください:-) 2台のマシンでTortoiseHgを使用して、リモートソースリポジトリと通信します。 1台のマシンで変更を加えてコミットし、リモートリポジトリにプッシュしようとしましたが、最初にプルして最新のコードを取得するのを忘れていました。プッシュは私に数行の出力を与え、最初にプルするのを忘れたかもしれないことを示唆し(本当です!)、「abort:プッシュは新しいリモートブランチを作成します...」のようなものに言及しました。

そこで、プルを実行しました。これにより、リポジトリエクスプローラーのグラフの先頭にいくつかのノードが追加されました。問題は、私が実行しようとしたプッシュがリポジトリエクスプローラーにブランチとして表示されていることです。サーバー側(コードプレックス)から見ると、プッシュを試みた兆候は見られず、この偶発的なブランチがまだ私のマシン上でローカルであることを示しています。

この偶発的なブランチを削除するにはどうすればよいですか?グラフでそのノードを選択してから「元に戻す」を実行しようとしましたが、何も実行されなかったようです。ローカルマシン上のディレクトリツリーを破棄して、サーバーから完全に新しいクリーンなプルを実行するのが最も簡単かどうか疑問に思っています...?

21
Michael Sorens

まず、すべてのローカル変更をコミットしたことを確認してください。次に、hg mergeを呼び出してブランチをマージし、結果をコミットします。

これにより、2つのヘッドが再結合され、単一のブランチに戻るはずです。

17
sth

不要なブランチがありましたが、ファイル名の大文字と小文字の変更に基づく競合が含まれていたため、ブランチをマージできませんでした(またはマージ方法を理解するのが非常に困難でした)。

最終的に、私はhg commit --close-branch。ブランチはローカルリポジトリにのみ存在し、クローンを作成したリポジトリには存在しなかったため、後続のhg Push閉じたブランチをマスターリポジトリにプッシュすることすらしませんでした!とても便利。その時点で、それを完全に排除するために私がしなければならなかったのは、ローカルリポジトリを削除し、「マスター」から再クローンを作成することだけでした。

7
Paul Martz

「マージあり」を実行し、「マージターゲット(その他)リビジョンからのすべての変更を破棄する」をチェックします。もちろん、マージボタンをクリックする前に、マージターゲットとして表示されているターゲットが本当に破棄したいターゲットであることを確認する必要があります。

5
mhenry1384

リポジトリエクスプローラーで、ローカル変更の最初のリビジョンを選択し、プルしたブランチの先端を右クリックして、「選択したものの上にリベース」または「履歴の変更->選択したものの上にリベース」を選択します。クライアントバージョン。これにより、プルされた回転数が「リベース」されます。

さらに、将来それを回避するのを助けるために...

リポジトリエクスプローラで、[ツール]-> [設定]を選択します。左上のドロップダウンで[ユーザーのグローバル設定]を選択します。これはすべてのリポジトリに適用されます。次に、左側の[同期]を選択します。 「プル操作後」で「リベース」を選択します。これにより、ローカルリビジョンは、別のブランチに残すのではなく、プルしたばかりのリビジョンに「リベース」されます。

これは私がそれを行う方法であり、おそらくあなたが通常望んでいることです。

詳細については、 リベースプロジェクト および リベース拡張 を参照してください。

2
Kyle Heironimus

これは、コマンドラインツールでそれを行う方法です。 TortoiseHgに簡単にマッピングできると思います(使用したことがないのでわかりませんが…)とにかく、たまにしかやらないので、ここで端末を使っても問題ないと思います。 。

セットアップ例

リモートリポジトリが次のようなものであるとします。

@  changeset:   3:a4c18a1fba12
|  tag:         tip
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

ローカルでは、コミット4がなかったため、コミット3で直接何かをコミットしました。

@  changeset:   3:39526003350f
|  tag:         tip
|  summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

だからあなたはそれをプッシュしようとすると、このメッセージを受け取ります:

$ hg Push
pushing to ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
remote has heads on branch 'default' that are not known locally: a4c18a1fba12
abort: Push creates new remote head 39526003350f!
(pull and merge or see "hg help Push" for details about pushing new heads)

要求に応じて、プルします。

$ hg pull
pulling from ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

あなたは今それを持っています...

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4
|
| @  changeset:   3:39526003350f
|/   summary:     commit 4 made locally
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

...しかし、要求どおりにマージしたくない。代わりにこれが必要です。

o  changeset:   4:a4c18a1fba12
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

そして、それをリモートリポジトリにプッシュします。

どうやってそれを手に入れますか?

それを解決する

それを得るために、あなたはできません「ローカルで作成されたコミット4」をプッシュしました。また、それを置く方法はありませんafter新しいリモートコミット。そうは言っても、私たちは私たちが求めたものを手に入れることができます。

そうは言っても、ローカルコミットを新しいリモートコミットにリベースする必要があります。

$ hg rebase --source 3 --dest 4

運が良ければ、それで十分です。

競合の処理

運が悪い場合は、いくつかの競合が発生する可能性があります。

$ hg rebase --source 3 --dest 4
rebasing 3:39526003350f "commit 4 made locally"
merging test.txt
warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark')
unresolved conflicts (see hg resolve, then hg rebase --continue)

次に、(手動で編集して)競合を解決します。

$ hg st
M test.txt
$ nano test.txt # Edit and save

...ファイルを解決済みとしてマークします...

$ hg resolve --mark
(no more unresolved files)
continue: hg rebase --continue

...そしてリベースを続行します:

 $ hg rebase --continue
rebasing 3:39526003350f "commit 4 made locally"
saved backup bundle to /home/adam/software/Mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg

これがあなたの新しい歴史です:

@  changeset:   4:ca31fe8a15f0
|  summary:     commit 4 made locally
|
o  changeset:   3:a4c18a1fba12
|  summary:     commit 4
|
o  changeset:   2:91c5dbfba15c
|  summary:     commit 3
|
o  changeset:   1:4c77cb7952ea
|  summary:     commit 2
|
o  changeset:   0:085dae46f27e
   summary:     commit 1

今、それをプッシュします:

$ hg Push
pushing to ssh://[email protected]/brandizzi/Mercurial-test-repo
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files

当時はそれほど複雑ではありませんでしたね。 :)

0
brandizzi