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

在这个git reset命令中~1是什么意思?,git,Git,git复位头~1 我的印象是~1意味着:从头部开始,跟随1链接,并将头部标记设置为新的提交节点。我期待着 git复位头~2 跟随2个链接,然后设置头部标记。但是,如果我尝试,我会得到一个错误: $ 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 aee79

git复位头~1

我的印象是~1意味着:从头部开始,跟随1链接,并将头部标记设置为新的提交节点。我期待着

git复位头~2

跟随2个链接,然后设置头部标记。但是,如果我尝试,我会得到一个错误:

$ 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 reflog
c83bbda头@{0}:重置:移动到头~1
44c3540头@{1}:提交:你很快就会变成垃圾
c83bbda头@{2}:重置:移动到头~1
aee7955头@{3}:提交:返回到4行
c83bbda头@{4}:重置:移动到头~1
19ec1d5头@{5}:提交:3行
c83bbda头@{6}:重置:移动到头~1
a049538头@{7}:提交:添加新行
c83bbda头@{8}:提交(初始):第一次提交
$git重置--硬头~2
致命:参数“HEAD~2”不明确:未知修订或路径不在工作树中。
使用“---”将路径与修订分开,如下所示:
'吉特[…]-[…]'
显然我弄错了,但是git重置的文档页面在澄清这一点上并不是很有用。那么,~1是什么意思?我为什么需要它?

git reser——硬头~1
从当前分支中删除最后一个1(或您输入的任何其他数字)提交,如下所示
git复位头
。。。删除最后一次提交
git复位头~1
。。。删除最后2次提交
以此类推

HEAD~1
是“HEAD的第一个父项”,而
HEAD~2
是“HEAD的第一个父项的第一个父项”,以此类推(因此
HEAD~n
对于某些n类似于
HEAD
,后面跟着n
^
符号,没有数字)。同样,所有细节都在手册页中

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^
命名其父级:

将您移回另一步,以便
master
HEAD
现在命名与
save~2
名称相同的提交。使用
git rev parse
很容易看到这一点,它告诉您一些符号名称映射到的提交ID:

$ git rev-parse save~2 master
0f5a13497dd3da8aff8e452c8f56630f83253e79
0f5a13497dd3da8aff8e452c8f56630f83253e79
此时,您可以通过以下操作将
master
恢复到保存点:

$ git reset save
它将
标题
主版本
移回保存的修订,然后您可以安全地删除
保存
,如果您愿意:

$ git branch -d save
请注意,您也可以使用
git标记保存保存点:分支和标记之间的唯一区别是“在分支上”(标记不移动,分支会移动)和签出(标记将您置于“分离头”=不在分支上状态,分支名称将您置于“在分支上”状态)时新签入的行为.

有关如何指定提交的更多详细信息,请参阅或:

~,例如master~3
修订参数的后缀
~
表示提交对象,即
th
命名提交对象的生成祖先,仅在第一个父对象之后。即
~3
相当于
^^
,后者相当于
^1^1


此语法可用于大多数Git命令,因此它不是特定于
Git reset

运行
Git reset--hard HEAD~2

fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree.
因为您正试图将工作副本重置为不存在的提交。根据您的reflog,您在运行此命令时签出了初始根提交:

$git reflog
c83bbda头@{0}:重置:移动到头~1
#等等。。。
c83bbda头@{8}:提交(初始):第一次提交
因此,根据上面的reflog,您当前的工作副本,即,
,是在您的第一次提交时,因此从这里执行
git reset--hard HEAD~2
,您告诉git在您的第一次提交之前返回2次提交,这当然是不可能的,因为在您的第一次提交之前没有任何内容:

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

在这种特殊情况下,“未知版本”“part意味着
HEAD~2
根本不存在<根据reflog,code>HEAD
是commit
c83bbda
,这是您的初始提交,因此它没有父级,
HEAD^
HEAD~1
,等等。,根本不存在。请研究解释所有这些
~
^
有趣字符的。几乎可能重复的可能重复:
git reset HEAD
不会删除提交。
reset
的默认值是
reset--mixed
,它重置索引但不更改工作树,并且在任何情况下,
命名为“您现在所在的位置”,因此也不会移动分支标签。因此,它实现的是撤销任何
git add
s和/或
git rm--cached
的效果。(说它删除了提交也是夸大其词,它只是通过更改分支名称的SHA-1值使提交看起来消失了。它们最终通过
git gc
消失)
fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree.
fatal: ambiguous argument 'HEAD~2': unknown revision or path not in the working tree.