`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
我知道:
- 如果它被省略或如果它是
origin
,重置将在 origin
的最近一次提交上完成
- 如果提供了 SHA1 哈希,则会在相应的提交上完成重置。
我不明白的是以下值:
origin
HEAD
origin/master
origin/branch
所有人似乎都有相同的行为,即它们指向 master
上的最新提交。
请解释上面提供的所有 4 个值选项的意义。
我还想知道我是否在一个特定的分支上,如何重置到那个分支上的最后一次提交?
例如,如果我在 v1.2
,origin/v1.2
仍然会将我带到 master
的最新提交。
master
、HEAD
、origin/something
可能还有一些标签,为什么不呢,可能 都指向同一个提交,但是它们绝对不是一回事。
origin
通常是 remote repository.
的名称
您可以使用 git remote -v
查看您的遥控器并配置新的遥控器。
尝试一下(使用 -v
),它可能会有意义。
remote/somebranch
指向远程存储库上某个分支的头部。
origin/master
指向 origin
上 master
的头部。
和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
我们刚刚拜访了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 分别是多少?
首先你需要明白分支和标签名称只是指向散列值的指针,它代表一次提交,如果你说有 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
分支上并且 master
与 origin/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
查看所有相对于彼此的分支
我在 Whosebug/elsewhere 上尝试了很多链接以正确理解
的行为git reset --hard option
我知道:
- 如果它被省略或如果它是
origin
,重置将在origin
的最近一次提交上完成
- 如果提供了 SHA1 哈希,则会在相应的提交上完成重置。
我不明白的是以下值:
origin
HEAD
origin/master
origin/branch
所有人似乎都有相同的行为,即它们指向 master
上的最新提交。
请解释上面提供的所有 4 个值选项的意义。
我还想知道我是否在一个特定的分支上,如何重置到那个分支上的最后一次提交?
例如,如果我在 v1.2
,origin/v1.2
仍然会将我带到 master
的最新提交。
master
、HEAD
、origin/something
可能还有一些标签,为什么不呢,可能 都指向同一个提交,但是它们绝对不是一回事。
origin
通常是 remote repository.
您可以使用 git remote -v
查看您的遥控器并配置新的遥控器。
尝试一下(使用 -v
),它可能会有意义。
remote/somebranch
指向远程存储库上某个分支的头部。
origin/master
指向 origin
上 master
的头部。
和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
我们刚刚拜访了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 分别是多少?
首先你需要明白分支和标签名称只是指向散列值的指针,它代表一次提交,如果你说有 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
分支上并且master
与origin/master
[=38= 同步,则 运行inggit reset --hard origin/master
将具有相同的效果]origin/branch
我不确定这代表什么,因为默认情况下没有origin/branch
,所以我猜你创建了一个名为branch
的分支并且碰巧和你的主人在同一个提交中,确认你可以尝试做一个git branch
来查看你所有的分支,我猜你会发现一个叫做branch
要以可视化方式查看所有这些,您可以尝试 运行ning git log --graph --decorate --all
或者我更喜欢像 gitk
这样的可视化工具,如果您安装了二进制文件,您会 运行 gitk --all
查看所有相对于彼此的分支