如何将新的本地分支推送到远程Git仓库并跟踪它?

5592

我该如何:

  1. 通过 git branchgit checkout -b 从另一个分支创建一个本地分支。

  2. 将本地分支推送到远程仓库(即发布),但要使其可追踪,以便 git pullgit push 能够工作。


143
指出一点,--set-upstream 的缩写是 -u。 - Baiyan Huang
2
很多答案包含无关信息(比如如何创建分支),而且如果答案适用的话,那么有关使用的神奇参数的信息也是缺失的。 - user12411795
14
我的工作流程是: git checkout -b branchgit push => 这时会输出一个包含所需运行命令的错误信息。然后复制/粘贴该命令即可。 :) - Kip
18个回答

8318
在 Git 1.7.0 及更高版本中,你可以检出一个新的分支:
git checkout -b <branch>

编辑文件,添加并提交修改。然后使用-u(即--set-upstream的简称)选项进行推送:

git push -u origin <branch>

在推送时,Git会设置跟踪信息。


137
值得注意的是,如果你在推送分支时已经设置了现有的跟踪分支,并且push.default设置为“upstream”,那么这将不会按照你的预期进行。它将尝试覆盖现有的跟踪分支。请使用:git push -u origin mynewfeature:mynewfeature或者先运行 git branch --unset-upstream - void.pointer
5
为了让'git status'正确地报告我本地分支与远程分支的状态,我仍然需要运行'git branch --set-upstream-to origin/remote'命令。 - Paul Whipp
22
对于使用 Visual Studio 中的 Git 的人: 实际上,这就是 Visual Studio 中“发布分支”的作用。在使用 git push 命令并带有 -u 参数后,我最终可以在 VS 用户界面中看到我的分支已被发布。 - Puterdo Borato
28
你可以使用 git push -u origin HEAD - amaslenn
39
您只需要使用一次 -u 来初始化追踪。之后,只需使用 git push 即可。 - Todd
显示剩余6条评论

574
如果你不与他人共享你的代码库,那么下面的命令可以帮助你将所有分支推送到远程,并正确地设置--set-upstream跟踪:

git push --all --set-upstream
git push --all -u

(虽然这不完全是发帖者所要求的,但这个一行代码很受欢迎)

如果您与他人共享存储库,则不应该这样做,因为您会将所有有问题的实验性分支淹没存储库。


17
git pull --all 可以将所有代码下载到另一个地方,很棒! - commonpike
66
Git允许提交一个分支而不推送它,这是有非常好的理由的。只使用git push --all就像丢弃了一部分git架构。如果对你有效,那很好,继续使用吧。但请不要仅仅因为它是一种快捷的方式就建议他人避免学习git。 - Federico Razzoli
12
这并不是正确答案,也不是一个好的工具推荐,如果没有对它的功能和影响进行真正的解释,请勿推荐。请考虑撤下这个答案。 - akronymn
5
@Federico @akronymn 请问在哪里可以找到关于执行 git push --all -u 的风险信息? - user1823664
7
@akronymn @ Federico - 我已编辑并解释了我认为的危险性,这样好吗? - ErichBSchulz

258

在引入 git push -u 之前,没有 git push 选项可以获取您想要的结果。您必须添加新的配置语句。

如果您使用以下命令创建一个新分支:

$ git checkout -b branchB
$ git push origin branchB:branchB
你可以使用git config命令来避免直接编辑.git/config文件:
$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

或者您可以手动编辑 .git/config 文件,向该分支添加跟踪信息:

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB

24
有时候你需要使用 git push origin -u local_branch:remote_branch 这个命令。 - Bruce Lee
4
为什么有时候 "git push origin -u remote_branch_name " 能用,有时候又不能用? - mss

185

简单来说,要创建一个新的本地分支,请执行以下操作:

git branch <branch-name>

要将其推送到 远程 仓库,请执行以下操作:

git push -u origin <branch-name>

25
git branch <branch-name>git checkout -b <branch-name> 都可以创建一个分支,但是 checkout 命令会切换到新的分支。 - Robert
6
伙计,方括号只是提醒你需要用你想要创建并推送的分支名称来替换它。 - piyushmandovra
2
@AdiPrasetyo,你能详细说明你想说/问什么吗? - piyushmandovra

149

以下是对此处已有解决方案的略微变化:

  1. 基于其他(远程或本地)分支创建本地分支:

    git checkout -b branchname
    
  2. 将本地分支推送到远程仓库(发布),但使其可跟踪,以便git pullgit push立即起作用。

  3. git push -u origin HEAD
    

    使用HEAD是将当前分支推送到远程相同名称的“方便方法”。来源:https://git-scm.com/docs/git-push 在Git术语中,大写的 HEAD 是指向当前分支(树)顶部的引用。

    -u选项只是--set-upstream的简称。这将为当前分支添加一个上游跟踪引用。您可以通过查看您的.git/config文件来验证此操作:

    Enter image description here


