私の実験では、機能的な違いを見つけることができませんでした
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は空です。
誰かが違いを説明する手順を思い付くことができますか?
-hard作業ツリーとインデックスを、切り替え先のツリーのインデックスと一致させます。 <commit>以降の作業ツリー内の追跡ファイルへの変更はすべて失われます。 -merge インデックスをリセットして、指定した名前のツリーに一致するようにします。コミット、および は、指定されたコミットと 作業ツリーの現在のコミットとで異なるファイルを更新します。
git reset --merge
はgit reset --hard
のより安全なバージョンとなることを目的としています。変更と他の誰かの変更が混在し、変更を持ち込もうとする場合です。
記事「 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
manojlds の answer で説明されており、 ブログ投稿 で示されているように、後者は次のようなエラーメッセージが表示されたときに特に役立ちます。
fatal: You have not concluded your merge. (`MERGE_HEAD` exists)
スレッド「 [PATCH]マージ中にマージを拒否する 」もその点を詳しく説明しています。
git reset --merge HEAD
ワークツリー内のコミットされていない変更を使用してクリーンマージを行ったが、コミットされていない変更を失うことなくマージを再度破棄するという、かなり異なるケースに対応します。
変更がない場合は、単に--hard
が、ここでは、ブランチの先端を移動しながら、それらをマージして、 'git checkout -m
'はHEAD
を移動します。
これは、作業ツリーの変更を使用してプルを実行し、マージが期待どおりではないことがわかった場合に役立ちます(コミットが作業中のファイルに影響を与えないと予想していた可能性があります)。この時点で、git reset --hard ORIG_HEAD
、ローカルの変更を含むすべてを吹き飛ばします。もしあなたがそうするなら git reset --merge ORIG_HEAD
、ローカルの変更を保持します。
どうやらによると:
http://www.kernel.org/pub/software/scm/git/docs/git-reset.html
-hard-作業ツリーとインデックスを切り替え先のツリーのインデックスと一致させます。
<commit>
以降の作業ツリー内の追跡ファイルへの変更は失われます。-merge-名前付きコミットによって記録されたツリーと一致するようにインデックスをリセットし、名前付きコミットと現在のコミットの間で異なるファイルを更新します作業ツリー内。