web-dev-qa-db-ja.com

git reset --hardとgit reset --mergeの違いは何ですか

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

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は空です。

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

38
opsb

git reset manpage から:

-hard作業ツリーとインデックスを、切り替え先のツリーのインデックスと一致させます。 
 <commit>以降の作業ツリー内の追跡ファイルへの変更はすべて失われます。
 
-merge 
インデックスをリセットして、指定した名前のツリーに一致するようにします。コミット、および
は、指定されたコミットと
作業ツリーの現在のコミットとで異なるファイルを更新します。

git reset --mergegit reset --hardのより安全なバージョンとなることを目的としています。変更と他の誰かの変更が混在し、変更を持ち込もうとする場合です。

28
Jakub Narębski

記事「 Git undo、reset、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

manojldsanswer で説明されており、 ブログ投稿 で示されているように、後者は次のようなエラーメッセージが表示されたときに特に役立ちます。

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

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

git reset --merge HEAD

ワークツリー内のコミットされていない変更を使用してクリーンマージを行ったが、コミットされていない変更を失うことなくマージを再度破棄するという、かなり異なるケースに対応します。
変更がない場合は、単に--hardが、ここでは、ブランチの先端を移動しながら、それらをマージして、 'git checkout -m 'はHEADを移動します。

12
VonC

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

8
manojlds

どうやらによると:

http://www.kernel.org/pub/software/scm/git/docs/git-reset.html

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

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

3
Jon