如何创建一个远程Git分支?

3693

我创建了一个本地分支,如何将其推送到远程服务器?

更新:我在这里为Git 2.0写了一篇更简单的答案


16
有人回答了你的第二个问题吗?如果要告诉我的同事从上游代码库获取更新,我应该怎么说? - milkplus
可能相关:Pro Git:3.5 Git 分支 - 远程分支 - user456814
1
@milkplus get fetch --all 会获取远程端的新分支(但只有 get fetch --prune 才会删除本地对已删除的远程分支的引用)。我认为,这应该由他们自动设置,或者您需要口头与他们沟通。 - peterh
1
可能是重复的问题:如何将新的本地分支推送到远程Git存储库并跟踪它? - Trevor Boyd Smith
这里在 Stack Overflow 上有一个类似的问题,关于如何跟踪新创建的远程分支。- 您没有告诉我们您想要的问题是什么。我猜测可能是 https://dev59.com/mnRB5IYBdhLWcg3wxZ1K。根据 @Trevor Boyd Smith 的评论,我认为您在这里提出的问题和那个问题都是 https://dev59.com/W3E85IYBdhLWcg3wdDSz 的重复。 - Henke
26个回答

4234

首先,创建一个新的本地分支并切换到该分支:

git checkout -b <branch-name>

当您将其推送到远程服务器时,远程分支会自动创建:

git push <remote-name> <branch-name> 

<remote-name> 通常是 origin,这是 Git 给你从中克隆的远程代码库的名称。你的同事可以简单地拉取那个分支。

然而请注意,正式的格式是:

git push <remote-name> <local-branch-name>:<remote-branch-name>

但是当您省略其中一个时,它会假定两个分支名称相同。话虽如此,作为警告的一句话,请不要犯只指定:<remote-branch-name>(带有冒号)的严重错误,否则远程分支将被删除!


因此,为了让后续的git pull知道该怎么做,您可能想要使用:

git push --set-upstream <remote-name> <local-branch-name> 

如下所述,--set-upstream选项设置了上游分支:

对于每个处于最新状态或成功推送的分支,都会添加上游(跟踪)引用,这些引用可被无参数的git-pull(1)和其他命令使用。


107
请注意,git 的默认行为是推送 匹配的 引用,因此 git push <remote> 不会推送分支,如果它在 <remote> 上不存在。 - Jakub Narębski
244
你可能希望使用git push -u <remote-name> <branch-name>,这样后续的git pull命令就知道该怎么做了。 - Bart Schuller
89
而不是明确指定服务器名称,你可以使用 origin,它表示“我获取此存储库的其余部分的服务器”:因此,使用 git push origin <分支名称> - lambshaanxy
71
如果你忘记使用 -u 选项,后来在分支中只需输入 git push -u,然后 git pull 就会起作用。 - Jan
98
综合起来,git push -u origin <local-branch-name> 对我有效。 - Samo
显示剩余18条评论

1011

首先,您必须在本地创建您的分支

git checkout -b your_branch

之后,您可以在本地分支上工作,当您准备共享该分支时,请将其推送。下一个命令将分支推送到远程存储库 origin 并跟踪它。

git push -u origin your_branch

团队成员可以通过以下方式访问您的分支:

git fetch
git checkout origin/your_branch

你可以在分支中继续工作,并随时使用不带参数的 git push 命令进行推送(不带参数的 git push 将会把本地的 master 分支推送到远程的 master 分支,将本地的 your_branch 分支推送到远程的 your_branch 分支等等)。
git push

队友可以通过提交并明确地推送来推送到你的分支

# ... work ...
git commit
# ... work ...
git commit
git push origin HEAD:refs/heads/your_branch

或者跟踪分支以避免在 git push 时出现争论

git checkout --track -b your_branch origin/your_branch
# ... work ...
git commit
# ... work ...
git commit
git push

