2013-08-07 165 views
2

git reset HEAD~1在這個git reset命令中〜1是什麼意思?

我的印象是,〜1意味着:從HEAD開始,跟隨1個鏈接,並將HEAD標記設置爲新的提交節點。我期待

git reset HEAD~2

跟隨2鏈接,然後設置HEAD標記。但是,如果我嘗試了,我得到一個錯誤:

$ git reflog 
c83bbda [email protected]{0}: reset: moving to HEAD~1 
44c3540 [email protected]{1}: commit: you will be garbage soon 
c83bbda [email protected]{2}: reset: moving to HEAD~1 
aee7955 [email protected]{3}: commit: back to 4 lines 
c83bbda [email protected]{4}: reset: moving to HEAD~1 
19ec1d5 [email protected]{5}: commit: 3 lines 
c83bbda [email protected]{6}: reset: moving to HEAD~1 
a049538 [email protected]{7}: commit: added new line 
c83bbda [email protected]{8}: commit (initial): first commit 


$ git reset --hard HEAD~2 
fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 

顯然我錯了,可是對於git的復位文檔頁面是不是在澄清這一非常有用的。那麼,〜1是什麼意思,爲什麼我需要它?

+2

在這種特殊情況下,「未知版本」部分意味着'HEAD〜2 「根本不存在。 'HEAD'根據reflog提交'c83bbda',這是你的初始提交,所以它沒有父母,'HEAD ^','HEAD〜1'等根本不存在。 – torek

+2

請研究['gitrevisions(7)'手冊](https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html),它解釋了所有這些'〜'和'^'有趣的字符。 – kostix

+0

可能重複[有什麼區別〜和^在混帳](http://stackoverflow.com/questions/14733687/whats-the-difference-between-and-in-git) – kostix

回答

5

HEAD~1是「的HEAD第一個親本」,而HEAD~2是「的HEAD第一親本​​的第一個親本,等等(所以HEAD~n對於一些n爲像HEAD後跟n ^符號和沒有數字)。再次,所有的細節在git-rev-parse手冊頁。

git reset與「從HEAD向後倒數的修訂」混合時要小心。 git reset將,一般來說,變化HEAD值,例如:

$ git checkout master # now on tip of "master" branch 
$ git branch save master # copy branch tip to another label, for safekeeping 
$ git reset HEAD^  # or git reset HEAD~1 

移動HEAD(和master)到其第一父節點。命名該父項的另一種方法是save^,另一種是save~1。此舉完成後,雖然,現在HEAD名字是父母的修訂,所以HEAD^父:

$ git reset HEAD^ 

你移回又邁進了一步,使masterHEAD現在命名相同的承諾是save~2名。這是很容易看到使用git rev-parse,它告訴你提交-ID,一些象徵性的名稱映射到:

$ git rev-parse save~2 master 
0f5a13497dd3da8aff8e452c8f56630f83253e79 
0f5a13497dd3da8aff8e452c8f56630f83253e79 

在這一點上,你可以恢復master到保存點:

$ git reset save 

其移動HEADmaster回所保存的版本,然後你可以刪除save安全,如果你喜歡:

$ git branch -d save 

請注意,您也可以使用git tag也保存一個保存點:分支和標籤之間的唯一區別是「在分支上」(標籤不移動,分支執行)時的新簽入行爲, (標籤把你放在「分離HEAD」=不在分支狀態,分支名稱把你放在「分支」狀態)。

2

git reser --hard HEAD~1刪除最後1(或者你把任何其他數字)從當前分支提交,這樣
git reset HEAD ...刪除最後提交
git reset HEAD~1 ...刪除最後2款
等上

+2

差不多:'git reset HEAD'不會刪除提交。 'reset'的默認值是'reset --mixed',它重置索引但不改變工作樹,並且無論如何,'HEAD'名稱「現在你在哪裏」,所以這也不會移動分支標籤。因此,它取得的效果是撤消任何'git add's和/或'git rm --cached'的效果。 (說它*刪除*提交也是誇大其辭,它通過改變分支名稱的SHA-1值使得提交*出現*消失,最終通過'git gc'離開。) – torek

+0

謝謝澄清:) –

3

關於如何指定投入更多詳情,請參見git help revisionsGit - Revision Selection

<rev>~<n>, e.g. master~3 

A suffix ~<n> to a revision parameter means the commit object that is the <n>th generation ancestor of the named commit object, following only the first parents. I.e. <rev>~3 is equivalent to <rev>^^^ which is equivalent to <rev>^1^1^1 .

這句法可與大多數Git命令中使用,所以它不是具體到git reset

1

當您運行git reset --hard HEAD~2

fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree. 

,因爲你想你的工作副本重置提交不存在您收到此錯誤信息。根據你引用日誌,你必須運行此命令時,你的初始根提交簽出:

$ git reflog 
c83bbda [email protected]{0}: reset: moving to HEAD~1 
# etc ... 
c83bbda [email protected]{8}: commit (initial): first commit 

所以,根據上述引用日誌,你當前的工作副本,即HEAD,是你的第一個承諾,所以通過從這裏做git reset --hard head~2,你告訴混帳回去2款之前,你的第一次提交,這當然纔可以這樣做,因爲都不存在,你的第一個承諾:

fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree. 
相關問題