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
,你会保留你的本地修改。
上一篇: What's the difference between git reset
下一篇: How to make submodule with detached HEAD to be attached to actual HEAD?