2
有没有办法创建一个远程分支,而不必创建同名的本地分支? - Ariel Gabizon
@ArielGabizon,不是很确定你的意思,因为你通常会在本地开始工作(即首先命名本地分支)或拉取现有的远程分支。但是当您最初推送到远程时,可以指定新名称:git push -u origin [local-branch-name]:[remote-branch-name]。您还可以在拉取远程分支时指定自己的分支名称:git branch -t -b [local-branch-name] origin/[remote-branch-name] - UncaughtTypeError
@dseminara -u 的实用性是什么? - Gass
@Gass -u 是 --set-upstream 的快捷方式,它会更新你本地分支的注册表以跟踪新创建的分支。如果你想让将来的 push 命令自动发送信息到指定的分支,而不必每次都显式地指定相关分支,那么你需要使用该选项(-u 或 --set-upstream,两者是相同的)。 - dseminara
@ArielGabizon 是的,可以这样做,但我更喜欢在“:”后明确指定“refs/heads/[remote-branch-name]”。我喜欢使用相同名称的本地分支以避免混淆,但该命令push的使用非常方便,可用于操作远程分支,包括标签。 - dseminara

419

简单的Git 2.0+解决方案:

Git 2.0开始,行为变得更简单了:

您可以通过push.default = current配置git以使生活更轻松:

我添加了这个设置,现在我只需使用push命令即可将新分支推到远程仓库:

$ git push -u

-u选项将跟踪相同名称的远程分支。现在有了这个配置,您将自动猜测要推送到git的远程引用。来自git.config文档:

push.default

如果没有明确给出refspec,则定义git push应采取的操作。

push.default = current - 推送当前分支以更新接收端上具有相同名称的分支。适用于中央和非中央工作流程。

对于我来说,这是我日常Git工作流程的很好简化。此配置设置会处理“通常”的用例,即您在本地添加分支并希望在远程创建它。另外,我可以通过只执行git co remote_branch_name(而不使用--set-upstream-to标志)轻松地从远程创建本地分支。

我知道这个问题和已接受的答案相当陈旧,但行为已更改,因此现在存在配置选项可使工作流程更简单。

要添加到全局Git配置,请在命令行上运行:

$ git config --global push.default current

