我一直在想是否有一种简单的方法来推拉具有不同名称的本地分支和远程分支,而不总是指定两个名称。

例如:

$ 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将遵循这些规则并推送到上游的集合。

其他回答

当你进行初始推送时,添加-u参数:

git push -u origin my_branch:remote_branch

后续的推送会去你想去的地方。

编辑:

根据评论,这只是建立了拉力。

git branch --set-upstream

应该这么做。

以下是对我行之有效的方法。

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

确定。只需将push.default设置为upstream,将分支推到它们的上行流(这与pull将从那里进行拉取相同,由branch.new .merge定义),而不是将分支推到名称匹配的分支(这是push.default的默认设置,matching)。

git config push.default upstream

请注意,在Git 1.7.4.2之前,这被称为跟踪而不是上游,所以如果您使用的是旧版本的Git,请使用跟踪。push.default选项是在Git 1.6.4中添加的,所以如果你使用的是较旧的版本,你根本就没有这个选项,需要显式地指定要推送的分支。

推送并创建一个临时远程分支

如果你想:

以新名称将当前分支推到远程,但是: 不更改当前分支的远程跟踪分支,并且: 不要用新名字创建本地分支,

其实很简单:

git push origin HEAD:temp-branch-name

注意:您可以将HEAD替换为任何其他分支或提交ID。