如何一次创建分支和新的远程跟踪分支?

时间:2020-04-23 15:40:23

标签: git

我通常通过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'应该是一个提交?

2 个答案:

答案 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仔细检查后,我在正确的分支上,一切都准备就绪)。