web-dev-qa-db-ja.com

Mercurialは「中止:コミットされていない未解決の変更」と言い、コミットしたくない

シナリオ:オフィスを離れる前のローカルリポジトリ

$ hg status

M important/update1
M another/important/update2
M work/in/progress

家に帰ったときにこれらのファイルをローカルリポジトリにプルしたいので、コミットしてプッシュimportant/update1およびimportant/update2をプッシュします。コミットする準備ができていませんwork/in/progress。実際、正しく解析することすらできません。そのファイルはmy IDE=で開かれています。そのまま残しておきたいだけです。

今私はそうします:(急いで、トラムは3分で出発します)

$ hg commit important/update1 another/important/update2
$ hg Push

pushing to https://**censored**
searching for changes
abort: Push creates new remote heads on branch 'default'!
(did you forget to merge? use Push -f to force)

OK。同僚が何かを押しました...(2分で路面電車が去ります...)

$ hg pull (really important update!)
$ hg update

abort: outstanding uncommitted changes

くだらない。同僚の更新が必要ですが、コミットするつもりはありませんwork/in/progress、はるかに少ないプッシュしてください!路面電車に乗り遅れた...

これにどう対処しますか?

31

attic extension を使用して、進行中の作業を一時的に保留/保存します。

7
Bert F

Shelveを使用したくない場合は、次の3つのコマンドで実行できます。

hg diff > mylocalchanges.txt

hg revert -a

# Do your merge here, once you are done, import back your local mods

hg import --no-commit mylocalchanges.txt
36
minaz

複数の機能/バグ修正を同時に開発する人々のためのワークフロー:

1つの可能性は、開発した機能と同じ数のリポジトリを複製することです。しかし、これはディスク容量、時間、そして混乱を招く可能性があります。別の可能性は、同じローカルリポジトリ上の別のサブジェクトで作業することです(Mainと呼びましょう)が、second oneを使用して、1つ以上の必要な機能を中央リポジトリに選択的にコミットします。

これについては、この記事で非常によく説明され、詳しく説明されています。

https://blogs.Oracle.com/tor/entry/Mercurial_tip_checking_in_regularly

次のエラーメッセージが表示された場合:

  • 「中止:プッシュは新しいリモートヘッドを作成します!」 (潜在的な複数の頭)
  • 「中止:ブランチをまたぐ( 'hg merge'または 'hg update -C'を使用)」(プルされた変更とは異なるブランチで作業ディレクトリ)、または
  • 「中止:コミットされていない未解決の変更」(ローカルでの変更によりマージできません)

次に、上記の記事では、このすべてが発生している理由を説明し、これらの問題を回避するためのワークフローを提案しています。注:mqueuesパッチメカニズムを使用して変更をプッシュすることもできます(記事のコメント1を参照)。

お役に立てれば幸いです。

6

通常は TortoiseHg shelve extension を使用します。これは、コマンドラインで使用するためにアクティブ化することもできます。

[extensions]
tortoisehg.util.hgshelve =

これで、次のコマンドを使用できます。

$ hg shelve

更新によって作業が妨げられないことがわかっている場合は、プル/更新を強制することもできます(hg pull -f)。

5
xrstf

自宅でプルして作業を続けることができるように、コードをネットワークに公開するためだけにプッシュしている場合、同僚が同じリポジトリにプッシュしている必要があることはわかりません。開発者リポジトリの使用を検討することもできます:個人的な使用のためのリポジトリ(許可によるか、強制/丁寧さによる)。

特定のプログラム( FogCreek's Kiln SW など)はこの機能を提供しますが、ネットワーク/共有ドライブにリポジトリを保存するだけでも、そこに個人的なリポジトリを作成できるはずです。

そうでない場合(つまり、サーバーの権限がない場合)、名前付きブランチの使用を検討することもできます。この場合、名前付きブランチにコミットし、そのブランチをサーバーにプッシュします。おそらくあなたの同僚はあなたの名前付きブランチをそのままにしておき、プルしてマージするための新しいものは何もないでしょう。 「ブランチの乱雑さ」に関しては、はい、それらはリポジトリの存続期間中存在しますが、マージの直前に名前付きブランチを閉じると、それらが見えなくなり、いくつかの問題が解決します。

> hg update <branch name>
> hg commit --close-branch -m 'closing branch <branch name>'

結局のところ、(a)巨大なチームを抱えている、または(b)ブランチを閉じていないのでない限り、ブランチの乱雑さは大きな懸念とは見なしません。

1
dls