git 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是空的,因为它是在第一次提交之后。

有人能想出说明差异的步骤吗?


从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 --merge是为了更安全的git reset --hard ,当你的改变和其他人的改变混合在一起时,试图进行我们的改变。


文章“Git撤消,重置或还原?” 总结了与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 -m '为移动HEAD所做的操作。


当你修改工作树并发现合并不是预期的时候(你可能一直期待提交不会影响你正在处理的文件),这会很有帮助。 此时,如果您执行git reset --hard ORIG_HEAD ,则会吹走所有内容,包括本地更改。 如果你做git reset --merge ORIG_HEAD ,你会保留你的本地修改。

链接地址: http://www.djcxy.com/p/23619.html

上一篇: What's the difference between git reset

下一篇: How to make submodule with detached HEAD to be attached to actual HEAD?