如何将新的本地分支推送到远程Git存储库并跟踪它?
我希望能够做到以下几点:
我怎么做?
我--set-upstream
在Git 1.7中知道,但这是一个创作后的动作.我想找到一种方法,在将分支推送到远程存储库时进行类似的更改.
回答
在Git 1.7.0及更高版本中,您可以签出一个新分支:
git checkout -b <branch>
编辑文件,添加和提交.然后使用-u
(short for --set-upstream
)选项推送:
git push -u origin <branch>
Git将在推送期间设置跟踪信息.
- 值得注意的是,如果你已经在你正在推动的分支上设置了现有的跟踪分支,并且`push.default`被设置为`upstream`,这将不会做你认为它会做的事情.它将尝试推动现有的跟踪分支.使用:`git push -u origin mynewfeature:mynewfeature`或首先执行`git branch --unset-upstream`.
- @Stephane你只需要一次`-u`来启动跟踪.之后只需使用`git push`
- 对于在Visual Studio中使用Git的人:实际上这是Visual Studio中的"Publish Branch".在使用-u参数执行git push之后,我终于可以在VS UI中看到我的分支.
- 每次我们将分支推到遥控器或者只是第一次需要它时,我们是否需要`-u`选项?
- 我仍然需要 'git branch --set-upstream-to origin/remote' 以便 'git status' 正确报告我关于远程分支的分支状态。
- git push -u origin <branch>和git push -u origin HEAD一样(假设你有想要推出的分支签出?)
- 你也可以使用`git push -u origin HEAD`
- 有点烦人的是,我发现 `git push -u origin branchname` 不起作用,但是 `git push -u --set-upstream origin branchname` 起作用了。这是使用 Github for Windows 提供的 PoshGit 脚本。
- 请记住,如果您希望您的 **远程分支** 具有 **不同的名称**,您应该**先在本地更改名称**。例如,假设我在本地有一个名为 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`。
如果您不与他人共享您的仓库,这对于将所有分支推送到远程并--set-upstream
为您正确跟踪非常有用:
git push --all -u
(不完全是OP所要求的,但这种单线很受欢迎)
如果你与其他人分享你的回购,这不是一个很好的形式,因为你会用你所有狡猾的实验分支堵塞回购.
- Git允许提交分支而不是推送它有很好的理由.只使用git push --all就像放弃一块git架构一样.如果它对你有用,那就完全没问题了,太棒了,永远做到了.但是请不要推荐别人避免学习git,因为这是一种快速的方法.
- 和`git pull --all`将它全部拉回到其他地方?KEWL
- 这真的不是正确的答案,并不是一个很好的工具,如果没有真正解释它的作用和含义是什么,建议.请考虑回答这个问题.
- @akronymn @ Federico - 我已经对其进行了编辑,以阐明我所看到的危险 - 是不是更好?
- @Federico @akronymn哪里可以找到做`git push --all -u`的危险?
- 此命令设置对正确分支的跟踪,而无需推送任何内容。谢谢你。
在介绍之前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
- 有时您需要这个`git push origin -u local_branch:remote_branch`
简单地说,创建一个新的本地分支,执行:
git branch <branch-name>
要将其推送到远程存储库,请执行以下操作:
git push -u origin <branch-name>
- `git branch <branch-name>`和`git checkout -b <branch-name>`都创建了一个分支但checkout切换到新分支
- 花花括号只是提到你必须用你想要创建和推送的任何分支名称替换。
- @AdiPrasetyo can you elaborate what you are trying to say/ask?
这里给出的解决方案略有不同:
-
git checkout -b branchname
-
git push -u origin HEAD
使用
HEAD
是一种"将当前分支推送到远程同名的便捷方式".来源:https://git-scm.com/docs/git-push
在Git术语中,HEAD(大写)是对当前分支(树)顶部的引用.该
-u
选项只是简称--set-setupstream
.这将为当前分支添加上游跟踪参考.您可以通过查看.git/config文件来验证这一点:
- 谢谢:)`git push -u origin <branch-name>`不适用于我,但是使用`HEAD`代替`<branch-name>`效果很好:)
我只是这样做
git push -u origin localBranch:remoteBranchToBeCreated
在已经克隆的项目上.
Git remoteBranchToBeCreated
在我提交的提交下创建了一个新的分支localBranch
.
- 这正是我正在积极寻找的
- This should be the top answer.
我想你已经克隆了一个项目,如:
git clone http://github.com/myproject.git
-
git checkout -b <newbranch>
-
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
- @Roni Yaniv:没有`git remote add origin`只注册一个新的远程存储库.在将分支推送到远程存储库之前,这只是一个步骤(如果您不想每次都输入整个地址)
- 我链接到的威廉脚本与删除远程分支的附加选项和一些保护措施大致相同
- > 将本地分支推送到远程仓库(发布),但使其 > 可跟踪,以便 git pull 和 git push 将立即工作。当您将代码推送到他们的存储库时,它会自动执行 github 的操作:-)
- 这并没有回答这个问题,原始 repo 的 <newbranch> 是不可跟踪的(并且重命名为 <master> 是您在步骤 3 中克隆的新 repo)。
- 似乎有点矫枉过正。`git remote add origin` 是否使本地分支可跟踪?这是这里的关键命令吗?
编辑过时,只需使用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通常是原点(您可以修改脚本以将原点作为默认值等等)
- ruby脚本调用`git push`和`git config`命令.我使用脚本代码编辑我的答案.您可能会使用此信息创建一个小shell脚本,为您完成创建.
通过从现有分支分支来创建新分支
git checkout -b <new_branch>
然后使用将此新分支推送到存储库
git push -u origin <new_branch>
这会创建所有本地提交并将其推送到新创建的远程分支 origin/<new_branch>
对于1.7之前的GitLab版本,请使用:
git checkout -b name_branch
(name_branch,例如:master
)
要将其推送到远程存储库,请执行以下操作:
git push -u origin name_new_branch
(name_new_branch,例如:feature
)
我创建了一个别名,这样每当我创建一个新分支时,它都会相应地推送和跟踪远程分支.我将以下块放入.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-kool
与thuy/do-sth-kool
我的新分支的名字.
您可以在 2 个陡坡中完成:
1.使用checkout
for 创建本地分支:
git checkout -b yourBranchName
根据需要与您的分支机构合作。
2.使用push
命令自动创建分支并将代码发送到远程存储库:
git push -u origin yourBanchName
略微根据这里的答案,我将这个过程包装为一个简单的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