我一直在想是否有一种简单的方法来推拉具有不同名称的本地分支和远程分支,而不总是指定两个名称。
例如:
$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name
现在如果有人更新remote_branch_name,我可以:
$ git pull
所有内容都被合并/快进。然而,如果我在本地的“newb”中进行更改,我不能:
$ git push
相反,我必须:
% git push origin newb:remote_branch_name
听起来有点傻。如果git-pull使用git-config branch.new .merge来决定从哪里拉,为什么git-push不能有一个类似的配置选项?有什么捷径吗,还是我应该继续走这条路?
是的,有一个配置选项,默认情况下让git推送到上游分支。
使用下面的语句,这样你就不必每次都执行git push origin local:remote:
# Set remote branch with a different name as an upstream branch
# for local branch currently checked out
git branch --set-upstream-to origin/remote_branch_name
# Change the default behavior for git-push (see manpage for git-config)
git config push.default upstream
# Now git will push to the upstream branch by default
git push
在将当前分支的上游设置为具有不同名称的远程分支之后,您需要更改git推送到上游的默认行为(参见manpage中的git-config)。
现在,git push将遵循这些规则并推送到上游的集合。
以下是对我行之有效的方法。
git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url
现在你的新回购将是“原点”,原始回购是“上游”。运行git remote -v确认。(附注:Upstream用于从原始的回购中获取数据——为了使你的本地副本与你想要贡献的项目保持同步——而origin用于拉和推,因为你可以贡献给自己的回购)。
Git push origin master
现在你的新远程回购主服务器(在Github上)将与原始主服务器同步,但它不会有任何功能分支。
git rebase upstream/branch-name
git push origin master
Rebase是一个聪明的合并。然后再次推到master,你会在新的repo上看到所选的功能分支作为master。
可选:
git remote rm upstream
git remote add upstream new-repo-url
如何在Git上推到不同名称的分支
您通常会将本地分支推到同名的远程分支,但并非总是如此。
要推到不同名称的分支,只需要指定要推的分支和要推的分支的名称,用冒号(:)分隔。
例如,如果你想把一个叫做some-branch的分支推到my-feature:
(some-branch)$ git push origin some-branch:my-feature
Total 0 (delta 0), reused 0 (delta 0)
To github.com:johnmosesman/burner-repo.git
+ 728f0df...8bf04ea some-branch -> my-feature
如何将所有本地分支推到远程
你不需要经常从本地推送所有分支,但如果你这样做,你可以添加——all标志:
(main)$ git branch
* main
my-feature
(main)$ git push --all
...
To github.com:johnmosesman/burner-repo.git
b7f661f..6e36148 main -> main
* [new branch] my-feature -> my-feature