如何将新的本地分支推送到远程Git存储库并进行跟踪?


4302

我希望能够执行以下操作:

  1. 根据其他(远程或本地)分支(通过git branchgit checkout -b)创建本地分支

  2. 将本地分支推送到远程存储库(发布),但使其可跟踪,git pullgit push可以立即使用。

我怎么做?

--set-upstream在Git 1.7中了解,但这是创建后的操作。我想找到一种将分支推送到远程存储库时进行类似更改的方法。



71
只是指出--set-upstream是-u
Huang

@BaiyanHuang感谢您指出这一点。最初,我认为-u意味着无法追踪,这对我来说没有意义
德米特里(Dmitry)

Answers:


6608

在Git 1.7.0和更高版本中,您可以签出一个新分支:

git checkout -b <branch>

编辑文件,添加并提交。然后使用-u(的缩写--set-upstream选项:

git push -u origin <branch>

Git将在推送过程中设置跟踪信息。


81
还值得注意的是,如果您要推送的分支上已经设置了现有的跟踪分支,并且push.default将其设置为upstream,那么这将无法实现您认为会做的事情。它将尝试推送现有的跟踪分支。使用:git push -u origin mynewfeature:mynewfeature或先做git branch --unset-upstream
void.pointer 2014年

13
对于从Visual Studio使用Git的人:实际上,这是Visual Studio中的“发布分支”。使用-u参数执行git push之后,我终于可以看到我的分支在VS UI中发布了。
Puterdo Borato 2015年

3
git push -u origin <branch>与git push -u origin HEAD是否相同(假设您有要推送的分支已签出?)
Gymbrall 2016年

13
-u每次将分支推送到其远程位置还是仅在第一次使用它时,我们都需要该选项吗?
Stephane

17
@Stephane您只需-u一次即可启动跟踪。事后使用git push
Todd

490

如果您不与其他人共享您的仓库,这对于将所有分支机构推送到远程并--set-upstream为您正确跟踪非常有用:

git push --all -u

(不完全是OP的要求,但是这种单线很受欢迎)

如果您要与其他人共享您的存储库,那么这并不是一个好方法,因为您会与所有狡猾的实验分支阻塞存储库。


14
并将git pull --all其全部拉回其他地方?KEWL
commonpike

1
此命令将跟踪设置为正确的分支,而无需执行任何操作。谢谢。
amey91

45
Git允许提交分支,并且出于非常充分的理由而不能将其推送。仅使用git push --all就像删除一块git体系结构。如果它对您有用,那就很好,永远做下去。但是请不要建议其他人仅仅因为这是一种快速的操作方法而避免学习git。
Federico Razzoli '16

4
在没有真正解释它的作用和含义的情况下,这确实不是正确的答案,也不是推荐的好工具。请考虑将此答案记下来。
akronymn

3
@Federico @akronymn在哪里可以找到这样做的危险git push --all -u
user1823664

155

在引入之前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

4
有时您需要这个git push origin -u local_branch:remote_branch
李小龙

127

简而言之,要创建一个新的本地分支,请执行以下操作:

git branch <branch-name>

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

git push -u origin <branch-name>

17
git branch <branch-name>git checkout -b <branch-name>两个创建一个分支,但结账切换到新的分支
罗伯特

1
dude方括号只是要提及的是,您必须替换为要创建并推送的任何分支名称。
piyushmandovra

它是远程src branch-name does not match any
站点

96

这里已经给出的解决方案略有变化:

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

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

    git push -u origin HEAD
    

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

    -u选项只是的缩写--set-upstream。这将为当前分支添加上游跟踪参考。您可以通过查看.git / config文件来验证这一点:

    在此处输入图片说明


2
谢谢:) git push -u origin <branch-name>不是为我工作,而是使用HEAD代替而不是<branch-name>完美地工作:)
Daniel Tonon

56

我只是做

git push -u origin localBranch:remoteBranchToBeCreated

在已经克隆的项目上。

Git创建了一个新分支,该分支以remoteBranchToBeCreated我在中所做的提交命名localBranch

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

git branch --set-upstream-to=origin/localBranch

因此,您当前的本地分支现在可以origin/localBranch追溯。


1
这正是我一直在积极寻找的东西
eli

error: src refspec <new branch> does not match any.尝试时,git会抛出异常。
codeforester

1
这应该是最佳答案。
Aditya Abhas

30

我想您已经克隆了一个项目,例如:

git clone http://github.com/myproject.git
  1. 然后在您的本地副本中,创建一个新分支并签出:

    git checkout -b <newbranch>
    
  2. 假设您在服务器上做了一个“ git裸露--init”并创建了myapp.git,您应该:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. 之后,用户应该能够

    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

1
威廉的剧本我挂做关于与其他选项,在同一删除远程分支机构和一些保障措施,过于
托比亚斯Kienzler

1
>将本地分支推送到远程仓库(发布),但使其可跟踪,因此git pull和git push将立即起作用。它是当您将代码推送到其存储库时github自动执行的操作:-)
副总裁。

1
这不会回答该问题,原始存储库的<newbranch>是不可跟踪的(并重命名为<master>是您在步骤3中克隆的新存储库)。
罗润(Lohrun)2010年

1
似乎有点矫kill过正。请问git remote add origin使当地分行可追踪?这是关键命令吗?
罗尼·亚尼夫

3
@Roni Yaniv:git remote add origin不仅要注册一个新的远程存储库。这只是将分支推送到该远程存储库之前的一个步骤(如果您不想每次都键入整个地址)
Lohrun 2010年

23

编辑过时的,只用git push -u origin $BRANCHNAME


使用git publish-branch威廉的杂项的Git工具gitorious回购克隆)。

好的,没有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通常是原点(您可以修改脚本以将原点作为默认值,等等。)


1
假设我已经安装了ruby。没有这种运气。还有其他想法吗?
罗尼·亚尼夫

2
红宝石脚本调用git pushgit config命令。我使用脚本的代码来编辑答案。您可能会使用此信息来创建一个小的shell脚本来为您完成操作。
罗赫伦

1
William的其他git工具似乎已经移动了(该链接现在无效)。一个有效的链接是:gitorious.org/willgit
Mike D

1
“威廉姆斯”的链接再次断开;新的链接似乎是git-wt-commit.rubyforge.org
ScottJ 2016年

22

通过从现有分支分支来创建新分支

git checkout -b <new_branch>

然后使用以下命令将该新分支推送到存储库

git push -u origin <new_branch>

这将创建所有本地提交并将其推送到新创建的远程分支 origin/<new_branch>


12

对于1.7之前的GitLab版本,请使用:

git checkout -b name_branch

(name_branch,例如:master

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

git push -u origin name_new_branch

(name_new_branch,例如:feature


9

我做了一个别名,以便每当我创建一个新分支时,它将相应地推送和跟踪远程分支。我将以下块放入.bash_profile文件中:

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

用法:只需键入gcb thuy/do-sth-koolwith thuy/do-sth-kool是我的新分支名称。


4

略微根据这里的答案,我将这个过程包装为一个简单的Bash脚本,当然也可以用作Git别名。

对我来说重要的补充是,这促使我在提交之前运行单元测试,并且默认情况下传入当前分支名称。

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH

2

您可以在2个陡峭的山坡上做到这一点:

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

git checkout -b yourBranchName

根据需要与分支机构合作。

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

git push -u origin yourBanchName

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


0

为了获得最大的灵活性,您可以使用自定义的Git命令。例如,在您$PATH的名字下的某个位置创建以下Python脚本git-publish并将其可执行:

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

然后git publish -h将向您显示用法信息:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.