在最近的回答中,他详细介绍的典型应用案例git-reset的三个最常用的选项(--hard,--mixed,和--soft),托雷克顺便提到的是git-reset还提供了两个比较深奥的标志,被称为--merge和--keep.该git-reset手册页描述了如下的两个标志:
Run Code Online (Sandbox Code Playgroud)--merge Resets the index and updates the files in the working tree that are different between <commit> and HEAD, but keeps those which are different between the index and working tree (i.e. which have changes which have not been added). If a file that is different between <commit> and the index has unstaged changes, reset is aborted. In other words, --merge does something like a git read-tree -u -m <commit>, but carries forward unmerged index entries. --keep Resets index entries and updates files in the working tree that are different between <commit> and HEAD. If a file that is different between <commit> and HEAD has local changes, reset is aborted.
我完全理解何时使用--hard,--mixed或者--soft,但是我只是在阅读torek的答案时才知道--merge并--keep存在这些,我想不到这两个标志的实际用例......在什么情况下你通常使用这两个标志?
我主要是寻找一个简单的英语解释.请按照VonC的这个答案的以下段落,其中列出了一个典型的用例git reset --soft,作为模型:
[...] 每一次:
- 你对你最终得到的结果感到满意(在工作树和索引方面)
- 你不满意所有让你到达那里的承诺:
git reset --soft是答案.
但是,我并不是对这些旗帜进行了一些小实验,这与我在这个答案中发布的愚蠢的购物清单示例相似.
坦率地说,我对此并不十分肯定; 我自己从未使用过--merge和--keep模式.但是,发行说明表明git reset --merge在git版本1.6.2中添加了以下注释:
git reset --merge是一种新的模式,其工作方式类似于git checkout交换机分支的方式
,在切换到另一个提交时进行本地更改.并--keep在1.7.1中添加:
git reset学习的--keep选项,允许您丢弃提示附近的提交,同时以类似于方式的方式保留您的本地更改git checkout branch.然后,在1.7.9:
git checkout -B <current branch> <elsewhere>是一种更直观的拼写方式git reset --keep <elsewhere>.这告诉我们背后的想法--keep是,你已经开始在一些分支上工作,然后你意识到:哦,这个分支应该从其他一些点(可能是其他分支的尖端)分叉.例如,您可能:
$ git checkout devel
$ git checkout -b fix-bug-1234
Run Code Online (Sandbox Code Playgroud)
然后做一些工作来修复下一个版本的bug 1234; 但后来有人说:"嘿,我们需要修复旧版本的bug 1234!" 所以现在你想fix-bug-1234分支release而不是devel.与此同时,你还没有做任何事情.那么你:
$ git checkout -B fix-bug-1234 release
Run Code Online (Sandbox Code Playgroud)
把它移到"释放"而不是"脱离开发".哪个适用于1.7.9或更高版本,但在1.7.1到1.7.8中你需要拼写它git reset --keep.
这可能解释--keep但--merge仍然有点神秘.