git-reset的--merge和--keep标志的典型用例是什么?

jub*_*0bs 15 git git-reset

在最近的回答中,他详细介绍的典型应用案例git-reset的三个最常用的选项(--hard,--mixed,和--soft),托雷克顺便提到的是git-reset还提供了两个比较深奥的标志,被称为--merge和--keep.该git-reset手册页描述了如下的两个标志:

--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.
Run Code Online (Sandbox Code Playgroud)

我完全理解何时使用--hard,--mixed或者--soft,但是我只是在阅读torek的答案时才知道--merge并--keep存在这些,我想不到这两个标志的实际用例......在什么情况下你通常使用这两个标志?

我主要是寻找一个简单的英语解释.请按照VonC的这个答案的以下段落,其中列出了一个典型的用例git reset --soft,作为模型:

[...] 每一次:

  • 你对你最终得到的结果感到满意(在工作树和索引方面)
  • 你不满意所有让你到达那里的承诺:

git reset --soft 是答案.

但是,我并不是对这些旗帜进行了一些小实验,这与我在这个答案中发布的愚蠢的购物清单示例相似.

tor*_*rek 5

坦率地说,我对此并不十分肯定; 我自己从未使用过--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仍然有点神秘.