如何使用不同的名称轻松地将本地Git分支推到远程?

我一直在想是否有一种简单的方法来推拉具有不同名称的本地分支和远程分支,而不总是指定两个名称。

例如:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

现在如果有人更新remote_branch_name,我可以:

$ git pull

所有内容都被合并/快进。然而,如果我在本地的“newb”中进行更改,我不能:

$ git push

相反,我必须:

% git push origin newb:remote_branch_name

听起来有点傻。如果git-pull使用git-config branch.newb.merge来确定从哪里提取,为什么git-push不能有类似的配置选项?有什么捷径吗,还是我应该继续走这条路?

137824 次浏览

当然。只要将你的push.default设置为upstream,就可以将分支推到它们的上游(与pull将从中拉取的分支相同,由branch.newb.merge定义),而不是将分支推到名称匹配的分支(这是push.defaultmatching的默认设置)。

git config push.default upstream

注意,在Git 1.7.4.2之前,它被称为tracking,而不是upstream,所以如果你使用的是旧版本的Git,请使用trackingpush.default选项是在Git 1.6.4中添加的,所以如果你使用的是比它更老的版本,你根本就没有这个选项,需要显式地指定要推送到的分支。

当你执行初始推操作时,添加-u参数:

git push -u origin my_branch:remote_branch

后续的推送会去你想去的地方。

编辑:

根据评论,这只是建立了拉力。

git branch --set-upstream

应该这么做。

亚当命令现在已弃用。你可以使用:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

my_local_branch的上游分支设置为origin/my_remote_branch

以下是对我行之有效的方法。

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

现在你的新回购将是“原点”,原始回购是“上游”。运行git remote -v确认。(附注:Upstream用于从原始的回购中获取数据——为了使你的本地副本与你想要贡献的项目保持同步——而origin用于拉和推,因为你可以贡献给自己的回购)。

git push origin master

现在你的新远程回购主服务器(在Github上)将与原始主服务器同步,但它不会有任何功能分支。

git rebase upstream/branch-name
git push origin master

Rebase是一个聪明的合并。然后再次推到master,你会在新的repo上看到所选的功能分支作为master。

可选:

git remote rm upstream
git remote add upstream new-repo-url

我遇到同样的问题已经有一段时间了。我终于有了一组语句,所以我不必每次都执行git push origin local:remote。我是这样做的:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

在将上游设置为具有不同名称的远程分支之后(第一行),然后将该上游设置为默认值(第二行),第三行现在将遵守这些规则并推送到设置的上游。

如何在Git上推到不同名称的分支

您通常会将本地分支推到同名的远程分支,但并非总是如此。

要推入不同名称的分支,你只需要指定branch you want to push和你想要推入的分支的名称,用冒号(:)分隔。

例如,如果你想将一个名为some-branch的分支推到my-feature:

