为什么`git merge origin`在某些时候有效?

时间:2015-12-02 01:20:08

标签: git

而不是git merge origin/branch我喜欢做git merge origin。省略分支名称可以使自动化和创建别名更简单。

但是git merge origin仅适用于某些存储库:

$ git branch --set-upstream-to=origin/master
$ git pull origin
Already up-to-date.
$ git merge origin
Already up-to-date.

对于其他回购,有一个错误:

$ git branch --set-upstream-to=origin/master
$ git pull origin
Already up-to-date.
$ git merge origin
merge: origin - not something we can merge

请注意,git pull origin语句适用于两个存储库。

两个存储库或在同一系统上(因此运行相同版本的git)。我检查了.git/config,它看起来与两个回购相似。

适用于

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.jasny/obfuscated-repo-1.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

它不适用于

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:legalthings/iam.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

为什么这种情况在某些情况下有效而在其他情况下无效?

对于无效的回购,git rev-parse origin会出错:

git rev-parse origin
origin
fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]

对于其他存储库,我收到提交哈希。

1 个答案:

答案 0 :(得分:2)

当您运行git merge origin时,您隐含地说git merge origin/HEAD,其中origin/HEAD是您的遥控器上的默认分支。运行HEAD时会设置git clone $repo引用。

如果您的遥控器没有HEAD引用,您在本地创建了存储库并将其推送到远程,在这种情况下,Git将不知道默认分支是什么(并且git fetch origin不会设置它)。您可以通过以下方式手动设置遥控器的HEAD参考: [1]

git remote set-head origin $branch

其中$branch是您要设置为该遥控器默认分支的分支的名称。