Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';“git reset--hard master”和“git reset--hard origin/master”之间的区别是什么?_Git_Github_Version Control_Git Reset - Fatal编程技术网

什么';“git reset--hard master”和“git reset--hard origin/master”之间的区别是什么?

什么';“git reset--hard master”和“git reset--hard origin/master”之间的区别是什么?,git,github,version-control,git-reset,Git,Github,Version Control,Git Reset,我在Stackoverflow/其他地方尝试了很多链接,以正确理解 git重置--硬选项 我知道: 如果省略或是原点,则在原点 如果提供了SHA1散列,则在相应的提交上执行重置 我不理解的是以下价值观: origin HEAD origin/master origin/branch 它们似乎都有相同的行为,即它们指向master上的最新提交 请解释上述所有4个价值选项的意义 我还想知道,如果我在某个特定的分支上,如何重置到该分支上的最后一次提交? 例如,如果我在v1.2,origin/v1.

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

git重置--硬选项

我知道:

  • 如果省略或是
    原点
    ,则在
    原点
  • 如果提供了SHA1散列,则在相应的提交上执行重置
我不理解的是以下价值观:

  • origin
  • HEAD
  • origin/master
  • origin/branch
  • 它们似乎都有相同的行为,即它们指向
    master
    上的最新提交

    请解释上述所有4个价值选项的意义

    我还想知道,如果我在某个特定的分支上,如何重置到该分支上的最后一次提交?
    例如,如果我在
    v1.2
    origin/v1.2
    仍然会带我到
    master
    master
    HEAD
    origin/something
    ,可能还有一些标签,为什么不呢,可能都指向同一个提交,但它们肯定不是同一个东西

    origin
    通常是源代码的名称

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

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

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

    origin/master
    指向
    origin
    上的
    master
    的头部

    它与母版相同吗

    是和否。如果您拉主分支,做一些工作,同时其他人提交
    master
    并推送到
    origin
    ,它们将不同

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

    HEAD
    只是“当前提交”。 把它想象成

    再次,这可能与Muth<代码>相同,但是如果你检查另一个分支或者提交或者处于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 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.
    
    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
    
    啊,看,现在他们不一样了

    $ git push origin master
    $ git log -1 --format="%H" HEAD
    321bca
    $ git log -1 --format="%H" origin/master
    321bca
    
    现在他们不是!我们已经推动了我们的最新承诺,他们都指向同一点

    $ 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 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.
    
    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
    
    当然不是。我们没有将
    新分支机构
    推送到
    原点
    ,它只在我们的本地机器上

    git checkout 123abc
    
    我们刚刚签出了
    123abc
    ,这位
    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 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.
    
    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中您设置了一个“默认分支”,
      origin/HEAD
      将解析为
      origin/[default\u branch]
      ,在您的情况下,我假设它是master,这就是为什么它与
      origin/master
      具有相同的效果

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

    • origin/master
      是自上次获取/拉取以来远程主分支中的最后一次提交,每次提交到
      master
      ,您的本地
      master
      都会更新,您的
      origin/master
      也会更新,如果其他人推到
      master
      您的repo将不知道有更新,除非您执行
      git获取
      ,否则您的
      源代码/主代码
      将先于
      主代码
      ,甚至可能会偏离。
      如果您当前在
      master
      分支上并且
      master
      origin/master
      同步,则运行
      git reset--hard origin/master
      将具有相同的效果

    • origin/branch
      我不确定这代表什么,因为默认情况下没有
      origin/branch
      ,所以我猜您创建了一个名为
      branch
      的分支,并且恰好与主分支处于同一提交状态,以确认您可以尝试执行
      git branch
      来查看所有分支,我猜你会找到一个叫做
      branch


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

    原点
    可以通过
    gitrevisions(7)
    中的
    条目来解释;它完全扩展到
    refs/remotes/origin/HEAD
    origin/master
    扩展到
    refs/remotes/origin/master
    ,类似地
    origin/branch
    将扩展到
    refs/remotes/origin/branch
    (假设它存在)。