如何轻松地将本地Git分支推送到具有不同名称的远程分支?
概述:
以下是您通常需要的关键命令的简短摘要:
git push -u origin branch2:branch1
git pull origin branch1
git branch -u origin/branch1
git branch --unset-upstream
git branch -vv
详情:
以下内容按照顺序逐一介绍:
- 将代码推送到另一个分支
- 从另一个分支拉取代码
- 设置和取消上游分支跟踪
这里有太多不完整和部分回答,让我有很多问题和不满意之处。因此,在经过大量努力、研究和实验后,我尝试提供一个完整的解决方案。
1. 将本地分支推送到具有不同名称的远程分支
要将本地的branch2
推送到远程的branch1
,您必须像这样指定两个分支:
git push origin branch2:branch1
git push <remote> <from_branch>[:to_branch]
请注意,我在上面的一般形式中写的方括号表示
:to_branch
部分是可选的。我的意思是,如果要从一个名称为本地分支推送到一个不同名称的远程分支,则该部分是
不可选的,但作为一般的git命令,如果您不包括
:to_branch
部分,该命令将运行,这意味着在这个意义上它是可选的。但是,这可能会产生意想不到的结果!例如,请看下面的命令:
git checkout branch3
git push origin branch2
你可能当前正在使用本地的
branch3
分支,并认为执行
git push origin branch2
命令会将你的本地
branch3
推送到远程的
branch2
,因为你在本地系统上已经检出了
branch3
,但是实际情况并非如此!相反,
git push origin branch2
命令会将你的本地
branch2
分支推送到远程的
branch2
,即使你没有检出
branch2
分支也是如此!因此,
git push origin branch2
与以下命令等价:
git push origin branch2
git push origin branch2:branch2
上述命令的简写形式会导致非常混乱的行为,如果您认为它会从当前签出的分支推送。以下是对上述行为进行总结的
Nota bene注意事项:
一般格式
git push <remote> <from_branch>[:to_branch]
中,如果您没有使用
:to_branch
指定远程TO分支,则假定它与本地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>
,后跟冒号:
,后跟目标引用<dst>
。
然后稍后又说:
可以省略::<dst>
部分 - 这样的推送将更新<src>
通常在命令行上没有任何<refspec>
更新的引用。
我认为这份文档不直观且非常难以理解,但如果有一些示例和我的上述解释,就会容易理解。
更好的形式的
git push
:您还可以同时设置上游分支和推送。
git push -u origin branch2:branch1
git push --set-upstream origin branch2:branch1
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
命令:
git branch -vv
示例输出:
在这里,您可以看到上游分支是origin/master
,这意味着远程命名为origin
的master
分支:
* 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
,则建议这样做!] 要从名为 origin
的远程仓库的 branch1
分支拉取到本地的 branch2
分支,您必须指定要拉取的远程分支,如下所示:
git pull origin branch1
git pull <remote> [from_branch]
您也可以指定两个分支,但在这种情况下,
我不太确定差异是什么:
git pull origin branch1:branch2
git pull <remote> <from_branch>[:to_branch]
以下命令只有在远程和本地分支名称相同时才有效!(因此它并没有回答这个 Stack Overflow 问题)。如果您还没有检出分支some_branch
,则建议使用此命令!
git fetch origin some_branch:some_branch
git fetch <remote> <from_branch>:<to_branch>
git checkout any_other_branch
git fetch origin some_branch
git checkout some_branch
git merge origin/some_branch
git checkout any_other_branch
注:
git pull
没有 -u
选项,与 git push
不同。
- 查看我的另一个答案:如何在 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
不仅更新该分支,还会将这些更改更新到本地可见的 some_branch
分支中。
- 如果您感到困惑,您需要了解每个名称为
some_branch
的分支实际上可以拆分成多达 3 个分支:1)本地分支 some_branch
,2)名为 origin
的远程服务器上的远程分支 some_branch
,以及 3)本地隐藏的远程跟踪分支 origin/some_branch
。请阅读此处以获取更多信息。和我第一次学习这个“3 个分支”概念的地方:如何在本地和远程删除 Git 分支?。另请参见该答案下面的 我的评论。
3. 配置本地分支以跟踪或取消跟踪远程分支
您可以使用上面显示的 git push -u
命令,在 推送时同时将本地分支 branch2
设置为跟踪上游分支 branch1
。
您还可以像这样将本地分支 branch2
设置为跟踪上游分支 branch1
:
git branch --set-upstream-to=origin/branch1 branch2
git branch -u origin/branch1 branch2
git branch -u <remote>/<to_branch> [from_branch]
git branch --set-upstream-to=origin/branch1
git branch -u origin/branch1
git branch -u <remote>/<to_branch>
要取消 branch2
的上游分支设置,这样它就不再跟踪以前设置的上游分支(在上面的示例中为 origin/branch1
),请运行以下命令:
git branch --unset-upstream branch2
git branch --unset-upstream
如上所示,要查看您的分支当前设置为哪个上游分支,请运行双重详细 (-vv
) 的 git branch
命令:
git branch -vv
参考文献:
- 我最初学习
git push -u origin local_FROM_branch:remote_TO_branch
语法的地方:@Adam Dymitruk的答案
- https://devconnected.com/how-to-set-upstream-branch-on-git/
- 如何在本地和远程删除Git分支?
我写过的相关git
主题:
- 初级:
- 从另一个分支在Git中创建分支
- 中级:
- 如何挑选多个提交
- 高级:
- 如何从另一个分支获取一个文件?
- 根据Git,"我们"和"他们"是谁?
-u
命令只是设置了上游分支,而根据问题描述,上游分支已经被设置。为了让push
命令遵循上游分支设置,他需要将push.default
设置为upstream
,因为默认情况下只有pull
命令会这样做。请注意保持原意,并简化语言以提高易懂性。 - Brian Campbellgit branch --set-upstream
不是必要的。注意:我的git --version
是 2.17.1。 - Gabriel Staples