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

jma*_*agh 167 git version-control git-push git-remote

我一直想知道是否有一种简单的方法来推送和拉出具有不同名称的远程分支的本地分支,而不必始终指定这两个名称.

例如:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name
Run Code Online (Sandbox Code Playgroud)

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

$ git pull
Run Code Online (Sandbox Code Playgroud)

一切都是合并/快进的.但是,如果我在当地的"newb"中进行更改,我不能:

$ git push
Run Code Online (Sandbox Code Playgroud)

相反,我必须:

% git push origin newb:remote_branch_name
Run Code Online (Sandbox Code Playgroud)

看起来有点傻.如果git-pull用于git-config branch.newb.merge确定从何处拉出,为什么不能git-push有类似的配置选项?有没有一个很好的捷径,或者我应该继续漫长的路?

Ada*_*ruk 160

执行初始推送时添加-u参数:

git push -u origin my_branch:remote_branch
Run Code Online (Sandbox Code Playgroud)

随后的推送将在您想要的位置.

编辑:

根据评论,这只会拉动.

git branch --set-upstream
Run Code Online (Sandbox Code Playgroud)

应该这样做.

  • `-u`只是设置上游,根据问题,已设置.他需要将`push.default`设置为`upstrem`以使'push`尊重上游设置,因为默认情况下只有`pull`. (7认同)
  • 这似乎不起作用 - 至少不是从未版本的git (2认同)

Bri*_*ell 91

当然.只需设置你push.defaultupstream推分行他们的上行流(这是相同的pull,带坏,由定义branch.newb.merge),而不是推动分支机构在那些名称匹配(这是默认设置push.default,matching).

git config push.default upstream
Run Code Online (Sandbox Code Playgroud)

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

  • @FrederickNord`HEAD`是你正在寻找的速记.`HEAD`是指向当前签出的分支,或者如果你有一个分离的头,则直接指向特定的提交. (2认同)

Gab*_*les 26

\n

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

\n
\n

概括:

\n

以下是您通常需要的关键命令的简短摘要:

\n
# push from your local `branch2` to a remote `branch1` (push to a branch with\n# a different name) on the remote named `origin`\ngit push -u origin branch2:branch1\n# pull from a remote branch `branch1` into your currently-checked-out branch\n# (which could have a different name--ex: `branch2`)\ngit pull origin branch1\n\n# Set your upstream to something new in case you want to change it; ex: set your\n# currently-checked-out branch (perhaps `branch2`) to track `branch1` on the \n# remote named `origin`\ngit branch -u origin/branch1\n# Unset your upstream\ngit branch --unset-upstream\n\n# See what your upstream is currently set to\ngit branch -vv\n
Run Code Online (Sandbox Code Playgroud)\n
\n

细节:

\n

下面按顺序介绍以下部分:

\n
    \n
  1. 推送到另一个分支
  2. \n
  3. 从另一个分支拉取
  4. \n
  5. 设置和取消设置要跟踪的上游分支
  6. \n
\n

这里有太多不完整和片面的答案,这给我留下了很多问题和很多不足之处。因此,经过大量的努力、研究和实验,我尝试提供一个完整的解决方案。

\n

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

\n

要将本地推branch2送到远程branch1,您必须指定两个分支,如下所示:

\n
# Push from local `branch2` to remote `branch1`\ngit push origin branch2:branch1\n\n# General form: push from local `from_branch` to remote `to_branch`. \n# - Watch out!: see also the additional explanations and NB note below!\ngit push <remote> <from_branch>[:to_branch]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
# (push to a remote branch with the **same name** as the local branch)\n\n# Reduced **and confusing** form: this pushes from local `branch2` (even if you\n# don\'t currently have it checked-out!) to remote `branch2`.\ngit checkout branch3 \ngit push origin branch2          # Push from local branch2 to remote branch2\n
Run Code Online (Sandbox Code Playgroud)\n

您可能branch3当前已签出本地,并认为这git push origin branch2会将您的本地推branch3送到远程branch2,因为您branch3当前已在系统上签出,但这不会发生!相反,即使您当前没有签出,也会再次git push origin branch2将您的本地推branch2送到远程!因此是以下的等价简写:branch2branch2 git push origin branch2