6
我发现git push -u origin HEAD在这里的回答[https://dev59.com/J3I_5IYBdhLWcg3wHfSr#21991290]略显冗长(你需要写出你正在做什么),但打字量不会太多。此外,如果分支是用-t创建的,则不带其他参数的git push -u对我无效。 - Qw3ry
git config --global push.default upstream && git checkout -b foo && <change a file> && git push -u 在 Git 2.19.1 版本中无法正常工作;push 操作需要指定远程仓库和分支参数。 - knite
你能详细说明一下 git co remote_branch_name 的含义吗? - Chris Karpyszyn
1
对我没用。通过添加到~/.profile解决:function gitb() { git checkout -b $1 && git push --set-upstream origin $1; },然后可以执行gitb feature/abcd - 这将为git pullgit push设置它们所需的参数,并将新分支推送到远程仓库以验证名称是否真正可用。 - youurayy
@youurayy 你可能忘记了在 git push -u 命令中添加 -u 标志,还要检查你的 git config --list 是否包含 push.default=current。对我来说,git push -u 就可以正常工作。另外请注意,从 Git v2.27 开始,会提示你设置默认的推送策略。所以也许你的默认设置不同? - Jesper Rønn-Jensen
显示剩余2条评论

95

如前面的答案所述,

git push <remote-name> <local-branch-name>:<remote-branch-name>

推送本地分支的命令已足够。

使用此命令,您的同事可以拉取所有远程分支(包括新分支):

git remote update

然后,要在分支上进行更改,通常的流程如下:

git checkout -b <local-branch-name> <remote-name>/<remote-branch-name>

我喜欢这个功能,因为它允许远程名称与本地名称不同。 - Ariel Gabizon
太好了,现在我可以对bar baz进行操作了。 - Adi Prasetyo

93

基于当前分支在本地创建一个新的分支:

git checkout -b newbranch

按照平常的流程提交任何修改。然后,将其推送到上游:

git push -u origin HEAD

这是一个快捷方式,可以将当前分支推送到同名的origin分支上并跟踪它,以便将来无需指定origin HEAD


5
这个命令对我的情况有帮助:git push -u origin HEAD。我认为这是最清晰的方法。 - Scadge
2
是的,你永远不会记得上次作为分支输入了什么,所以这是正确的方法。 - marksyzm
5
如果你不记得自己在哪个分支或者给它起了什么名字,那么最好不要进行推送操作!至少,在执行 git push 命令之前应该先运行 git status 命令。 - Zenexer
1
是的,一定要确保在推送时世界不会爆炸;我同意。 - marksyzm
2
这是创建跟踪分支和远程分支的最有效方法。我还想添加git remote show origin作为第三步,以可视化新的跟踪/被跟踪关系。 - hb5fa

84

如果你想从当前分支创建一个新的分支

git checkout -b {your_local_branch_name}

如果你想从远程分支获取一个分支,可以尝试使用以下命令:

git checkout -b {your_local_branch_name} origin/<remote_branch_name>

如果您完成了更改,您可以添加文件。

git add -A or git add <each_file_names>

然后在本地进行提交

git commit -m 'your commit message'

当您想要将更改推送到远程存储库时

git push -u origin <your_local_branch_name>

全部在一起将会是:

git checkout -b bug_fixes 

或者,如果你想从一个远程分支(例如development)创建一个本地分支bug_fixes

git checkout -b bug_fixes origin/development

你可以通过以下方式将本地分支推送到远程仓库:

git push -u origin bug_fixes

如果你想要从其他分支(例如master)更新你的分支,随时都可以这样做。

git pull origin master

69

[快速回答]

你可以分为2步来完成:

1. 使用checkout创建本地分支:

git checkout -b yourBranchName

2. 使用push命令自动创建分支并将代码发送到远程仓库:

git push -u origin yourBranchName

有多种方法可以做到这一点,但我认为这种方法非常简单。


51

如果你想要创建一个远程分支而不需要本地分支,可以按照以下方法进行:

git push origin HEAD:refs/heads/foo

它将您的 HEAD 推送到远程不存在的分支 foo


1
这样做完全混乱了我的Visual Studio,以至于它无法正确启动。团队资源管理器根本无法加载,但其他所有东西都疯狂地抛出错误。仅供参考。 - Josh
这听起来应该是可行的,但当我实际尝试时,我们的GitLab服务器没有将结果识别为分支。 - JosephH
foo 分支在远程是从哪个分支分出来的?如果我想让 foo 从 foo2 分支分出来,这是否可能?谢谢。 - user674669
1
它也可以在Gerrit服务器上运行,创建一个之前不存在的远程分支。 - MichaelZ

34

最简单的解决方案……鼓声响起……git版本2.10.1(Apple Git-78)

1) git checkout -b localBranchNameThatDoesNotExistInRemote

2) Do your changes, and do a git commit 

3) git push origin localBranchNameThatDoesNotExistInRemote --force

注意:您刚在本地环境中创建的分支和您正在尝试推送的不存在的远程分支必须具有相同的名称


3
谢谢您的建议。虽然您称此为简易解决方案,但我仍认为 git push -u 更容易。这需要您在全局配置中添加一行代码,详情请见 https://dev59.com/J3I_5IYBdhLWcg3wHfSr#27185855。我经常使用 git push -u,它几乎覆盖了我工作时99%的用例。 - Jesper Rønn-Jensen

30

首先你需要在本地创建分支:

git checkout -b your_branch

然后远程创建分支:

git push --set-upstream origin your_branch

注意:此方法适用于最新版本的git:

$ git --version
git version 2.3.0

干杯!


这只是由命令 git push 生成的帮助文本,当您的本地分支没有被远程跟踪时会出现。 - nurettin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接