master
、HEAD
、origin/something
,也许还有一些标签,为什么不呢,可能都指向同一个提交,但它们绝对不是同一件事。
origin
通常是远程仓库的名称。
您可以使用git remote -v
查看您的远程仓库并配置新的仓库。
尝试使用-v
选项运行它,这样做可能会让您更容易理解。
remote/somebranch
指向远程仓库上某个分支的head。
origin/master
指向origin
上master
的head。
它是否与master
相同?
是和否。如果您拉取了您的master分支,在此期间其他人在master
上提交并推送到origin
,则它们将不同。
当您执行git fetch origin
时,origin/master
将具有其他提交(将领先)。
HEAD
就是"当前提交"。将其视为.
。
请参阅此问题
同样,这可能与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
我们刚刚检查了旧的
master
头部
123abc
。现在它不是任何分支的头部,但我们仍然可以检出它。
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?
origin
可以通过gitrevisions(7)
中的<refname>
条目来解释;它完全展开为refs/remotes/origin/HEAD
。origin/master
展开为refs/remotes/origin/master
,同样地,origin/branch
将展开为refs/remotes/origin/branch
(假设,正如你所说,它存在)。 - chepner