220

我一直想知道是否有一种简单的方法可以使用不同名称的远程分支推送和拉取本地分支,而无需始终指定两个名称。

例如:

$ 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有类似的配置选项?有没有一个很好的捷径,还是我应该继续走很长的路?

4

8 回答 8

211

当您进行初始推送时,添加-u 参数

git push -u origin my_branch:remote_branch

随后的推送将转到您想要的位置。

编辑:

根据评论,这只会设置拉动。

git branch --set-upstream

应该这样做。

于 2011-04-21T05:44:25.903 回答
106

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

git config push.default upstream

请注意,这在 Git 1.7.4.2 之前tracking不会被调用upstream,因此如果您使用的是旧版本的 Git,请tracking改用。该push.default选项是在 Git 1.6.4 中添加的,因此如果您使用的是旧版本,则根本没有此选项,并且需要明确指定要推送到的分支。

于 2011-04-21T03:00:52.143 回答
25

亚当的命令现在已被弃用。您可以使用:

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

将上游分支设置my_local_branchorigin/my_remote_branch

于 2014-11-28T11:22:18.500 回答
3

很长一段时间以来,我一直在遇到同样的问题。我终于有了一组语句,所以我不必git push origin local:remote每次都这样做。我遵循了这些:

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

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

于 2020-02-25T23:39:39.727 回答
2

如何轻松地将本地 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. 从你的本地分支推送到一个不同名字的远程分支

要从本地推送到branch2远程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

您可能有 localbranch3当前已签出,并认为这git push origin branch2会将您的 local 推branch3送到 remote branch2,因为您branch3当前已在系统上签出,但这不会发生!相反,即使您当前没有签出,也会再次git push origin branch2将您的本地推branch2送到您的远程!因此是这个的等效简写:branch2branch2 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 的简短形式会产生非常混乱的行为。以下是总结上述行为的 Nota bene 说明:

注意:在一般形式git push <remote> <from_branch>[:to_branch]中,如果你没有用 指定远程 TO 分支:to_branch,则假定它与你的本地 FROM 分支同名from_branch,在remote! 这意味着如果您只键入git push origin branch2而不是git push origin some_other_branch:branch2,它会从您的本地推送到branch2的远程副本branch2,即使您branch2在运行命令时没有在本地签出!如果您认为打字git push origin branch2只是告诉您当前签出的分支,这可能会非常令人困惑, some_other_branch, 推送到branch2远程,而不是本地branch2被推送到远程branch2

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

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

然后后来:

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

我认为该文档不直观且很难理解,但是,没有一些示例和我上面的解释。

[更好的形式git push]你也可以在 push 的同时设置上游分支

# 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

现在,要查看您的分支的上游分支当前设置为什么,请运行双详细( -vv) git branchcmd:

git branch -vv

示例输出:
这里可以看到上游分支是origin/master,这意味着master远程上的分支名为origin

* 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 -vorigin是上面示例中显示的遥控器。

2. 从一个不同名字的远程分支拉到你的本地分支

[如果您已经在branch2本地签出分支,建议使用!]在名为TO的远程上拉取 FROMbranch1originbranch2,您必须指定要从中拉取的远程分支,如下所示:

# 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]

以下命令仅在远程和本地分支具有相同名称时才有效!(因此它不回答这个 Stack Overflow 问题)。如果您尚未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 pushgit 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_branchPLUS 还some_branch使用这些更改更新本地存储的可见分支也。
    1. 如果您对此感到困惑,您需要了解,对于您认为拥有的每一个 1some_branch,您实际上最多有3 个分支:1) 一个本地分支,2)远程服务器上名为的远程分支,以及 3) 和本地- 存储的、隐藏的、远程跟踪的分支,名为. 在这里阅读更多信息。以及我第一次了解每个分支3 个分支的概念的地方:如何在本地和远程删除 Git 分支?. 另请参阅我的评论,在该答案下。some_branchsome_branchoriginorigin/some_branch

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

您可以使用上面显示的 cmd将本地分支命名branch2 为跟踪branch1 与推送同时命名的上游分支。git push -u

您还可以将本地分支命名branch2为跟踪上游分支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 branchcmd:

git branch -vv

参考:

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

git我写过的相关主题:

  1. 初学者:
    1. 从另一个分支在 Git 中创建一个分支
  2. 中间的:
    1. 如何挑选多个提交
  3. 先进的:
    1. 如何从另一个分支只获取一个文件?
    2. 根据 Git,谁是“我们”,谁是“他们”?
于 2021-12-10T09:06:09.480 回答
1

如何在 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
于 2021-08-29T19:08:39.757 回答
1

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

如果你想:

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

然后就这么简单:

git push origin HEAD:temp-branch-name

注意:您可以替换HEAD为任何其他分支或提交 ID 来推送它。

于 2021-12-06T21:06:13.320 回答
0

这是对我有用的过程。

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

现在,您的新远程仓库的 master(在 Github 上)将与原始 master 同步,但它不会有任何功能分支。

git rebase upstream/branch-name
git push origin master

Rebase 是一种智能合并。然后再次推送到 master,您将在新的 repo 中看到选定的功能分支作为 master。

选修的:

git remote rm upstream
git remote add upstream new-repo-url
于 2015-08-14T18:11:53.777 回答