\n
# These 2 commands are **exactly identical**! The 1st cmd is the short form\n# of the 2nd. \ngit push origin branch2          # Push from local branch2 to remote branch2\ngit push origin branch2:branch2  # Push from local branch2 to remote branch2\n
Run Code Online (Sandbox Code Playgroud)\n

如果您认为上面的 cmd 的缩写形式会从当前签出的分支推送,则会产生非常令人困惑的行为。以下是总结上述行为的注意事项:

\n

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

\n

一般形式 ( ) 的文档git push <remote> <from_branch>[:to_branch]很难找到,但实际上可以在“”部分man git push下靠近顶部的页面中找到"<refspec>...

\n
\n

参数的格式<refspec>是一个可选的加号+,后跟源对象<src>,然后是冒号:,最后是目标引用<dst>

\n
\n

然后后来:

\n
\n

:<dst>部分可以省略\xe2\x80\x94这样的推送将更新通常在命令行上<src>没有任何更新的引用。<refspec>

\n
\n

我认为这个文档是不直观的,并且非常难以理解,但是,没有一些示例和我上面的解释。

\n

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

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

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

\n
\n
Branch \'branch2\' set up to track remote branch \'branch1\' from \'origin\'.\n
Run Code Online (Sandbox Code Playgroud)\n
\n

为了清楚地表明那里发生了什么,请知道上面的两个命令中的任何一个都相当于这两个单独的命令:

\n
Branch \'branch2\' set up to track remote branch \'branch1\' from \'origin\'.\n
Run Code Online (Sandbox Code Playgroud)\n

现在,要查看分支的上游分支当前设置的内容,请运行double-verbose ( -vv) git branchcmd:

\n
git push origin branch2:branch1\ngit branch -u origin/branch1\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n
* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution\n
Run Code Online (Sandbox Code Playgroud)\n
\n

笔记:

\n
    \n
  1. -vv上面的意思是“双重详细”。这意味着它git branch不仅会详细地打印,而且会双重详细地打印,或者非常详细地打印。现在打印的“额外详细”内容包括方括号中的上游分支,如上所示:[origin/matser]
  2. \n
  3. 您可以使用 查看所有遥控器git remote -vorigin是上面示例中显示的遥控器。
  4. \n
\n

2. 从与本地分支同名的远程分支拉取

\n

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

\n
git branch -vv\n
Run Code Online (Sandbox Code Playgroud)\n

您也可以指定两个分支,但我不完全确定在这种情况下有什么区别

\n
* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution\n
Run Code Online (Sandbox Code Playgroud)\n

以下命令仅在远程和本地分支具有相同名称的情况下才有效!(因此它不回答这个堆栈溢出问题)。如果您尚未签some_branch出分支,建议使用此命令!

\n
# THIS ASSUMES YOU ARE ALREADY CHECKED-OUT ON BRANCH `branch2`!\n\ngit pull origin branch1\n# General form\ngit pull <remote> [from_branch]\n
Run Code Online (Sandbox Code Playgroud)\n

笔记:

\n
    \n
  1. 与 不同git pushgit pull没有选项-u
  2. \n
  3. 另请参阅我的另一个答案:如何更改 GitHub 上 PR 的所有者/如何征用开放的 GitHub PR
  4. \n
  5. git fetch origin some_branch:some_branch命令是some_branch在命令的两个位置使用两次相同的名称来完成的。区别在于,git fetch origin some_branch仅更新本地存储的、隐藏的远程跟踪分支,origin/some_branch该分支以存储在远程服务器上的该名称的最新更改命名origin,而PLUS 是否也使用这些更改git fetch origin some_branch:some_branch更新本地存储的可见分支some_branch也是。\n
      \n
    1. 如果您对此感到困惑,您需要了解,对于您认为拥有的每 1 个分支some_branch,您实际上最多有3 个分支:1) 本地分支,2)名为 的远程服务器上的远程分支,3) 和本地分支-存储的、隐藏的、远程跟踪的分支名为. 在这里阅读更多信息。我第一次了解到每个分支3 个分支的概念的地方:How do I delete a Gitbranch local and Remote? 。另请参阅我在该答案下的评论some_branchsome_branchoriginorigin/some_branch
    2. \n
    \n
  6. \n