(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
+ 728f0df...8bf04ea some-branch -> my-feature

如何将所有本地分支推到远程

你不需要经常从本地推送所有分支,但如果你这样做,你可以添加--all标志:

(main)$ git branch
* main
my-feature


(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
b7f661f..6e36148  main -> main
* [new branch]      my-feature -> my-feature

推送并创建一个临时远程分支

如果你想:

  • 以新名称将当前分支推到远程,但是:
  • 不更改当前分支的远程跟踪分支,并且:
  • 不要用新名字创建本地分支,

其实很简单:

git push origin HEAD:temp-branch-name

注意:你可以用任何其他分支或提交ID替换HEAD

如何使用不同的名称轻松地将本地Git分支推到远程?

简介:

下面是你通常需要的关键命令的简短总结:

# push from your local `branch2` to a remote `branch1` (push to a branch with
# a different name) on the remote named `origin`
git push -u origin branch2:branch1
# pull from a remote branch `branch1` into your currently-checked-out branch
# (which could have a different name--ex: `branch2`)
git pull origin branch1


# Set your upstream to something new in case you want to change it; ex: set your
# currently-checked-out branch (perhaps `branch2`) to track `branch1` on the
# remote named `origin`
git branch -u origin/branch1
# Unset your upstream
git branch --unset-upstream


# See what your upstream is currently set to
git branch -vv

细节:

以下各节将按顺序介绍:

  1. 推到另一个分支
  2. 从另一个分支拉
  3. 设置和取消对上游分支的跟踪

这里有太多不完整和不完整的答案,这让我有很多问题和很多需要改进的地方。所以,在经过一系列的努力、研究和实验之后,我试图提供一个完整的解决方案。

1. 从本地分支推到具有不同名称的远程分支

对于从本地__ABC0推到远程branch1,你必须像这样指定两个分支:

# Push from local `branch2` to remote `branch1`
git push origin branch2:branch1


# General form: push from local `from_branch` to remote `to_branch`.
# - Watch out!: see also the additional explanations and NB note below!
git push <remote> <from_branch>[:to_branch]

然而,请注意,上面我用一般形式写的方括号表明:to_branch部分是可选。我的意思是,从一个具有一个名称的本地分支推到一个具有不同名称的远程分支,这部分是不可选的,但是,作为一个通用的git命令,如果你不包括:to_branch部分,该命令将运行,这意味着它在这个意义上是可选的。但是,它可能会产生意想不到的结果!看一下这个命令,例如:

# (push to a remote branch with the **same name** as the local branch)


# Reduced **and confusing** form: this pushes from local `branch2` (even if you
# don't currently have it checked-out!) to remote `branch2`.
git checkout branch3
git push origin branch2          # Push from local branch2 to remote branch2

你可能有本地的branch3当前签出,并且认为git push origin branch2会将你的本地branch3推到远程的branch2,因为你在你的系统上有branch3当前签出,但这不会发生!相反,git push origin branch2将把本地的branch2推到远程的branch2,同样,git push origin branch20 git push origin branch2因此是等价的简写:

# These 2 commands are **exactly identical**! The 1st cmd is the short form
# of the 2nd.
git push origin branch2          # Push from local branch2 to remote branch2
git push origin branch2:branch2  # Push from local branch2 to remote branch2

如果您认为上面的cmd的简短形式会从当前签出的分支中推出,那么它会产生非常令人困惑的行为。下面是一个留心注释,总结了上面描述的行为:

:to_branch4输入git push origin branch2刚刚告诉你当前签出的分支:to_branch0,将其推到远程的branch2,相反,本地的branch2被推到远程的branch2

一般表单(git push <remote> <from_branch>[:to_branch])的文档很难找到,但实际上可以在靠近顶部的"<refspec>..."部分:

<refspec>参数的格式是可选的+ +,后跟源对象<src>,后跟冒号:,后跟目标ref <dst>

然后是:

:<dst>部分可以省略——这样的推送将更新一个ref,而<src>通常在命令行上更新而没有任何<refspec>

我认为这个文档不是直观的,很难理解,但是,如果没有一些例子和我上面的解释。

你也可以在推送的同时设置上游分支:

# Push from local `branch2` to the remote `branch1`, while also at the same time
# setting `branch2` to track `origin/branch1` as the upstream
git push -u origin branch2:branch1
# OR (same thing)
git push --set-upstream origin branch2:branch1
# General form
git push -u <remote> <from_branch>[:to_branch]

作为上面命令输出的一部分,你应该看到:

Branch 'branch2' set up to track remote branch 'branch1' from 'origin'.

为了让这里发生的事情更明显,要知道上面的两个命令中的任何一个都等价于这些两个单独的命令:

git push origin branch2:branch1
git branch -u origin/branch1

现在,对于查看分支的上游分支当前设置为什么,运行double-verbose (-vv) git branch cmd:

git branch -vv

样本输出:
在这里你可以看到上游分支是origin/master,这意味着远程上名为originmaster分支:

* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution

注:

  1. 上面的-vv表示“双重冗长”。这意味着它将不只是详细地打印git branch,而是双倍详细地打印,或额外详细地打印。“多余的”;现在打印的内容包括方括号中的上游分支,如上面所示:[origin/matser]
  2. 你可以用git remote -v查看你所有的遥控器。origin是上面例子中显示的遥控器。

2. 从具有不同名称的远程分支提取到本地分支

[如果你已经在本地签出了分支branch2,推荐使用!]]从名为__ABC2的遥控器上的__ABC1拉到branch2,你必须指定要从的远程分支,如下所示:

# THIS ASSUMES YOU ARE ALREADY CHECKED-OUT ON BRANCH `branch2`!


git pull origin branch1
# General form
git pull <remote> [from_branch]

你也可以同时指定两个分支,但是我不太确定在这种情况下有什么不同:

git pull origin branch1:branch2


# The general form seems to be:
git pull <remote> <from_branch>[:to_branch]

如果远程分支和本地分支具有相同的名称,则以下命令仅适用于 !(因此它不回答这个堆栈溢出问题)。如果你还没有签出分支some_branch,建议使用这个命令!

# Pull FROM a remote branch named `some_branch` TO a local branch named
# `some_branch`, while you do NOT have `some_branch` locally checked-out.
git fetch origin some_branch:some_branch
# General form
git fetch <remote> <from_branch>:<to_branch>


# The above is a special form of `git fetch`, and (I believe) requires that
# `from_branch` and `to_branch` are **the same branch name**. It is roughly
# equivalent to the following *several* commands:
git checkout any_other_branch
# this `git fetch` cmd updates the **locally-stored**, hidden, remote-tracking
# branch named `origin/some_branch` with the latest changes from the branch
# by this name stored on the remote server named `origin`
git fetch origin some_branch
git checkout some_branch
git merge origin/some_branch  # merge `origin/some_branch` into `some_branch`
git checkout any_other_branch # go back to the branch we started on

注:

  1. git push不同,git pull没有-u选项。
  2. 另见我的另一个答案:如何在GitHub上更改PR的所有者/如何征用一个开放的GitHub PR
  3. git fetch origin some_branch:some_branch命令使用相同的some_branch名称完成两次——在命令的两个位置。不同之处在于,git fetch origin some_branch只更新名为origin/some_branch的隐藏的远程跟踪分支本地,使用该分支存储在名为origin的远程服务器上的最新更改,而git fetch origin some_branch:some_branch则这样做,PLUS也使用这些更改更新本地存储的可见some_branch
    1. 如果你对此感到困惑,你需要了解为每1 some_branch认为,你实际上有最多3分支: 1)本地分支some_branch, 2)远程服务器上名为origin的远程分支some_branch,以及3)本地存储、隐藏、远程跟踪分支origin/some_branch。阅读这里了解更多信息。以及我第一次了解到每个分支3分支的概念:如何在本地和远程删除Git分支?。另见答案下面的some_branch0。

