这个git reset命令中的~1是什么意思?

时间:2013-08-07 11:54:05

标签: git

  

git reset HEAD~1

我的印象是~1意味着:从HEAD开始,按照1个链接,并将HEAD标记设置为新的提交节点。我在期待

  

git reset HEAD~2

关注2个链接,然后设置HEAD标记。但是,如果我尝试它,我会收到一个错误:

$ git reflog
c83bbda HEAD@{0}: reset: moving to HEAD~1
44c3540 HEAD@{1}: commit: you will be garbage soon
c83bbda HEAD@{2}: reset: moving to HEAD~1
aee7955 HEAD@{3}: commit: back to 4 lines
c83bbda HEAD@{4}: reset: moving to HEAD~1
19ec1d5 HEAD@{5}: commit: 3 lines
c83bbda HEAD@{6}: reset: moving to HEAD~1
a049538 HEAD@{7}: commit: added new line
c83bbda HEAD@{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 reset的doc页面在澄清这个方面并不是很有用。那么,~1是什么意思,我为什么需要呢?

4 个答案:

答案 0 :(得分:5)

HEAD~1是&#34; HEAD&#34;的第一个父级,而HEAD~2是&#34; {{1}的第一个父级的第一个父级}等等(所以HEAD对于某些n来说就像HEAD~n后跟n HEAD个符号而没有数字)。同样,所有细节都在git-rev-parse手册页中。

^与#34;混合后的git reset&#34;混合后,请务必小心。一般来说,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^ master现在命名为HEAD名称的相同提交。使用save~2很容易看到,它会告诉您某些符号名称映射到的提交ID:

git rev-parse

此时,您可以使用以下内容将$ git rev-parse save~2 master 0f5a13497dd3da8aff8e452c8f56630f83253e79 0f5a13497dd3da8aff8e452c8f56630f83253e79 恢复到保存点:

master

$ git reset save HEAD移回已保存的修订版,然后如果您愿意,可以安全地删除master

save

请注意,您也可以使用$ git branch -d save 保存一个保存点:分支和标记之间的唯一区别是分支上的新签入时的行为&#34; (标签不移动,分支做)和结账(标签让你进入&#34;分离的HEAD&#34; =非分支状态,分支名称让你进入&#34; on -a-branch&#34; state)。

答案 1 :(得分:3)

有关如何指定提交的详细信息,请参阅git help revisionsGit - Revision Selection

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

修订参数的后缀~<n>表示<n>th的提交对象           生成指定提交对象的祖先,仅跟随第一个父对象。即<rev>~3相当于<rev>^^^,相当于<rev>^1^1^1

此语法可用于大多数Git命令,因此它并非特定于git reset

答案 2 :(得分:2)

git reser --hard HEAD~1删除当前分支中的最后一个(或您放置的任何其他数字),如下所示 git reset HEAD ...删除最后一次提交 git reset HEAD~1 ...删除最后2次提交
等等

答案 3 :(得分:1)

运行git reset --hard HEAD~2

时收到此错误消息
fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree.

因为您尝试将工作副本重置为不存在的提交。根据您的reflog,您在运行此命令时检出了初始根提交:

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

所以根据上面的reflog,你当前的工作副本,即HEAD,是你第一次提交,所以从这里做git reset --hard head~2,你告诉Git回去2在第一次提交之前提交 ,这当然是不可能的,因为在第一次提交之前不存在任何内容:

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