在我的实验中,我无法找到
之间的任何功能差异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为空,与第一次提交后相同。
有人能提出说明差异的步骤吗?
答案 0 :(得分:28)
--hard Matches the working tree and index to that of the tree being switched to. Any changes to tracked files in the working tree since <commit> are lost. --merge Resets the index to match the tree recorded by the named commit, and updates the files that are different between the named commit and the current commit in the working tree.
git reset --merge
是git reset --hard
的更安全版本,当您的更改和其他人更改混合在一起时,尝试进行更改。
答案 1 :(得分:12)
文章“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的answer所述,并由blog post说明,后者在您看到如下错误消息时特别有用:
fatal: You have not concluded your merge. (`MERGE_HEAD` exists)
线程“[PATCH] refuse to merge during a merge”也详细说明了这一点:
git reset --merge HEAD
它填补了一个完全不同的情况,你与一些未提交的人进行了一次干净的合并 工作树中的更改,但然后想要再次丢弃合并而不会丢失未提交的更改 如果没有更改,您只需使用
--hard
,但在此处您希望在合并它们时移动分支提示,类似于“git checkout -m
”所做的 移动HEAD
。
答案 2 :(得分:8)
当您使用工作树中的更改进行拉动时,这很有用,并且发现合并不符合预期(您可能一直希望提交不会影响您正在处理的文件)。此时,如果您执行git reset --hard ORIG_HEAD
,则会吹走所有内容,包括您的本地更改。如果您执行git reset --merge ORIG_HEAD
,则会保留您当地的更改。
答案 3 :(得分:3)
显然是根据:
http://www.kernel.org/pub/software/scm/git/docs/git-reset.html
- hard - 将工作树和索引与要切换到的树的索引相匹配。对工作树中跟踪文件的任何更改 因为
<commit>
丢失了。- merge - 重置索引以匹配命名提交记录的树,并更新命名提交之间不同的文件 提交和工作树中的当前提交。