Git推了主人而不是我的分支。为什么?

时间:2015-06-23 22:48:54

标签: git git-branch git-push

我正在搞清楚在git中使用分支。当时我在master中有不相关的提交,我还没有准备好推送,但我不得不修复bug。我不想创建一个新的repo只是为了做一个小bug修复,所以我创建了一个基于origin / master的分支

git checkout -b example origin/master

我理解这会创建一个基于origin / master分支的分支,并切换到示例分支。

然后我去做了我的修复,承诺并测试了它。

$ git status
On branch example
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

然后我去推动它掌握。

$ git push origin master

但是我没有在示例分支中推送提交,而是找到了

    $ git status
    On branch example
    Your branch and 'origin/master' have diverged,
    and have 1 and 3 different commits each, respectively.
        (use "git pull" to merge the remote branch into yours)

    nothing to commit, working directory clean

我不明白为什么

2 个答案:

答案 0 :(得分:4)

git push的语法有点模糊,但很容易解释您正在使用的特定情况:

$ git push remote refspec

您命名的 remote 是典型的origin;这让你的git找到他们的git的URL。那部分到目前为止都很好。

您提供的 refspec master会出现问题。

你可能想知道:什么是" refspec"无论如何?答案是它有两个或有时三个部分,两个分支 1 名称用冒号分隔:

ours:theirs
例如

2

"但等等,"你可能会说,:中没有master,只有一个分支名称!"这是真的,但是git push需要两个,所以它构成了另一个:当你给出一个名字时,它会复制你给它的名字,所以master只意味着master:master

这会告诉git push推送您当前的master,另一方面,让他们的git更新他们的master

如果你想推送你当前的提交(HEAD)并让他们的git将其作为master,你必须 3 写出来:

git push origin HEAD:master

当您git push某事时,他们的方并不关心(或甚至不知道)关于 上任何分支的任何内容,这可能会有所帮助> side:你的git将你的分支转换为原始SHA-1值,并将那些 - 原始SHA-1s - 发送到远程。例如,如果你的HEAD映射到commit-ID 1234567,git push origin HEAD:master让你的git称他们为他们并发送提交1234567,然后给他们发送一条消息:"现在我已经如果您提交1234567,请将您的master指向该提交ID。"然后他们的结局说" OK" (推得成功)或"不,我拒绝" (推送失败,例如,不是快进,或者像gitolite这样的脚本拒绝许可)。因此,您使用的任何分支名称都指向您的侧 - localname:remotename 的左侧 - 完全由您自己处理,只有右侧-side name被传递给远程git。这就是您可以使用HEAD:master

的原因

1 实际上,任何有效的参考资料都可以在这里找到。标签是以refs/tags/开头的引用,而git现在有" notes"等;所有这些都使用参考。但分支是大多数人在大多数时间工作的分支。

2 可选的第三部分是一个前导加号,用于强制更新,la git push -f。另请注意,git fetch也使用了refspecs,但在这种情况下名称相反:theirs:ours,您通常会将master提取到remotes/origin/master中(例如)强制更新,因此带有前导+)。

3 和git一样,您可以设置配置旋钮来更改默认设置。在这种情况下,有多个设置,但要考虑的主要设置是push.default。有关详细信息,请参阅the git config documentation

答案 1 :(得分:0)

您明确要求git推送到origin/master。为了推送到名为example的新远程分支,您应该编写

git push -u origin example

-u会使您的本地示例分支跟踪新的远程示例分支。