`git reset --hard master` 和 `git reset --hard origin/master` 有什么区别?

What's the difference between `git reset --hard master` and `git reset --hard origin/master`?

我在 Whosebug/elsewhere 上尝试了很多链接以正确理解

的行为

git reset --hard option

我知道:

我不明白的是以下值:

  1. origin
  2. HEAD
  3. origin/master
  4. origin/branch

所有人似乎都有相同的行为,即它们指向 master 上的最新提交。

请解释上面提供的所有 4 个值选项的意义。

我还想知道我是否在一个特定的分支上,如何重置到那个分支上的最后一次提交? 例如,如果我在 v1.2origin/v1.2 仍然会将我带到 master 的最新提交。

masterHEADorigin/something 可能还有一些标签,为什么不呢,可能 都指向同一个提交,但是它们绝对不是一回事。

origin 通常是 remote repository.

的名称

您可以使用 git remote -v 查看您的遥控器并配置新的遥控器。

尝试一下(使用 -v),它可能会有意义。

remote/somebranch 指向远程存储库上某个分支的头部。

origin/master 指向 originmaster 的头部。

master一样吗?

是也不是。如果你拉你的主分支,做一些工作,同时其他人提交 master 并推送到 origin,他们会有所不同。

当您执行 git fetch origin 时,origin/master 将有额外的提交(将 提前 )。

HEAD 就是 "the current commit"。 将其视为 ..

this question

同样,这个 可能 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

我们刚刚拜访了123abcmaster的老掌门。它现在不是任何分支的负责人,但我们仍然可以查看它。

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 分别是多少?

首先你需要明白分支和标签名称只是指向散列值的指针,它代表一次提交,如果你说有 4 个选项具有相同的行为,那么第一个合乎逻辑的答案是因为他们都指向同一个提交

  • origin 我不确定这一点,但我认为 origin 自己会解决 origin/HEAD 我认为这将取决于你的 github设置,在github中你设置了一个'default branch',origin/head将解析为origin/[default_branch],在你的情况下我假设它是master,所以这就是为什么它有与 origin/master.

  • 效果相同
  • HEAD 始终指向当前提交,即您所在的提交,因此 git reset --hard HEAD 将永久删除跟踪文件和暂存文件更改中的所有更改,但是不更改提交哈希。

  • origin/master 是自上次 fetch/pull 以来远程主分支中的最后一次提交,每次提交到 master,本地 master已更新并且您的 origin/master 也已更新,如果其他人推送到 master 您的仓库将不知道有更新,除非您执行 git fetch 然后您的 origin/master 将领先于您的 master,甚至可能会偏离。
    如果您当前在 master 分支上并且 masterorigin/master[=38= 同步,则 运行ing git reset --hard origin/master 将具有相同的效果]

  • origin/branch 我不确定这代表什么,因为默认情况下没有 origin/branch,所以我猜你创建了一个名为 branch 的分支并且碰巧和你的主人在同一个提交中,确认你可以尝试做一个 git branch 来查看你所有的分支,我猜你会发现一个叫做 branch

要以可视化方式查看所有这些,您可以尝试 运行ning git log --graph --decorate --all 或者我更喜欢像 gitk 这样的可视化工具,如果您安装了二进制文件,您会 运行 gitk --all 查看所有相对于彼此的分支