\n

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

\n

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

\n

您还可以将本地分支设置branch2为跟踪名为的上游分支,branch1如下所示:

\n
git pull origin branch1:branch2\n\n# The general form seems to be:\ngit pull <remote> <from_branch>[:to_branch]\n
Run Code Online (Sandbox Code Playgroud)\n

取消设置您的上游分支branch2,使其不再跟踪先前设置的上游分支(在origin/branch1上面的示例中),请运行以下命令:

\n
# Pull FROM a remote branch named `some_branch` TO a local branch named\n# `some_branch`, while you do NOT have `some_branch` locally checked-out.\ngit fetch origin some_branch:some_branch\n# General form\ngit fetch <remote> <from_branch>:<to_branch>\n\n# The above is a special form of `git fetch`, and (I believe) requires that \n# `from_branch` and `to_branch` are **the same branch name**. It is roughly \n# equivalent to the following *several* commands:\ngit checkout any_other_branch\n# this `git fetch` cmd updates the **locally-stored**, hidden, remote-tracking\n# branch named `origin/some_branch` with the latest changes from the branch\n# by this name stored on the remote server named `origin`\ngit fetch origin some_branch \ngit checkout some_branch\ngit merge origin/some_branch  # merge `origin/some_branch` into `some_branch`\ngit checkout any_other_branch # go back to the branch we started on\n
Run Code Online (Sandbox Code Playgroud)\n

再次,如上面所示,要查看分支的上游分支当前设置的内容,请运行双详细( -vv) git branchcmd:

\n
# Set branch2 to track origin/branch1 (`branch1` on remote `origin`)\ngit branch --set-upstream-to=origin/branch1 branch2\n# OR (same thing as just above)\ngit branch -u origin/branch1 branch2\n# General form\ngit branch -u <remote>/<to_branch> [from_branch]\n\n# OR, same as above if the currently-checked-out branch is `branch2`\ngit branch --set-upstream-to=origin/branch1\n# OR (same thing as just above)\ngit branch -u origin/branch1\n# General form\ngit branch -u <remote>/<to_branch>\n
Run Code Online (Sandbox Code Playgroud)\n

参考:

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

git我写过的相关主题:

\n
    \n
  1. 初学者:\n
      \n
    1. 从另一个分支在 Git 中创建一个分支
    2. \n
    \n
  2. \n
  3. 中级:\n
      \n
    1. 如何挑选多个提交
    2. \n
    \n
  4. \n
  5. 高级:\n
      \n
    1. 如何从另一个分支获取一个文件?
    2. \n
    3. 根据 Git 的说法,谁是“我们”,谁是“他们”?
    4. \n
    \n
  6. \n
\n


job*_*bin 14

Adam的命令现已弃用.您可以使用:

git branch --set-upstream-to origin/my_remote_branch my_local_branch
Run Code Online (Sandbox Code Playgroud)

设置的上游分支my_local_branchorigin/my_remote_branch.

  • 您能否提供一个链接,支持您分享的有关-u被弃用的信息?有关推送[git-scm.com](https://git-scm.com/docs/git-push)的最新版本的文档似乎表明它是最新的.提前致谢 - 对于读者来说,跟进更多信息可能会非常有帮助. (4认同)

小智 6

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

\n

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

\n

要推送到不同名称的分支,您只需指定branch you want to push要推送到的分支的名称,并用冒号 (:) 分隔。

\n

例如,如果您想推送一个名为 的some-branch分支my-feature

\n
(some-branch)$ git push origin some-branch:my-feature\nTotal 0 (delta 0), reused 0 (delta 0)\nTo github.com:johnmosesman/burner-repo.git\n + 728f0df...8bf04ea some-branch -> my-feature\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
(main)$ git branch\n* main\n  my-feature\n\n(main)$ git push --all\n...\nTo github.com:johnmosesman/burner-repo.git\n   b7f661f..6e36148  main -> main\n * [new branch]      my-feature -> my-feature\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这似乎是最好的最新答案 (2认同)

归档时间:

查看次数:

69320 次

最近记录:

8 年,8 月 前