7
谢谢 :) 对我而言 git push -u origin <branch-name> 无法生效,但是使用 HEAD 替代 <branch-name> 却完美解决了问题 :) - Daniel Tonon

124

我只是做

git push -u origin localBranch:remoteBranchToBeCreated

在一个已经克隆的项目上。

Git 在我在 localBranch 中提交的代码下创建了一个名为 remoteBranchToBeCreated 的新分支。

编辑: 这将更改您当前本地分支(可能命名为localBranch)的上游至 origin/remoteBranchToBeCreated。要解决此问题,只需输入:

git branch --set-upstream-to=origin/localBranch
或者
git branch -u origin/localBranch

所以你当前的本地分支现在跟踪 origin/localBranch


1
当我尝试这样做时,git会抛出“错误:src refspec <new branch> does not match any.”。 - codeforester
@codeforester 我现在遇到了完全相同的错误,我不明白如何在github中将local_branch连接到remote_branch,有人可以帮忙吗? - Suresh
1
谢谢您的解释。我能够理解并且它起作用了。 - Rick
1
这里的顶部是唯一可行的,如果远程新分支不存在。对我来说,这里的所有其他内容都失败了。新的远程分支定义必须连接 local:remote - andiOak

59

git push --set-upstream origin <你的分支名称>

或者

git push -u origin <你的分支名称>


1
值得注意的是,您可以使用“-u”作为“--set-upstream”的替代方式,以节省一些打字时间。参考 - Paul Rooney

46

编辑:已过时,请使用git push -u origin $BRANCHNAME


使用William's miscellaneous Git tools中的git publish-branch命令。

好的,没有Ruby,所以 - 忽略保护! - 取脚本的最后三行创建一个bash脚本 git-publish-branch

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

然后运行 git-publish-branch REMOTENAME BRANCHNAME 命令,其中 REMOTENAME 通常为 origin(您可以修改脚本以将 origin 设为默认值等等...)


1
这意味着我已经安装了Ruby。可惜没有。还有其他的想法吗? - Roni Yaniv
2
这个 Ruby 脚本调用了 git pushgit config 命令。我使用了脚本的代码来编辑我的答案。你可以使用这些信息创建一个小的 shell 脚本来为你完成发布。 - Lohrun
1
William的杂项git工具似乎已经移动了(该链接现在已失效)。一个有效的链接是:https://gitorious.org/willgit - Mike D
1
"William的"链接又坏了;新链接似乎是http://git-wt-commit.rubyforge.org/。 - ScottJ
编辑答案,只保留一个有效链接(https://github.com/DanielVartanov/willgit)。 - Devin Rhode

36

将本地更改推送到新功能分支的完整Git工作流程如下:

拉取所有远程分支

git pull --all

列出所有分支现在。
git branch -a  

结账或创建分支(将<feature branch>替换为您的分支名称):

git checkout -b <feature branch>

显示当前分支。必须在前面带上*。

git branch      

添加您的本地更改(.此处是有意的)

git add .

现在提交您的更改:

git commit -m "Refactored/ Added Feature XYZ"

重要提示:从主分支获取更新:

git pull origin feature-branch

现在将本地更改推送:

git push origin feature-branch

不要忘记发起拉取请求:https://www.git-scm.com/docs/git-request-pull - Adam Erickson

35

我想你已经像这样克隆了一个项目:

git clone http://github.com/myproject.git
  1. 在你的本地副本中创建一个新分支并切换到它:

git checkout -b <newbranch>
假设你在服务器上通过 "git bare --init" 命令创建了 myapp.git,那么你需要:
git remote add origin ssh://example.com/var/git/myapp.git
git push origin master
在那之后,用户应该能够:
git clone http://example.com/var/git/myapp.git

注意:我假设您已经启动并运行了服务器。如果没有启动,它将无法工作。一个好的如何操作可以在这里找到。

添加

添加一个远程分支:

git push origin master:new_feature_name

检查一切是否良好(获取远程代码并列出分支):

git fetch origin
git branch -r
创建本地分支并跟踪远程分支:
git checkout -tb new_feature_name origin/new_feature_name

更新所有内容:

git pull

2
我链接的William的脚本与其它选项大致相同,还具有删除远程分支和一些保障措施的附加选项。 - Tobias Kienzler
2
将本地分支推送到远程仓库(发布),但要使其可跟踪,以便立即使用git pull和git push。这就是当您将代码推送到GitHub存储库时,它自动执行的操作 :-) - VP.
2
这并没有回答问题,原始 repo 的 <newbranch> 无法被跟踪(并且在步骤3中克隆的新 repo 被重命名为 <master>)。 - Lohrun
2
这似乎有点过度了。git remote add origin 命令是否可以使本地分支可追踪?这是关键命令吗? - Roni Yaniv
4
@Roni Yaniv:git remote add origin 只是注册一个新的远程仓库,不会直接将分支推送到远程仓库。这只是在推送分支到远程仓库之前必须执行的一个步骤(如果您不想每次都输入完整的地址)。 - Lohrun
显示剩余2条评论

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