2014-08-28 33 views
12

recent answer中,他詳細介紹了git-reset的三種最常用的選項(--hard--mixed--soft)的典型應用案例,torek提到順便指出git-reset還提供了兩個比較深奧的標誌,稱爲--merge--keep。該git-reset man page介紹這兩個標誌如下:什麼是git-reset的--merge和--keep標誌的典型用例?

--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,但我只瞭解到--merge--keep一邊讀託雷克的答案存在,我可以沒有想到這兩個標誌的實際使用情況......你通常在什麼情況下使用這兩個標誌?

我主要是在尋找簡單英文的解釋。就拿this answer by VonC下面這段文字,它闡明瞭git reset --soft一個典型的使用情況下,作爲一種模式:

[...]每次:

  • 你滿意,你到底是什麼了(在工作樹和索引項)
  • 你是不是滿意,所有的帶你到那裏的提交:

git reset --soft就是答案。

但是,我並沒有避免對這些標誌進行一點實驗,這與我在this answer of mine中發佈的愚蠢購物清單示例的精神類似。

回答

4

坦率地說,我對此並不確定;我從來沒有使用過自己的--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 

,然後做一些工作,以修正錯誤1234下一個版本;但後來有人說:「嘿,我們需要修復舊版本的bug 1234!」所以現在你想fix-bug-1234release而不是devel分支。同時你還沒有做任何事情。所以你:

$ git checkout -B fix-bug-1234 release 

把它移動到「脫穎而出」,而不是「脫下發展」。在1.7.9或更高版本中可用,但在1.7.1到1.7.8中,您必須拼寫它git reset --keep

這或許可以解釋--keep--merge仍然有點神祕。

+0

在你的例子中,如果你從'git reset --keep fix-bug-1234'切換時編輯'buggy-file.c',如果'buggy-file.c'不同在分支'devel'和分支'fix-buf-1234'中。因此,'--merge'。 – 2014-08-28 22:49:11

+0

@DietrichEpp:但是在這種情況下,索引和''(它在'devel'與'release'的不同之處)'中的'--merge':'buggy-file.c' * *它已經進行了暫時的更改(我們修改了工作樹),所以'git reset --merge'也會中止重置。我有感覺在手冊頁描述中有些東西沒有出現。源代碼指出'--merge'被允許在衝突合併的中間,而' - soft'和'--keep'不是。 – torek 2014-08-28 23:20:56

+0

@torek謝謝你。不過,這些標誌對我來說依然非常奇特。如果我覺得有必要使用它們,我可能會回到這裏並發表我自己的答案。 – Jubobs 2014-09-01 17:05:59