我通常通过git checkout -b ...
创建一个新分支,当我第一次推送到它时,系统会提示我使用--set-upstream参数创建一个新的远程跟踪分支。创建分支时,可以在一个命令中执行此操作吗?我尝试了以下操作(每instructions here):
% git checkout -b mybranch20200423 --track origin/mybranch20200423
fatal: 'origin/mybranch20200423' is not a commit and a branch 'mybranch20200423' cannot be created from it
% git checkout -b mybranch20200423 origin/mybranch20200423
fatal: 'origin/mybranch20200423' is not a commit and a branch 'mybranch20200423' cannot be created from it
我做错什么了吗?为什么git认为'origin / mybranch20200423'应该是一个提交?
答案 0 :(得分:2)
我没有git branch
命令的所有详细信息,但看起来--track
和--set-upstream
选项仅期望现有分支名称:< / p>
$ git branch --set-upstream origin/foo/bar
error: the requested upstream branch 'origin/foo/bar' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
使用git push -u <branchname>
进行推送时,可以提供一个远程分支名称。
要处理“推送新分支”的情况,我使用以下命令:
git push origin -u $(git rev-parse --abbrev-ref HEAD)
git rev-parse --abbrev-ref HEAD
将给出当前活动分支的名称,$(...)
将其作为外部命令的参数注入,git push -u <branchname>
将当前提交推送到远程分支<branchname>
并添加origin/branchname
作为跟踪的上游分支。我为其添加了别名:
git config --global config.pushnew '! git push origin -u $(git rev-parse --abbrev-ref HEAD)'
这样键入:
git pushnew
在新分支的终端中,无需重复分支名称即可推送我的新分支。
答案 1 :(得分:1)
请参见LeGEC's answer。
或者,考虑首先在远程上创建分支:
git fetch origin # update origin/master if/as needed
git push origin origin/master:newbranch
第一步,只有在您的远程跟踪分支可能已过期(但可以随时使用)时才需要,让Git调用其Git,从中获取任何新的提交,并将其保存在您的克隆,并更新所有origin/*
名称。 (我也喜欢在这里使用--prune
,但是我使用git config fetch.prune true
这样做是为了让Git自动执行。)
git push
步骤让您的Git在origin
上调用Git,并要求他们根据您的newbranch
创建或更新其分支名称origin/master
,如果您最近进行了足够的更新,则可以立即与其master
同步。也就是说,您要他们根据其newbranch
(您的副本)创建他们的分支master
,因为newbranch
在他们的newbranch
中还不存在存储库。
假设他们遵守这个礼貌的“创建或更新”请求,origin
现在存在于newbranch
上。现在{{1}上存在origin
,您自己的Git创建了origin/newbranch
。
现在您可以简单地运行:
git checkout newbranch
这将发现,天哪,您没有名为newbranch
的分支,但是您确实有origin/newbranch
,因此它应该 create newbranch
来自origin/newbranch
。如果您的Git早于Git 2.23,则可能要使用git checkout --track origin/newbranch
来避免歧义,如果它是2.23或更高版本,则可能要使用git switch newbranch
,但总的来说,这大都可行。
我没有执行以上任何操作:我只是在本地适当地创建了分支。然后,在第一个git push
上,我使用速记git push -u origin HEAD
(在与git status
仔细检查后,我在正确的分支上,一切都准备就绪)。