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

Ron*_*niv 4154 git repository git-push git-remote git-branch

我希望能够做到以下几点:

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

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

我怎么做?

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

小智 6413

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

git checkout -b <branch>
Run Code Online (Sandbox Code Playgroud)

编辑文件,添加和提交.然后使用-u(short for --set-upstream)选项推送:

git push -u origin <branch>
Run Code Online (Sandbox Code Playgroud)

Git将在推送期间设置跟踪信息.

  • 值得注意的是,如果你已经在你正在推动的分支上设置了现有的跟踪分支,并且`push.default`被设置为`upstream`,这将不会做你认为它会做的事情.它将尝试推动现有的跟踪分支.使用:`git push -u origin mynewfeature:mynewfeature`或首先执行`git branch --unset-upstream`. (74认同)
  • @Stephane你只需要一次`-u`来启动跟踪.之后只需使用`git push` (13认同)
  • 对于在Visual Studio中使用Git的人:实际上这是Visual Studio中的"Publish Branch".在使用-u参数执行git push之后,我终于可以在VS UI中看到我的分支. (12认同)
  • 每次我们将分支推到遥控器或者只是第一次需要它时,我们是否需要`-u`选项? (11认同)
  • 我仍然需要 'git branch --set-upstream-to origin/remote' 以便 'git status' 正确报告我关于远程分支的分支状态。 (4认同)
  • git push -u origin <branch>和git push -u origin HEAD一样(假设你有想要推出的分支签出?) (3认同)
  • 你也可以使用`git push -u origin HEAD` (3认同)
  • 有点烦人的是,我发现 `git push -u origin branchname` 不起作用,但是 `git push -u --set-upstream origin branchname` 起作用了。这是使用 Github for Windows 提供的 PoshGit 脚本。 (2认同)
  • 请记住,如果您希望您的 **远程分支** 具有 **不同的名称**,您应该**先在本地更改名称**。例如,假设我在本地有一个名为 a-named-branch 的分支,我想将它推送到远程。如果我运行`git push origin new-named-branch`,我会得到一个错误,指出`error: src refspec new-named-branch does not match any。` 修复方法是运行`git branch -m new-named -branch` 然后运行`git push origin new-named-branch`。 (2认同)

Eri*_*ulz 481

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

git push --all -u
Run Code Online (Sandbox Code Playgroud)

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

如果你与其他人分享你的回购,这不是一个很好的形式,因为你会用你所有狡猾的实验分支堵塞回购.

  • Git允许提交分支而不是推送它有很好的理由.只使用git push --all就像放弃一块git架构一样.如果它对你有用,那就完全没问题了,太棒了,永远做到了.但是请不要推荐别人避免学习git,因为这是一种快速的方法. (39认同)
  • 和`git pull --all`将它全部拉回到其他地方?KEWL (14认同)
  • 这真的不是正确的答案,并不是一个很好的工具,如果没有真正解释它的作用和含义是什么,建议.请考虑回答这个问题. (4认同)
  • @akronymn @ Federico - 我已经对其进行了编辑,以阐明我所看到的危险 - 是不是更好? (4认同)
  • @Federico @akronymn哪里可以找到做`git push --all -u`的危险? (3认同)
  • 此命令设置对正确分支的跟踪,而无需推送任何内容。谢谢你。 (2认同)

Loh*_*run 150

在介绍之前git push -u,没有git push选择来获得你想要的东西.您必须添加新的配置语句.

如果您使用以下方法创建新分支:

$ git checkout -b branchB
$ git push origin branchB:branchB
Run Code Online (Sandbox Code Playgroud)

您可以使用该git config命令避免直接编辑该.git/config文件.

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB
Run Code Online (Sandbox Code Playgroud)

或者,您可以手动编辑.git/config文件以获得此分支的跟踪信息.

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB
Run Code Online (Sandbox Code Playgroud)

  • 为什么“git push origin -u remote_branch_name”有时有效,有时无效? (4认同)
  • 有时您需要这个`git push origin -u local_branch:remote_branch` (3认同)

piy*_*vra 125

简单地说,创建一个新的本地分支,执行:

git branch <branch-name>
Run Code Online (Sandbox Code Playgroud)

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

git push -u origin <branch-name>
Run Code Online (Sandbox Code Playgroud)

  • `git branch <branch-name>`和`git checkout -b <branch-name>`都创建了一个分支但checkout切换到新分支 (17认同)
  • 花花括号只是提到你必须用你想要创建和推送的任何分支名称替换。 (3认同)
  • @AdiPrasetyo 你能详细说明你想说什么/想问什么吗? (2认同)

bg1*_*7aw 87

这里给出的解决方案略有不同:

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

    git checkout -b branchname
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将本地分支推送到远程存储库(发布),但使其可跟踪,git pullgit push立即工作

    git push -u origin HEAD
    
    Run Code Online (Sandbox Code Playgroud)

    使用HEAD是一种"将当前分支推送到远程同名的便捷方式".来源:https://git-scm.com/docs/git-push 在Git术语中,HEAD(大写)是对当前分支(树)顶部的引用.

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

    在此输入图像描述

  • 谢谢:)`git push -u origin &lt;branch-name&gt;`不适用于我,但是使用`HEAD`代替`&lt;branch-name&gt;`效果很好:) (2认同)

Ash*_*war 61

git push --set-upstream origin <your branch name>

或者