3.配置本地分支以跟踪或取消跟踪远程分支

通过使用上面所示的git push -u cmd,可以设置本地分支命名为branch2 跟踪上游分支命名为branch1 在推的同时

你也可以像这样设置名为__ABC0的本地分支来跟踪名为branch1的上游分支:

# Set branch2 to track origin/branch1 (`branch1` on remote `origin`)
git branch --set-upstream-to=origin/branch1 branch2
# OR (same thing as just above)
git branch -u origin/branch1 branch2
# General form
git branch -u <remote>/<to_branch> [from_branch]


# OR, same as above if the currently-checked-out branch is `branch2`
git branch --set-upstream-to=origin/branch1
# OR (same thing as just above)
git branch -u origin/branch1
# General form
git branch -u <remote>/<to_branch>

对于取消为branch2设置上游分支,因此它不再跟踪之前设置的上游分支(在上面的例子中是origin/branch1),运行以下命令:

git branch --unset-upstream branch2
# OR, same as above if the currently-checked-out branch is `branch2`
git branch --unset-upstream

同样,如上所示,对查看分支的上游分支当前设置为什么运行double-verbose (-vv) git branch cmd:

git branch -vv

引用:

  1. 我第一次学习git push -u origin local_FROM_branch:remote_TO_branch语法的地方:@Adam Dymitruk的回答
  2. https://devconnected.com/how-to-set-upstream-branch-on-git/
  3. 如何在本地和远程删除Git分支?< / >

相关的git主题我已经写过:

    <李>初学者:
    1. 在Git中从另一个分支创建一个分支
    <李>中间:
    1. 如何挑选多个提交
    <李>先进:
    1. 如何从另一个分支获得一个文件?< / >
    2. 谁是“;我们”;谁是“他们”;根据Git?< / >