7

git を使用すると、次のようなコマンドを使用して、誤ったまたは偶発的なコミットを破棄できます。

git reset --soft HEAD^

これは、作業ツリーに触れることなく、現在のブランチ ( などmaster) を現在のリビジョンの親コミットにリセットします。作業ツリーも消去したい場合は、 に置き換えることができます。HEAD^--soft--hard

さらに、複数のコミットを取り除きたい場合は、次のようなコマンドを使用できます

git reset --hard 53b94d0

これにより、その後何もコミットしていないかのように、53b94d0 をコミットするように正確に戻ります。

Mercurial (hg) に相当するものは何ですか?

4

1 に答える 1

19

Mercurial は簡単​​な代替手段を提供しておらず、変更可能な履歴という考えを避けていますが、それに近いものを実現する方法がいくつかあります。この投稿では、それらのいくつかの概要を説明します。

hg ロールバック

最後のコミットを特に取り消したい場合は、次を使用できます。

hg rollback

これにより、コミットが取り消されます (作業ツリーには影響しません。作業ディレクトリ全体もリセットしたい場合は、 hg revert --allorで追跡できるはずです)。hg update -C

hg クローン -r

giraffeリビジョン 77182fb7451f に呼び出されたリポジトリをリセットするとします。cd親ディレクトリに入って実行した場合:

hg clone -r 77182fb7451f giraffe new-giraffe
cp giraffe/.hg/hgrc new-giraffe/.hg/

その後、リビジョン 77182fb7451f のリポジトリである new-giraffe になります。(これcpは、new-giraffe (git の「リモート」など)がデフォルトのフォルダーでpathsはなく、元のリポジトリを正しく指すようにするために必要です。)giraffe

これは、ファイルをディスクにローカルにコピーするだけなので (多くのシステムでは、時間とスペースをさらに節約するためにファイルをハードリンクするため)、インターネットから再クローンするよりも高速ですが、リポジトリが大きい場合は依然として非常に時間がかかる可能性があります。

hgストリップ

コミット履歴を変更してより複雑なことをしたい場合 (ちなみに、hg の世界ではやや眉をひそめています)、最初に.hgrcの行を等号の後):

[extensions]                                                                    
mq =

hg stripこれにより、変更セットとそのすべての子孫をリポジトリから完全に削除するコマンドが (他の便利なものとともに) 提供されます。したがって、次のようなコマンドを使用できます。

hg strip 1cc72d33ea76

1cc72d33ea76 が、削除したいリポジトリ内の最初の「悪い」変更セットである場合。

hg heads残念ながら、この方法を使用して正確に正しい変更セットを削除することはしばしば困難であり、複数のヘッド ( を使用して表示できます) で終わるのは非常に簡単ですhg strip。余分な頭。

revsetを使用したhgストリップ

hg revsetsを使用すると、次のようなコマンドを使用して、元に戻したいリビジョンの祖先ではない.(現在のリビジョン) のすべての祖先を削除できます。

hg strip "ancestors(.) and not ancestors(77182fb7451f)"

最初に実行することを確認してください:

hg log -r "ancestors(.) and not ancestors(77182fb7451f)"

これにより、削除されるすべての変更セットが表示されるhg stripため、コミット履歴に取り返しのつかないほどの損害を与えないようにすることができます (バックアップがあるため… ですよね?)。

于 2012-07-04T04:44:15.263 に答える