43

私の実験では、機能的な違いを見つけることができませんでした

git reset --hard

git reset --merge

使用説明書にもヒントはありません

--hard                reset HEAD, index and working tree
--merge               reset HEAD, index and working tree

私はこのオプションを定期的に使用している--hardので、その仕組みを理解しています。--merge--hardオプションの違いは何ですか?

乾杯、 オリー

おそらくここで例が役立つでしょう。次のシーケンスを使用しましょう。

cd git_repo
touch file_one
git add file_one
git commit -m "commit one" # sha1 of 123abc
echo "one" >> ./file_one
git commit -a -m "commit two" # sha1 of 234bcd
echo "two" >> ./file_one
git add . # populate index with a change
echo "three" >> ./file_one # populate working area with a change

今私が試してみると

git reset --merge 123abc

私は得る

error: Entry 'file_one' not uptodate. Cannot merge.
fatal: Could not reset index file to revision '123abc'

file_one の作業領域とインデックスの両方に変更があるためです。

これを改善するために私は

git add .
git reset --merge 123abc

今回は動作しますが、 と同じ結果が得られgit reset --hardます。最初のコミット後と同様に、インデックスは空で、作業領域は空で、file_one は空です。

誰かが違いを説明する手順を思い付くことができますか?

4

5 に答える 5

30

git resetのマンページから:

--hard作業中のツリーとインデックスを、存在するツリーのインデックスと一致させます
               に切り替えました。以降の作業ツリーで追跡されたファイルへの変更
               <commit>は失われます。

- マージ
              名前付きコミットによって記録されたツリーに一致するようにインデックスをリセットし、
              名前付きコミットとの間で異なるファイルを更新します
              作業ツリーの現在のコミット。

は、あなたの変更と他の誰かの変更が混ざり合って、私たちの変更を持ち歩こうとするときにgit reset --merge、より安全なバージョンになることを目的としています。git reset --hard

于 2009-10-27T23:08:08.533 に答える
14

記事 " Git undo, reset or revert? " では、次のように使用した場合のさまざまな使用法がまとめられていORIG_HEADます。

# Reset the latest successful pull or merge
$ git reset --hard ORIG_HEAD

# Reset the latest pull or merge, into a dirty working tree
$ git reset --merge ORIG_HEAD

manojlds回答で言及され、ブログ投稿で示されているように、後者は次のようなエラー メッセージが表示された場合に特に役立ちます。

fatal: You have not concluded your merge. (`MERGE_HEAD` exists)

スレッド「[PATCH] マージ中にマージを拒否する」 にも、その点が詳しく説明されています。

git reset --merge HEAD

これは、ワークツリー内のいくつかのコミットされていない変更でクリーン マージを実行したものの、コミットされていない変更を失うことなくマージを再度破棄したいというかなり異なるケースを満たします。
変更がない場合は を使用するだけですが、ここでは ' ' を移動する--hard場合と同様に、ブランチ チップをマージしながら移動したいと考えています。git checkout -mHEAD

于 2012-09-25T12:21:39.473 に答える
9

これは、作業ツリーで変更をプルして、マージが期待どおりではないことがわかった場合に役立ちます (作業中のファイルにコミットが影響しないことを期待していたかもしれません)。この時点で を実行するとgit reset --hard ORIG_HEAD、ローカルの変更を含むすべてが吹き飛ばされます。実行するgit reset --merge ORIG_HEADと、ローカルの変更が保持されます。

于 2012-08-13T03:11:38.660 に答える