>我在 Stackoverflow/其他地方尝试了很多链接来正确理解
git reset --hard option
我知道那件事:
- 如果省略或
origin
,则重置将在最近一次提交时完成origin
- 如果提供了 SHA1 哈希,则会在相应的提交上完成重置。
我不明白的是以下值:
origin
HEAD
origin/master
origin/branch
所有似乎都有相同的行为,即它们指向master
的最新提交。
请解释上面提供的所有 4 个值选项的意义是什么。
我还想知道如果我在特定分支上,如何重置为该分支上的最后一次提交? 例如,如果我在v1.2
上,origin/v1.2
仍然会带我到master
的最新提交。
首先,您需要了解分支和标签名称只是指向哈希值的指针,它们表示单个提交,如果您说有 4 个具有相同行为的选项,那么第一个合乎逻辑的答案是因为它们都指向相同的提交
-
origin
我不确定这一点,但我认为origin
自己会解析origin/HEAD
我认为这将取决于您的 github 设置,在 github 中您设置了一个"默认分支",origin/head
将解析为origin/[default_branch]
,在您的情况下,我假设它是主,所以这就是为什么它具有与origin/master
相同的效果。 -
HEAD
始终指向当前提交,即您所处的提交,因此git reset --hard HEAD
将永久删除跟踪文件和暂存文件更改中的所有更改,但不会更改提交哈希。 -
origin/master
是自上次获取/拉取以来远程主分支中的最后一次提交,每次您提交master
时,您的本地master
都会更新,您的origin/master
也会更新,如果其他人推送到master
您的存储库将不知道有更新,除非您执行git fetch
,否则您的origin/master
将领先于您的master
, 甚至可能发散。
如果您当前位于master
分支上,并且master
与origin/master
同步,则运行git reset --hard origin/master
将具有相同的效果 -
origin/branch
我不确定这代表什么,因为默认情况下没有origin/branch
,所以我猜你创建了一个名为branch
的分支,并且恰好与你的主提交在同一提交中,以确认您可以尝试执行git branch
以查看所有分支,我猜您会找到一个名为branch
要以可视化方式查看所有这些内容,您可以尝试运行git log --graph --decorate --all
或者我更喜欢像gitk
这样的可视化工具,如果您安装了二进制文件,您将运行gitk --all
以查看所有分支彼此相对
master
、HEAD
、origin/something
,也许还有一些标签,为什么不呢,可能都指向同一个提交,但它们绝对不是一回事。
origin
通常是远程存储库的名称。
您可以查看您的遥控器并使用git remote -v
配置新遥控器。
尝试一下(用-v
),它可能会有意义。
remote/somebranch
指向远程存储库中某个分支的负责人。
origin/master
指着origin
上的master
头。
和master
一样吗?
是和不是。如果你拉你的主分支,做一些工作,同时其他人提交master
并推送到origin
,他们会有所不同。
当你做一个git fetch origin
,那么,origin/master
会有额外的提交(将提前)。
HEAD
只是"当前提交"。 把它想象成.
.
看到这个问题
同样,这可能与master
相同,但如果您签出另一个分支或提交或处于变基过程中,那么事实并非如此。
因此,请在没有其他人正在使用的新存储库上尝试此操作:
$ git checkout master
$ git log -1 --format="%H" HEAD
123abc
$ git log -1 --format="%H" origin/master
123abc
他们是一样的!
$ git diff origin/master
当然,它们的内容是相同的。
$ echo "foo" > foo
$ git add foo
$ git commit -m "Foo the thingy"
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" origin/master
123abc
啊,看,现在它们是不同的提交!
$ git push origin master
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" origin/master
321bca
现在他们不是了! 我们已经推送了我们最新的提交,它们都指向相同的内容。
$ git checkout -b newbranch
$ echo "baz" > baz
$ git add baz
$ git commit -m "Baz the thingy with the stuff"
$ git branch -a
master
* new_branch
origin/master
$ git log -1 --format="%H"
789def
$ git log -1 --format="%H" master
321bca
git log -1 --format="%H" origin/master
321bca
git log -1 --format="%H" origin/new_branch
unknown revision or path not in the working tree.
当然不是。我们没有new_branch
推到origin
,它只是在我们的本地机器上
git checkout 123abc
我们刚刚退房123abc
,master
的老头。现在,它不是任何分支机构的负责人,但我们可以同样检查一下。
Note: checking out 123abc. You are in 'detached HEAD' state, etc
$ git checkout -b old_master
$ git branch -a
master
* new_branch
origin/master
old_master
现在猜猜他们的 SHA1 将分别是什么?