如何轻松地将本地 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. 从你的本地分支推送到一个不同名字的远程分支
要从本地推送到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
送到您的远程!因此是这个的等效简写:branch2
branch2
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 branch
cmd:
git branch -vv
示例输出:
这里可以看到上游分支是origin/master
,这意味着master
远程上的分支名为origin
:
* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution
笔记:
-vv
上面的意思是“双重冗长”。这意味着它不仅会详细地打印git branch
,而且会更详细地打印,或者更详细地打印。现在打印的“额外详细”内容包括方括号中的上游分支,如上所示[origin/matser]
:
- 您可以使用 . 查看所有遥控器
git remote -v
。origin
是上面示例中显示的遥控器。
2. 从一个不同名字的远程分支拉到你的本地分支
[如果您已经在branch2
本地签出分支,建议使用!]要在名为TO的远程上拉取 FROMbranch1
origin
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]
以下命令仅在远程和本地分支具有相同名称时才有效!(因此它不回答这个 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
笔记:
- 与 不同
git push
,git pull
没有-u
选项。
- 另请参阅我的另一个答案:如何更改 GitHub 上 PR 的所有者/如何征用开放的 GitHub PR
- 该
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
some_branch
,您实际上最多有3 个分支:1) 一个本地分支,2)远程服务器上名为的远程分支,以及 3) 和本地- 存储的、隐藏的、远程跟踪的分支,名为. 在这里阅读更多信息。以及我第一次了解每个分支3 个分支的概念的地方:如何在本地和远程删除 Git 分支?. 另请参阅我的评论,在该答案下。some_branch
some_branch
origin
origin/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 branch
cmd:
git branch -vv
参考:
- 我第一次学习
git push -u origin local_FROM_branch:remote_TO_branch
语法的地方:@Adam Dymitruk's answer
- https://devconnected.com/how-to-set-upstream-branch-on-git/
- 如何在本地和远程删除 Git 分支?
git
我写过的相关主题:
- 初学者:
- 从另一个分支在 Git 中创建一个分支
- 中间的:
- 如何挑选多个提交
- 先进的:
- 如何从另一个分支只获取一个文件?
- 根据 Git,谁是“我们”,谁是“他们”?