`git reset --hard master`和`git reset --hard origin / master`之间的区别是什么?

时间:2015-04-25 07:25:27

标签: git github version-control git-reset

我在Stackoverflow /其他地方尝试了很多链接,以正确理解

的行为

git reset --hard option

我知道:

  • 如果省略它或origin,则会在origin
  • 上的最近一次提交时重置
  • 如果提供了SHA1哈希,则在相应的提交中完成重置。

我不理解的是以下值:

  1. origin
  2. HEAD
  3. origin/master
  4. origin/branch
  5. 所有似乎都有相同的行为,即它们指向master上的最新提交。

    请解释上面提供的所有4个值选项的重要性。

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

2 个答案:

答案 0 :(得分:13)

首先,您需要了解分支和标记名称只是指向哈希值的指针,它表示单个提交,如果您说有4个选项具有相同的行为,那么第一个逻辑答案是因为它们全部指向同一个提交

  • origin我不确定这一点,但我认为origin自我会解析为origin/HEAD我认为这将取决于你的github设置,在github你设置了一个'默认分支',origin/head将解析为origin/[default_branch],在你的情况下我假设它是主人,所以这就是它与origin/master具有相同效果的原因。

  • HEAD始终指向当前提交,即您所站的提交,因此git reset --hard HEAD将永久删除跟踪文件和暂存文件更改中的所有更改,但不会更改提交散列。

  • origin/master是自上次提取/提取以来远程主分支中的最后一次提交,每次提交master时,您的本地master都会更新,而您的{{ 1}}也会更新,如果其他人推送origin/master您的回购将不知道有更新,除非您执行master,那么您的git fetch将超越您的origin/master master,或者甚至可能分歧 如果您当前在git reset --hard origin/master分支上并且mastermaster同步

  • ,则运行origin/master会产生相同的效果
  • origin/branch我不确定这代表什么,因为默认情况下没有origin/branch,所以我猜你创建了一个名为branch的分支,恰好是在与您的主人相同的提交中,确认您可以尝试git branch查看所有分支,我猜您会找到一个名为branch

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

答案 1 :(得分:4)

masterHEADorigin/something以及某些标记,为什么不呢,可能都指向相同的提交,但它们绝对不是同样的事情。

origin通常是remote repository的名称。

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

尝试(使用-v)并且它可能会有意义。

remote/somebranch指向远程存储库上某个分支的负责人。

origin/master指向masterorigin的头部。

是否与master相同?

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

当您执行git fetch origin时,origin/master将有其他提交(将提前)。

HEAD只是"当前的提交"。 可以将其视为.

请参阅this question

同样,这个可能master相同,但是如果你查看另一个分支或提交或者在一个rebase中间,那么,它不是

所以在一个没有其他人工作的新存储库上试试这个:

$ 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会分别是什么?