git push -u origin <your branch name>

  • 值得注意的是,您可以使用“-u”替代“--set-upstream”来节省一些输入。[参考](https://git-scm.com/docs/git-push#Documentation/git-push.txt--u) (2认同)

Ard*_*rda 45

我只是这样做

git push -u origin localBranch:remoteBranchToBeCreated
Run Code Online (Sandbox Code Playgroud)

在已经克隆的项目上.

Git remoteBranchToBeCreated在我提交的提交下创建了一个新的分支localBranch.

  • 这正是我正在积极寻找的 (3认同)
  • 这应该是最重要的答案。 (2认同)
  • 如果远程新分支不存在,则这里最上面的一个是唯一可以工作的。这里的所有其他事情对我来说都失败了。新的远程分支定义必须连接“local:remote”。 (2认同)

Hit*_*ahu 36

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

拉取所有远程分支

git pull --all
Run Code Online (Sandbox Code Playgroud)

立即列出所有分支机构

git branch -a  
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b <feature branch>
Run Code Online (Sandbox Code Playgroud)

显示当前分支。前面必须显示 *

git branch      
Run Code Online (Sandbox Code Playgroud)

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

git add .
Run Code Online (Sandbox Code Playgroud)

现在提交您的更改:

git commit -m "Refactored/ Added Feature XYZ"
Run Code Online (Sandbox Code Playgroud)

重要提示:从 master 获取更新:

git pull origin feature-branch
Run Code Online (Sandbox Code Playgroud)

现在推送您的本地更改:

git push origin feature-branch
Run Code Online (Sandbox Code Playgroud)


VP.*_*VP. 30

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

git clone http://github.com/myproject.git
Run Code Online (Sandbox Code Playgroud)
  1. 然后在本地副本中,创建一个新分支并将其检出:

    git checkout -b <newbranch>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 假设您在服务器上创建了一个"git bare --init"并创建了myapp.git,您应该:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
    Run Code Online (Sandbox Code Playgroud)
  3. 之后,用户应该能够

    git clone http://example.com/var/git/myapp.git
    
    Run Code Online (Sandbox Code Playgroud)

注意:我假设您已启动并运行服务器.如果不是,它将无法工作.一个良好的操作方法是在这里.

添加

添加远程分支:

git push origin master:new_feature_name
Run Code Online (Sandbox Code Playgroud)

检查一切是否正常(获取原点并列出远程分支):

git fetch origin
git branch -r
Run Code Online (Sandbox Code Playgroud)

创建本地分支并跟踪远程分支:

git checkout -tb new_feature_name origin/new_feature_name
Run Code Online (Sandbox Code Playgroud)

更新一切:

git pull
Run Code Online (Sandbox Code Playgroud)

  • @Roni Yaniv:没有`git remote add origin`只注册一个新的远程存储库.在将分支推送到远程存储库之前,这只是一个步骤(如果您不想每次都输入整个地址) (3认同)
  • 我链接到的威廉脚本与删除远程分支的附加选项和一些保护措施大致相同 (2认同)
  • &gt; 将本地分支推送到远程仓库(发布),但使其 &gt; 可跟踪,以便 git pull 和 git push 将立即工作。当您将代码推送到他们的存储库时,它会自动执行 github 的操作:-) (2认同)
  • 这并没有回答这个问题,原始 repo 的 &lt;newbranch&gt; 是不可跟踪的(并且重命名为 &lt;master&gt; 是您在步骤 3 中克隆的新 repo)。 (2认同)
  • 似乎有点矫枉过正。`git remote add origin` 是否使本地分支可跟踪?这是这里的关键命令吗? (2认同)

Tob*_*ler 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}
Run Code Online (Sandbox Code Playgroud)

然后运行git-publish-branch REMOTENAME BRANCHNAME,其中REMOTENAME通常是原点(您可以修改脚本以将原点作为默认值等等)

  • ruby脚本调用`git push`和`git config`命令.我使用脚本代码编辑我的答案.您可能会使用此信息创建一个小shell脚本,为您完成创建. (2认同)

cpt*_*ack 23

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

git checkout -b <new_branch>
Run Code Online (Sandbox Code Playgroud)

然后使用将此新分支推送到存储库

git push -u origin <new_branch>
Run Code Online (Sandbox Code Playgroud)

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


小智 13

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

git checkout -b name_branch
Run Code Online (Sandbox Code Playgroud)

(name_branch,例如:master)

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

git push -u origin name_new_branch
Run Code Online (Sandbox Code Playgroud)

(name_new_branch,例如:feature)


Thu*_*inh 10

我创建了一个别名,这样每当我创建一个新分支时,它都会相应地推送和跟踪远程分支.我将以下块放入.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
Run Code Online (Sandbox Code Playgroud)

使用方法:只需输入gcb thuy/do-sth-koolthuy/do-sth-kool我的新分支的名字.


Jav*_* C. 9

您可以在 2 个陡坡中完成:

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

git checkout -b yourBranchName
Run Code Online (Sandbox Code Playgroud)

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

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

git push -u origin yourBanchName
Run Code Online (Sandbox Code Playgroud)

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


Dev*_*ode 7

我认为这是最简单的别名,添加到您的~/.gitconfig

[alias]
  publish-branch = !git push -u origin $(git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)

你只要跑

git publish-branch
Run Code Online (Sandbox Code Playgroud)

并且...它发布了分支


Bra*_*rks 5

略微根据这里的答案,我将这个过程包装为一个简单的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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)