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是什么意思,我为什么需要呢?
答案 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 revisions
或Git - 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.