我正在搞清楚在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
我不明白为什么
答案 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
会使您的本地示例分支跟踪新的远程示例分支。