git reset --hard和git reset --merge之间有什么区别

时间:2009-10-27 22:48:54

标签: git merge reset

在我的实验中,我无法找到

之间的任何功能差异
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 个答案:

答案 0 :(得分:28)

来自git reset manpage

--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 --mergegit 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

manojldsanswer所述,并由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 - 重置索引以匹配命名提交记录的树,并更新命名提交之间不同的文件   提交和工作树中的当前提交。