3

git重置头~1

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

git重置头~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 的文档页面在澄清这一点方面并不是很有用。那么,~1 是什么意思,我为什么需要它?

4

4 回答 4

5

HEAD~1是“的第一个父级HEAD”,HEAD~2而是“的第一个父级的第一个父级HEAD,依此类推(所以HEAD~n对于某些 n 就像HEAD后面跟着 n 个^符号并且没有数字)。同样,所有细节都在git-rev -解析手册页。

git reset与“从”倒数的修订混合时要小心HEADgit 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(and master) 到它的第一个父级。命名该父级的另一种方法是save^,还有另一种方法是save~1。但是,在移动完成后,HEAD现在命名该父版本,因此HEAD^命名它的父版本:

$ git reset HEAD^

使您后退一步,因此master现在HEAD命名相同的提交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”= 非分支状态,分支名称使您处于“分支”状态)。

于 2013-08-07T12:13:06.597 回答
3

有关如何指定提交的更多详细信息,请参阅git help revisionsGit - 修订选择:

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

~<n>修订参数的后缀表示作为指定提交对象的<n>th 世代祖先的提交对象,仅在第一个父对象之后。ie<rev>~3等价于<rev>^^^which 等价于<rev>^1^1^1.

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

于 2013-08-07T12:39:50.207 回答
2

git reser --hard HEAD~1从当前分支中删除最后 1 个(或您输入的任何其他数字)提交,像这样
git reset HEAD ...删除最后一个提交
git reset HEAD~1...删除最后 2 个提交
,依此类推

于 2013-08-07T11:59:36.847 回答
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.
于 2013-08-07T14:34:33.720 回答